Module (17%)
Section (100%)

Основные тезисы


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 генерирует больше строк кода.

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