И генераторы и генераторы
Ключевая концепция, которая введена при обсуждении создания «генераторов», использует для
и в
к Итерация над генераторами (например, списки), но лениво по требованию . Это формально называется Ленивая оценка или «нужным», который задерживает оценку выражения, пока значение не будет необходимо. Мы можем думать об этом как об этом как форму оптимизации – избегая повторяющихся вызовов функций, когда не требуется.
Вот графический заимствованный из 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”