게으른 평가에 대한 간략한 시도

Iterables 및 생성기



"제너레이터"생성에 대해 논의할 때 도입되는 핵심 개념은 forin를 사용하여 제너레이터(예: 목록)를 반복하지만 필요에 따라 느리게 반복하는 것입니다. 이것은 공식적으로 lazy evaluation 또는 값이 필요할 때까지 표현식 평가를 지연시키는 '필요에 따른 호출'이라고 합니다. 우리는 이것을 최적화의 한 형태로 생각할 수 있습니다. 필요하지 않을 때 반복되는 함수 호출을 피하는 것입니다.

다음은 Xiaoxu Gao에서 빌린 그래픽입니다. 그녀의 게시물here을 확인하세요.



일부 generators (맞춤형 함수/클래스)를 생성하지만 range() 와 중복된다는 점을 명심하십시오. 둘 다 지연 평가를 설명합니다.

# 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: <generator object natural_numbers at 0x7fb4d787b2e0>
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 함수인 range 를 사용하는 또 다른 예입니다. this generator 를 호출하더라도 반복할 때까지 아무 작업도 수행하지 않습니다.

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: <generator object <genexpr> 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)


마지막으로, 이 섹션은 generator 또는 list를 반복하고 valuesindices를 모두 얻으려는 경우 열거하는 또 다른 중요한 키워드를 제공합니다.

# 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


제 생각에는 파이썬 방식이 여기에서 훨씬 더 읽기 쉽습니다.







  • 좋은 웹페이지 즐겨찾기