生成器与迭代器

生成器与迭代器

迭代器

迭代器就像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

 

posted @ 2020-08-23 11:12  阿伟啊啊啊啊  阅读(200)  评论(0编辑  收藏  举报