Цикл for в одну строку

Как и большинство программистов, вы знаете, что после создания массива, вам нужно написать цикл для его обработки. С этим нет никаких проблем, но иногда нам не нужно использовать несколько строк для написания полного цикла for для одной простой задачи. К частью, Python это понимает и предоставляет замечательный инструмент для использования в таких ситуациях. Этот инструмент называется генератор списка (list comprehensions, списковое включение).

[vc_row][vc_column width=»1/3″ css=».vc_custom_1600070905017{background-color: #81d742 !important;}»][vc_icon icon_fontawesome=»fa fa-question-circle» color=»green» background_style=»rounded» size=»lg» align=»center»][vc_column_text]

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

[/vc_column_text][vc_btn title=»Python Форум Помощи» color=»mulled-wine» align=»center» i_icon_fontawesome=»fa fa-share-square-o» button_block=»true» add_icon=»true» link=»url:https%3A%2F%2Fitfy.org%2F||target:%20_blank|rel:nofollow»][/vc_column][vc_column width=»1/3″ css=».vc_custom_1600071246022{background-color: #eeee22 !important;}»][vc_icon icon_fontawesome=»fa fa-telegram» color=»sky» background_style=»rounded» size=»lg» align=»center»][vc_column_text]

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

[/vc_column_text][vc_row_inner][vc_column_inner width=»1/2″][vc_btn title=»Чат» color=»sky» align=»center» i_icon_fontawesome=»fa fa-comments» button_block=»true» add_icon=»true» link=»url:https%3A%2F%2Ftelegram.im%2F%40python_scripts%3Flang%3Dru||target:%20_blank|rel:nofollow»][/vc_column_inner][vc_column_inner width=»1/2″][vc_btn title=»Канал» color=»sky» align=»center» button_block=»true» link=»url:https%3A%2F%2Ftelegram.im%2F%40pip_install%3Flang%3Dru||target:%20_blank|rel:nofollow»][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=»1/3″ css=».vc_custom_1600071543031{background-color: #27cbf4 !important;}»][vc_icon icon_fontawesome=»fa fa-vk» color=»peacoc» background_style=»rounded» size=»lg» align=»center»][vc_column_text]

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

[/vc_column_text][vc_btn title=»Подписаться» color=»violet» align=»center» i_icon_fontawesome=»fa fa-vk» button_block=»true» add_icon=»true» link=»url:https%3A%2F%2Fvk.com%2Fopen_sourcecode||target:%20_blank|rel:nofollow»][/vc_column][/vc_row]window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ renderTo: ‘yandex_rtb_R-A-457373-16’, blockId: ‘R-A-457373-16’ })})

Что это за зверь?

Списковое включение (List comprehensions) – это списки, которые генерируются с циклом for внутри. Они очень распространены в Python и выглядят примерно следующим образом:

Python[thing for thing in list_of_things]1[thing for thing in list_of_things]

Возможно, вы еще сильнее запутались, так что сделаем шаг назад. Список содержит в себе множество вещей, но определяется между квадратными скобками. Скажем, мне нужно получить функцию, которая удваивает значения всех чисел в списке. Для начала, мне нужно создать список чисел.

Pythonmy_list = [21, 2, 93]1my_list = [21, 2, 93]

Теперь создадим функцию. Назовем ее list_doubler, так как это именно то, что она делает, и она будет принимать аргумент, который является списком, который мы будем удваивать.

Pythondef list_doubler(lst): doubled = [] for num in lst: doubled.append(num*2) return doubled12345def list_doubler(lst):    doubled = []    for num in lst:        doubled.append(num*2)    return doubled

Вызов этой функции даст нам новый список с удвоенными элементами.

Pythonmy_doubled_list = list_doubler(lst)1my_doubled_list = list_doubler(lst)

my_doubled_list теперь содержит значения 42, 4 и 186. Эта функция простая и делает то, что нам нужно простым способом, но это пять строк, учитывая определяющую строку. Также есть переменная, с которой мы ничего не делаем, кроме как добавляем и в конце возвращаем её.

Единственная часть функции, которая по-настоящему работает – это цикл for. Цикл for тоже мало что делает, просто умножает число на 2. Это идеальный кандидат для превращения в списковое включение.

Создание спискового включения

Давайте сохраним его как функцию, которую мы будем вызывать. Нам нужно только упростить тело функции. Так как списковое включение создает списки, а списки могут быть назначены к переменным, примем это во внимание и расположим списковое включение справа от doubled и продолжим.

Pythondoubled = [thing for thing in list_of_things]1doubled = [thing for thing in list_of_things]

Хорошо, теперь нам нужно заполнить правую сторону. Как и с нормальным циклом for, а правая часть списка выглядит именно так, нам нужно назвать элементы в нашем цикле. Сначала, назовем каждый объект, и мы также будем использовать переменную списка, которая будет передана.

Pythondoubled = [thing for num in lst]1doubled = [thing for num in lst]

Это не может работать в полной мере, так как элемент не является… элементом. В нашей изначальной функции мы выполнили num * 2, так что давайте сделаем это еще раз.

Pythondoubled = [num * 2 for num in lst]1doubled = [num * 2 for num in lst]

Все что находится перед циклом for точно внесено в список. Наконец, нам нужно вернуть наш новый список.

Pythondef list_doubler(lst): doubled = [num * 2 for num in lst] return doubled123def list_doubler(lst):    doubled = [num * 2 for num in lst]    return doubled

Запускаем нашу новую функцию.

Pythonmy_doubled_list = list_doubler([12, 4, 202])1my_doubled_list = list_doubler([12, 4, 202])

И да, my_doubled_list содержит ожидаемые значения 24, 8 и 404. Отлично, все работает! Но так как мы создаем и моментально возвращаем переменную, давайте просто применим списковое включение напрямую.

Pythondef list_doubler(lst): return [num * 2 for num in lst]12def list_doubler(lst):    return [num * 2 for num in lst]

Хорошо, отлично, но зачем мне это нужно?

Списковые включения (генератор списка, list comprehensions) отлично подходят для случаев, когда нам нужно сохранить немного места в коде. Они также удобны в случаях, когда вам просто нужно быстро обработать списки, чтобы сэкономить время над рутинной работой с этим списком.

Они также очень полезны, если вы хотите больше узнать о функциональном программировании, но эту тему мы обсудим в будущем.

Применяем условие if в список

Давайте сделаем новую функцию, которая будет давать только длинные слова из списка. Скажем, каждое слово, которое состоит более чем из 5 букв, будет считаться длинным. Для начала пропишем их вручную.

window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ renderTo: ‘yandex_rtb_R-A-457373-3’, blockId: ‘R-A-457373-3’ })})
Pythondef long_words(lst): words = [] for word in lst: if len(word) > 5: words.append(word) return words123456def long_words(lst):    words = []    for word in lst:        if len(word) > 5:           words.append(word)    return words
Мы создали переменную для хранения наших слов, применяем цикл над всеми словами в нашем списке, и проверяем длинну каждого слова. Если оно длиннее 5 букв, мы вносим слово в список, и затем, наконец, мы отсылаем список назад. Давайте попробуем.

