生成器与迭代器
迭代器
迭代器就像60000期免息(永远免息)一样,不用给利息,又能减少(内存)负担。
大多数容器对象都可以使用 for 语句:
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line, end='')
这种访问风格清晰、简洁又方便 其实就是迭代器循还 。
在幕后,for 语句会在容器对象上调用 iter()。 该函数返回一个定义了 __next__() 方法的迭代器对象,此方法将逐一访问容器中的元素。 当元素用尽时,__next__() 将引发 StopIteration 异常来通知终止 for 循环。 你可以使用 next() 内置函数来调用 __next__() 方法;这个例子显示了它的运作方式:
>>>
>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
next(it)
StopIteration
生成器
生成器就是自定义的迭代器,是一个用于创建迭代器的简单而强大的工具。 它们的写法类似标准的函数,但当它们要返回数据时会使用 [yield
] 语句。 每次对生成器调用 [next()
]时,它会从上次离开位置恢复执行(它会记住上次执行语句时的所有数据值)。
range就是一个典型的生成器,接下来我们手写一个顾头顾尾的myrange
def my_range(start, stop, step=1):
while start <= stop:
yield start
start += step
for i in my_range(1, 10):
print(i)
1
2
3
4
5
6
7
8
9
10