一、生成器
在Python中使用了yield 的函数被称为生成器(generator)。
当一个列表中包含大量元素时,如果一次性生成元素并保存在列表中,将占用大量的内存空间,对于这个问题,我们可以通过生成器(generator)来解决,即根据需要进行计算并获取列表中某个元素的值。 |
---|
对于生成器对象,也可以向其他迭代对象一样使用for循环遍历对象中的每一个元素 |
将列表生成表达式中的一对中括号改为小括号即可得到生成器
1.g=(x*x for x in range(10)) print(“g的类型为:”,type(g) for i in g: print(i,end=" ") |
---|
g的类型为:<class"generator"> 0 1 49 16 25 36 49 64 81 |
复杂元素
如果生成元素的方法比较负载,不适合用for循环方式实现,我们还可以借助yield关键字利用函数实现生成器的功能。例:实现faclist 函数,一次生成1的阶乘、2的阶乘……n的阶乘 |
---|
def faclist(n): #定义函数faclist result = 1 for i in range(2,n+1): #在2到n范围内一次取值 yield result #遇到yield即暂停执行并返回result, 下次执行时继续从此处开始执行 result *= i #将i乘到result上 for i in faclist(10): #遍历faclist并输出每个元素的值 print(i,end=’’) | 结果是:1 2 6 24 120 720 5040 40320 362880 |
使用yield 实现斐波那契数列
import sys
def fibonacci(n):
a, b, counter = 0, 1, 0
while True:
if(counter > n):
return n
yield a
a, b = b, a+b
counter += 1
f = fibonacci(10)
while True:
try:
print(next(f),end=" ")
except StopIteration:
sys.exit()
二、迭代器
1.1迭代器(Iteratior)
是指可以通过next函数不断获取下一个值得对象
- 可直接使用
for 循环遍历的对象统称为可迭代对象(Iterable)。并不是所有可迭代对象都是迭代器。 - 可以使用
isinstance 方法判断一个对象是否是可迭代对象或迭代器。
例:
字符串、列表或元组对象都可用于创建迭代器:
1、list = [1,2,3] 2、it = iter(list) 3、print(next(it)) -------1 4、print(next(it)) -------2 5、for x in it: ???????????print(x,end="") ----------------1 2 3
例:
1、from collection.abc import Iterable,Iterator #导入Iterable和Iterator类型 2、Is= [1,2,3,4,5] #创建一个列表对象 3、g = (x for x in range(1,6)) #创建一个生成器 4、print(“Is是可迭代对象:”,isinstance(Is,Iterable)) #True 5、print(“g是可迭代对象:”,isinstance(Is,Iterable)) #True 6、print(“Is是可迭代对象:”,isinstance(Is,Iterator)) #False 7、print(“g是可迭代对象:”,isinstance(Is,Iterator)) #True |
---|
1.2 iter函数
对于迭代对象,可以通过iter函数得到迭代器。
1、from cllections.abc import Iterator #导入Iterator类型 2\Is = [1,2,3,4,5] #创建一个可迭代对象 3\it=iter(Is) #利用iter函数获取Is的迭代器 4、print(“it是迭代器:”,isinstance(it,Iterator)) |
---|
it是迭代器:True |
1.3 next函数
对于迭代器,则可以使用它next 函数不断获取下一个元素,当所有元素都获取完毕再调用next 函数,就会引发StopIteration
1、g = (x for x in range(1,3)) #创建一个生成器 2、print(“第一个元素:”,next(g)) 3、print(“第2个元素:”,next(g)) 4、#print(“第三个匀速:”,next(g)) #取消前面的注释则会引发StopIteration 异常 |
---|
第一个元素:1 第二个元素:2 |
处理StopIteration异常
import sys
g = (x for x in range (1,3))
while True:
try:
print(next(g))
except StopIteration:
sys.exit()
1.4自定义迭代器
from collections.abc import Iterator
class Faslist:
def __init__(self):
self.n = 1
self.fac = 1
def __next__(self):
self.fac *=self.n
self.n += 1
return self.fac
def __iter__(self):
return self
if __name__ == "__main__":
facs = Faclist()
print("facs是迭代器:",isinstance(face,Iterator))
for i in range(1,6):
print("第%个元素:"%i.next(face))
|