赞
踩
一、迭代器:
任何实现了__iter__()和__next__()方法的对象都是迭代器。
其中,__iter__返回迭代器自身,__next__返回容器中的下一个元素值。
二、生成器:
具有yield关键字的函数都是生成器。
yield可以理解为特殊的return,该函数不会释放局部变量。
生成器自动实现了__iter__()和__next()__()方法,也就是说生成器也是迭代器。
调用生成器函数,将返回生成器对象,该生成器对象具有迭代器的所有功能。
三、自定义迭代器:
- class MyNumbersIterator:
- def __iter__(self):
- self.a = 1
- return self # 返回迭代器自身
-
- def __next__(self):
- x = self.a
- self.a += 1
- return x
-
-
- myclass = MyNumbersIterator()
- myiter = iter(myclass) # 通过调用myclass.__iter__()返回迭代器。
-
- print(next(myiter)) # 输出 1
- print(next(myiter)) # 输出 2
- print(next(myiter)) # 输出 3
- print(next(myiter)) # 输出 4
- print(next(myiter)) # 输出 5
四、自定义生成器:
使用场景,计算斐波那契数,后面的结果依赖于前面。
a = b;
b = a + b
- #!/usr/bin/python3
-
- import sys
-
-
- def fibonacci(n): # 生成器函数 - 斐波那契,返回n个斐波那契数
- a, b, counter = 0, 1, 1
- while counter <= n: # 生成n个
- yield a
- a, b = b, a + b # 返回一个斐波那契数,更新a,b,然后循环计算后面一个
- counter += 1
-
-
- f = fibonacci(10) # f 是一个生成器对象,但它同时具有迭代器的所有功能,因为其自动实现了迭代器协议
- while True:
- try:
- print(next(f), end=" ")
- except StopIteration:
- sys.exit()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。