Основные тезисы
1. Итератор - это объект класса, предоставляющий как минимум два метода (не считая конструктора).:
__iter__()
вызывается один раз при создании итератора и возвращает сам объект итератора;__next__()
вызывается для предоставления значения следующей итерации и вызывает исключениеStopIteration
, когда итерация подходит к концу и заканчивается.
2. Оператор yield
может использоваться только внутри функций. Оператор yield
приостанавливает выполнение функции и заставляет функцию возвращать аргумент yield в качестве результата. Такую функцию нельзя вызвать обычным способом - ее единственное назначение - использовать в качестве генератора (т.е. В контексте, требующем серии значений, например в цикле for
).
3. Условное выражение - это выражение, построенное с использованием оператора if-else
. Например:
print(True if 0 >= 0 else False)
выводит True
.
4. Генерирование списка становится генератором при использовании его внутри круглых скобок (внутри квадратных скобок оно создает обычный список). Например:
for x in (el * 2 for el in range(5)):
print(x)
выводит 02468
.
4. лямбда-функция - это инструмент для создания анонимных функций. Например:
def foo(x, f):
return f(x)
print(foo(9, lambda x: x ** 0.5))
выводит 3.0
.
5. Функция map(fun, list)
создает копию аргумента list
и применяет функцию fun
ко всем его элементам, возвращающим генератор, который предоставляет новое содержимое списка элемент за элементом. Например:
short_list = ['mython', 'python', 'fell', 'on', 'the', 'floor']
new_list = list(map(lambda s: s.title(), short_list))
print(new_list)
выводит ['Mython', 'Python', 'Fell', 'On', 'The', 'Floor']
.
6. функция filter(fun, list)
создает копию тех элементов list
, которые заставляют функцию fun
вернуть True
. Результатом функции является генератор, возвращающий новый список элемент за элементом. Например:
short_list = [1, "Python", -1, "Monty"]
new_list = list(filter(lambda s: isinstance(s, str), short_list))
print(new_list)
выводит ['Python', 'Monty']
.
7. Замыкание - это метод, который позволяет сохранять значения, несмотря на то, что контекст, в котором они были созданы, больше не существует. Например:
def tag(tg):
tg2 = tg
tg2 = tg[0] + '/' + tg[1:]
def inner(str):
return tg + str + tg2
return inner
b_tag = tag('<b>')
print(b_tag('Monty Python'))
выводит <b>Monty Python</b>
Упражнение 1
Каков ожидаемый вывод следующего кода?
class Vowels:
def __init__(self):
self.vow = "aeiouy " # Yes, we know that y is not always considered a vowel.
self.pos = 0
def __iter__(self):
return self
def __next__(self):
if self.pos == len(self.vow):
raise StopIteration
self.pos += 1
return self.vow[self.pos - 1]
vowels = Vowels()
for v in vowels:
print(v, end=' ')
Упражнение 2
Напишите функцию лямбда, задав младший значащий бит ее целочисленного аргумента, и примените ее к функции map()
, чтобы получить строку 1 3 3 5
в консоли.
any_list = [1, 2, 3, 4]
even_list = # Complete the line here.
print(even_list)
Упражнение 3
Каков ожидаемый вывод следующего кода?
def replace_spaces(replacement='*'):
def new_replacement(text):
return text.replace(' ', replacement)
return new_replacement
stars = replace_spaces()
print(stars("And Now for Something Completely Different"))
Примечание
PEP 8, руководство по стилю для кода Python рекомендует не присваивать лямбда-выражения переменным, а определять их как функции.
Это означает, что лучше использовать оператор def
и избегать использования оператора присваивания, который связывает лямбда-выражение с идентификатором. Проанализируйте код ниже:
# Recommended:
def f(x): return 3*x
# Not recommended:
f = lambda x: 3*x
Привязка лямбда-выражений к идентификаторам обычно дублирует функционал оператора def
. С другой стороны, использование операторов def
генерирует больше строк кода.
Важно понимать, что реальность часто любит рисовать свои собственные сценарии, которые не обязательно соответствуют конвенциям или формальным рекомендациям. Решите Вы следовать им или нет, будет зависеть от многих вещей: Ваших предпочтений, других принятых соглашений, внутренних правил компании, совместимости с существующим кодом и т.д. Помните об этом.