Рубрики
Без рубрики

Краткая нарядка в ленивую оценку

Иметели и генераторы ключевой концепции, которая введена при обсуждении создания … помечена Python, Datascity, MachineLearning.

И генераторы и генераторы

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

Вот графический заимствованный из 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”