И генераторы и генераторы
Ключевая концепция, которая введена при обсуждении создания «генераторов», использует для и в к Итерация над генераторами (например, списки), но лениво по требованию . Это формально называется Ленивая оценка или «нужным», который задерживает оценку выражения, пока значение не будет необходимо. Мы можем думать об этом как об этом как форму оптимизации – избегая повторяющихся вызовов функций, когда не требуется.
Вот графический заимствованный из Xiaoxu Gao Проверьте ее пост здесь :
Мы создадим некоторые Генераторы (Индивидуальная функция/класс), но имейте в виду, что он будет избыточным с Диапазон () , оба из которых иллюстрируют ленивую оценку.
# Example 1: create natural_numbers() function that incrementally counts numbers
def natural_numbers():
"""returns 1, 2, 3, ..."""
n = 1
while True:
yield n
n += 1
# check it's type
type(natural_numbers()) # generator
# call it, you get:
natural_numbers()
# the point of lazy evaluation is that it won't do anything
# until you iterate over it (but avoid infinite loop with logic breaks)
for i in natural_numbers():
print(i)
if i == 37:
break
print("exit loop")
# result 1...37 exit loop
Вот еще один пример, используя Диапазон , встроенная функция Python, которая также использует Ленивая оценка Отказ Даже когда вы называете это Генератор , это не сделаю ничего, пока вы не будете повторять это Отказ
evens_below_30 = (i for i in range(30) if i % 2 == 0) # check its type - generator type(evens_below_30) # call it, you get:at 0x7fb4d70ef580> # calling it does nothing evens_below_30 # now iterate over it with for and in - now it does something # prints: 0, 2, 4, 6 ... 28 for i in evens_below_30: print(i)
Наконец, этот раздел поднимает еще одно важное ключевое слово перечислять Ибо когда мы хотим повторять Генератор или Список и получить оба значения и индексы :
# create list of names
names = ['Alice', 'Lebron', 'Kobe', 'Bob', 'Charles', 'Shaq', 'Kenny']
# Pythonic way
for i, name in enumerate(names):
print(f"index: {i}, name: {name}")
# NOT pythonic
for i in range(len(names)):
print(f"index: {i}, name: {names[i]}")
# Also NOT pythonic
i = 0
for name in names:
print(f"index {i} is {names[i]}")
i += 1
На мой взгляд, Питоновый путь здесь гораздо более читается.
- Понимание объектно-ориентированного программирования с утверждением
- Список Python и Numpy Array
- defaultdict
- Словари
- Настройка виртуальной среды
Оригинал: “https://dev.to/paulapivat/a-brief-foray-into-lazy-evaluation-30ep”