Включение множества
Никто не хочет оказаться обиженным, поэтому даже у множеств есть включения. Простейшая версия выглядит как включение списка или словаря, которые вы только что видели:
{ выражение for выражение in итерабельный объект}
Более длинные версии (проверки if, множественные операторы for) также доступны для множеств:
>>> a_set = {number for number in range(1,6) if number % 3 == 1}
>>> a_set
{1, 4}
Включение генератора
Для кортежей не существует включений. Вы могли подумать, что замена квадратных скобок у выделения списка на круглые создаст включение кортежа. Может даже показаться, что это работает, поскольку исключение не будет сгенерировано, если вы напишете следующее:
>>> number_thing = (number for number in range(1, 6))
В круглые скобки заключено включение генератора, оно возвращает объект генератора:
>>> type(number_thing)
Сами генераторы мы рассмотрим более детально позже в данной главе. Применение генераторов — это один из способов предоставить данные итератору.
Вы можете итерировать непосредственно по этому объекту генератора, как показано здесь:
>>> for number in number_thing:
…·····print(number)
…
1
2
3
4
5
Или же вы можете обернуть вызов list() вокруг включения генератора, чтобы заставить его работать как включение списка:
>>> number_list = list(number_thing)
>>> number_list
[1, 2, 3, 4, 5]
Генератор может быть запущен лишь однажды. Списки, множества и словари существуют в памяти, но генератор создает свои значения во время работы программы и выдает их по одному за раз через итератор. Он не запоминает их, поэтому вы не можете перезапустить или создать резервную копию генератора.
Если вы попробуете проитерировать по генератору заново, то обнаружите, что он истощен:
>>> try_again = list(number_thing)
>>> try_again
[]
Вы можете создать генератор из включения генератора, как мы сделали это здесь, или из
Функции
До этого момента все наши примеры кода представляли собой небольшие фрагменты. Они годятся для решения небольших задач, но никто не хочет набирать эти фрагменты раз за разом. Нам нужен какой-то способ организовать большой фрагмент кода в более удобные фрагменты.
Первый шаг к повторному использованию кода — это создание функций.
С функцией можно сделать две вещи:
•
•
Чтобы определить функцию, вам нужно написать def, имя функции, входные параметры, заключенные в скобки, и, наконец, двоеточие (:). Имена функций подчиняются тем же правилам, что и имена переменных (они должны начинаться с буквы или _ и содержать только буквы, цифры или _).
Давайте действовать пошагово. Сначала определим и вызовем функцию, которая не имеет параметров. Перед вами пример простейшей функции:
>>> def do_nothing():
…·····pass
Даже если функции не нужны параметры, вам все равно придется указать круглые скобки и двоеточие в ее определении. Следующую строку необходимо выделить пробелами точно так же, как если бы это был оператор if. Python требует использовать выражение pass, чтобы показать, что функция ничего не делает. Это эквивалентно утверждению «Эта страница специально оставлена пустой» (несмотря на то что теперь это не так).
Функцию можно вызвать, просто написав ее имя и скобки. Она сработает так, как я и обещал, вполне успешно не сделав ничего:
>>> do_nothing()
>>>
Теперь определим и вызовем другую функцию, которая не имеет параметров и выводит на экран одно слово:
>>> def make_a_sound():
…·····print('quack')
…
>>> make_a_sound()
quack
Когда вы вызываете функцию make_a_sound(), Python выполняет код, расположенный внутри ее описания. В этом случае он выводит одно слово и возвращает управление основной программе.
Попробуем написать функцию, которая не имеет параметров, но возвращает значение:
>>> def agree():
…····return True
…
Вы можете вызвать эту функцию и проверить возвращаемое ею значение с помощью if:
>>> if agree():