(Functional Programming 04) Generators
SoloLearn Python 번역
Generators
are a type of iterable, like lists or tuples.Generator
는 리스트나 튜플과 같은 iterable 타입이다.
- Unlike lists, they don’t allow indexing with arbitrary indices, but they can still be iterated through with
for
loops.- 리스트와 달리, 임의의 색인을 사용해서 인덱싱 할 수 없지만,
for
loop를 사용해서 반복할 수 있다.
- 리스트와 달리, 임의의 색인을 사용해서 인덱싱 할 수 없지만,
- They can be created using functions and the
yield
statement.- 함수와
yield
문을 사용해서 생성할 수 있다.
- 함수와
def countdown():
i = 5
while i > 0:
yield i
i -= i
for i in countdown():
print(i)
# 5
# 4
# 3
# 2
# 1
The
yield
statement is used to define a generator, replacing the return of a function to provide a result to its caller without destroying local variables.
yield
문은 generator를 정의하는 데 사용된다.함수의 반환을 대체해서 로컬 변수를 파괴하지 않고 호출자에게 결과를 제공한다.
- Due to the fact that they
yield
one item at a time, generators don’t have the memory restrictions of lists.- 한 번에 하나의 item을
yield
한다는 사실 때문에, generator는 리스트의 메모리 제한이 없다.
- 한 번에 하나의 item을
- In fact, they can be infinite.
- 사실 무한할 수 있다.
def infinite_sevens():
while True:
yield 7
for i in infinite_sevens():
print(i)
# 7
# 7
# ...
In short,
generators
allow you to declare a function that behaves like an iterator, i.e. it can be used in afor
loop.간단히 말해,
generator
를 사용하면 반복자처럼 동작하는 함수, 즉for
loop에서 사용할 수 있는 함수를 선언할 수 있다.
- Finite generators can be converted into lists by passing them as arguments to the
list
function.- 유한 generator는,
list
함수에 인수로 전달해서 리스트로 변환될 수 있다.
- 유한 generator는,
def numbers(x):
for i in range(x):
if i % 2 == 0:
yield i
print(list(numbers[11]))
# [0, 2, 4, 6, 8, 10]
Using
generators
results in improved performance, which is the result of the lazy (on demand) generation of values, which translates to lower memory usage.
generator
를 사용하면 성능이 향상된다.이는 값을 느리게(사용자의 요구에 따라 필요한 정보를 제공) 생성해서 메모리 사용량을 줄인다.
Furthermore, we do not need to wait until all the elements have been generated before we start to use them.
또한, 사용하기 전에 모든 엘리먼트가 생성될 때까지 기다릴 필요가 없다.
QUIZ
- What statement is used in functions to turn them into generators?
- 함수에서 generator로 변경하는 데 사용되는 명령문은 무엇인가?
yield
- Fill in the blanks to create a prime number generator, that yields all prime numbers in a loop. (Consider having an is_prime function already defined)
- loop에서 모든 소수를 yield하는 소수 generator를 생성해라.
- (is_prime 함수가 이미 정의되어 있다)
def get_primes():
num = 2
while True:
if is_prime(num):
yield num
num += 1
- What is the result of this code?
- 이 코드의 결과는 무엇인가?
def make_word():
word = ""
for ch in "spam":
word += ch
yield word
print(list(make_word()))
['s', 'sp', 'spa', 'spam']