long_words([‘blog’, ‘Treehouse’, ‘Python’, ‘hi’]) возвращает [‘Treehouse’, ‘Python’]. Это как раз то, чего мы и ожидали.

Хорошо, давайте перепишем это в списковое включение. Для начала, построим то, что мы и так знаем.

Pythondef long_words(lst): return [word for word in lst]12def long_words(lst):    return [word for word in lst]

Это возвращает нам все слова, не только те, которые длиннее 5 букв. Мы вносим условный оператор в конец цикла for.

Pythondef long_words(lst): return [word for word in lst if len(word) > 5]12def long_words(lst):    return [word for word in lst if len(word) > 5]

Итак, мы использовали всё то же условие if, но поместили его в конец спискового включения. Оно использует то же наименование переменной, которое мы используем для элементов в списке.

Хорошо, давайте опробуем эту версию long_words([‘list’, ‘comprehension’, ‘Treehouse’, ‘Ken’]) возвращает [‘comprehension’, ‘Treehouse’].

Примеры

1. Возводим в квадрат все числа от 1 до 9. Применяем функцию range.

Python[x**2 for x in range(10)]1[x**2 for x in range(10)]

Результат:

Python[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]1[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

2. Все цифры которые делятся на 5 без остатка, в диапазоне от 0 до 100.

Python[x for x in range(100) if x%5 == 0]1[x for x in range(100) if x%5 == 0]

Результат:

Python[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]1[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

window.yaContextCb.push(()=>{ Ya.Context.AdvManager.render({ renderTo: ‘yandex_rtb_R-A-457373-4’, blockId: ‘R-A-457373-4’ })})

3. Все цифры которые делятся на 3 и 6 без остатка, в диапазоне от 0 до 50.

Python[x for x in range(50) if x%3 == 0 and x%6 != 0]1[x for x in range(50) if x%3 == 0 and x%6 != 0]

Результат:

Python[3, 9, 15, 21, 27, 33, 39, 45]1[3, 9, 15, 21, 27, 33, 39, 45]

4. Первая буква из каждого слова предложения.

Pythonphrase = «Тестовое сообщение из мира Python для сообщества.»print([w[0] for w in phrase.split()])12phrase = «Тестовое сообщение из мира Python для сообщества.»print([w[0] for w in phrase.split()])

Результат:

Python[‘Т’, ‘с’, ‘и’, ‘м’, ‘P’, ‘д’, ‘с’]1[‘Т’, ‘с’, ‘и’, ‘м’, ‘P’, ‘д’, ‘с’]

5. Заменяем букву А в каждом слове на #.

Pythonphrase = «АБАЖУР, АБАЗИНСКИЙ, АБАЗИНЫ, АББАТ, АББАТИСА, АББАТСТВО»print(».join([letter if letter != ‘А’ else ‘#’ for letter in phrase]))12phrase = «АБАЖУР, АБАЗИНСКИЙ, АБАЗИНЫ, АББАТ, АББАТИСА, АББАТСТВО»print(».join([letter if letter != ‘А’ else ‘#’ for letter in phrase]))

Результат:

Python#Б#ЖУР, #Б#ЗИНСКИЙ, #Б#ЗИНЫ, #ББ#Т, #ББ#ТИС#, #ББ#ТСТВО1#Б#ЖУР, #Б#ЗИНСКИЙ, #Б#ЗИНЫ, #ББ#Т, #ББ#ТИС#, #ББ#ТСТВО

Итоги

Надеюсь это руководство помогло вам понять простой способ экономии кода , который вам нужно написать для получения конкретной готовой работы с вашими списками.

Старайтесь сохранять ваши списковые включения короткими, а условия if – простыми. Несложно разглядеть решение многих ваших проблем в списковых включениях и превратить их в огромный беспорядок.

Если это только распалило ваш аппетит, посмотрим, сможете ли вы разобраться со словарными включениями самостоятельно. Они используют конструкторы dict, {:} , но они довольно похожи. Вы также можете проработать установочные включения. Также ознакомьтесь с функциональным программированием в Python, если считаете себя готовым.

Больше примеров