The problem
Two ways
What is yield
Usage
def foo():
do_taks1()
do_task2()
...
yield el1
yield el2
...
data = foo()
print data
>>> <generator object...
list(data)
>>> [el1, el2]
Common rules
def foo():
1/0
yield 42
data = foo()
# no exception
def get_ints(file_path):
f = open(file_path, 'r')
for line in f:
yield int(line)
f.close()
for n in get_ints('~/user_ids.txt'):
print n
def fib(a=1, b=2, limit=100):
for _ in xrange(limit):
a, b = b, a + b
yield b
list(fib())
>>> [3, 5, 8, ...]
def foo(limit=10):
i = 0
while True:
yield i
i += 1
if i > limit:
raise StopIteration()
How does iteration work in depth
iter([1, 2, 3]) <list iterator at 0x0000...
iter('foo bar baz') <iterator object...
iter({1, 2, 3}) <setiterator at 0x000...
iter(obj) the same is obj.__iter__()
[1, 2, 3].__iter__() <listiterator...
iter(1234567) TypeError: 'int' object is not iterable
Why need iter
How does Python iterate a generator
gen.next() 1
gen.next() 2
gen.next() 3
gen.next() StopIteration error
Why need manual iteration?
Вам ответят команда поддержки Хекслета или другие студенты.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт