1 迭代器
1.1 定义
迭代器是指能用next(it)函数取值的对象(实例)
1.2 说明
1 用iter函数可返回一个可迭代对象的迭代器
2 迭代器是访问可迭代对象的一种方式
3 迭代器只能往前,不能后退
1.3 示例
L = [1,1,2,3,5,8] it = iter(L) for i in it: print(i) 执行结果: 1 1 2 3 5 8 next(it) |
L = [1,1,2,3,5,8] it = iter(L) # for i in it: # print(i,end=" ") print(next(it)) print(next(it)) print(next(it)) print(next(it)) print(next(it)) print(next(it)) print(next(it)) #此行抛出 StopIteration |
L = [1, 1, 2, 3, 5, 8] it = iter(L)
try: while True: print(next(it), end='\t') except StopIteration: print("取值结束") 执行结果 1 1 2 3 5 8 取值结束 |
2 函数
2.1 iter(x)
从一个对象x中返回一个迭代器,x必须是能提供一个迭代器的对象
2.2 next(it)
从it迭代器中获取下一个记录,如果无法获取下一条数据则对象触发StopIteration 异常
3 Generator生成器
Generator python2.5及以后的版本才有
3.1 定义
生成器是能够提供迭代器的对象(实例)#创建迭代器
3.2 生成器函数
含有yield语句的函数是生成器函数
注:yield 译 生成或产生
3.3 yeild语句
3.3.1 语法
yield表达式
3.3.2 说明
yield用于def函数中,目的是将此函数作为生成器函数使用
yield 用来生成数据,供迭代器next(it)函数调用
3.3.3 示例
示例1 def myyield(): yield 2 yield 3 yield 5 yield 7
print(myyield()) #打印一个生成器地址,换句话说此返回一个生成器对象 #生成器对象是可迭代的
it = iter(myyield()) try:
print(next(it)) except StopIteration: print("无下一个数值了") 执行结果 <generator object myyield at 0x7f0d1b6aaf68> 2 3 5 7 生成器函数调用结束 无下一个数值了
|
def myyield(): yield 2 yield 3 #下一句StopIteration异常的对象值,且以后的 #yield语句不会执行了,就此结束 return '朕执行后下面语句就不要执行了'
yield 7 print('生成器函数调用结束')
it = iter(myyield()) try: while True: print(next(it)) except StopIteration as st: print("捕捉到StopIteration异常") print(st) 执行结果 2 3
朕执行后下面语句就不要执行了 | |||
def myyield(): yield 2 yield 3 #下一句StopIteration异常的对象值,且以后的 #yield语句不会执行了,就此结束 return '朕执行后下面语句就不要执行了' yield 5 yield 7 print('生成器函数调用结束')
it = iter(myyield()) while True: print(next(it)) 执行结果: 2 3 Traceback (most recent call last): File "yield.py", line 17, in <module> print(next(it)) StopIteration: 朕执行后下面语句就不要执行了 | |||
def myrange(stop): i = 0 while True: if stop == i: break yield i i += 1
print(myrange(10))
for x in myrange(10): print(x)
执行结果: <generator object myrange at 0x7fcfc8127f68> 0 1 2 3 4 5 6 7 8 9
i = 0
def yieldName(): global i while True: if i == 10: break yield i i += 1
it = iter(yieldName()) print(next(it)) #0 print(next(it)) #1 print(next(it)) #2 print(next(it)) #3 '''前n个斐波那契数''' def fab(n): '''前n个斐波那契数''' x, a, b = 0, 0, 1 while n > x: yield b a, b = b, a + b x = x + 1
for i in fab(10): print(i) |
3.4 生成器的执行
当取下一个数时生成器才会产生下一个数,这就不用直接把所有的数生成出来放在一块等着来取了
3.5 生成器表达式
3.5.1 语法:
(表达式 for 变量 in 可迭代对象 [if 真值表达式])
注:if 子句可以省略
3.5.2 作用:
用推导式形式生成一个新的生成器(可迭代对象)
3.5.3 示例
>>>g = (x for x in range(10) if x%2==1)
>>> g
<generator object <genexpr> at0x7f77954b8bf8>
很像元组推导式
3.6 生成器函数和普通函数之间的不同
return语句:
普通函数到return直接返回
生成器函数中的return语句会触发StopIteration异常
执行流程的不同:
1普通函数调用到return语句直接返回,不在进入
2生成器函数遇到yield就返回,只能用next()函数值,每次调用next(it)时会再次进入生成器函数
3.7 生成器表达式
(表达式 for 变量 in可迭代对象)
此表达式用于返回一个迭代器
4 迭代工具函数
4.1 作用
是生成一个个性化的可迭代对象
4.2 zip(iter [,iter2[,····]])函数
返回一个zip对象,此对象用于生成一个元组,此元组的个数由最小的可迭代对象决定
numbers = [10086,10010,10000,95588] names = ['移动','电信','联通']
zip_obj = zip(numbers,names)
for no,name in zip_obj: print(name,"的客服电话",no) 执行结果 移动的客服电话 10086 电信的客服电话 10010 联通的客服电话 10000 |
numbers = [10086,10010,10000,95588] names = ['移动','电信','联通']
zip_obj = zip(numbers,names)
for no,name in zip_obj: print(name,"的客服电话",no)
#zip案例1 应用与生成字典 d = dict(zip(numbers,names)) print(d) 执行结果 移动的客服电话 10086 电信的客服电话 10010 联通的客服电话 10000 {10000: '联通', 10010: '电信', 10086: '移动'} |
4.3 enumerate(iterabel[,start])函数
4.3.1 作用
生成带索引的迭代器,返回的迭代类型为索引-值对(index-value)对,默认索引从零开始,也可以用start指定
4.3.2 示例
for no, n in enumerate(names,1): print('第', no, '号人物', n) 执行结果 第 1 号人物张飞 第 2 号人物关羽 第 3 号人物孔明 |