手动迭代
对于迭代器和迭代对象,可以使用迭代工具,比如for循环,也可以自己手动迭代 手动迭代需要自己处理StopIteration异常
迭代器手动迭代
因为迭代器内置了__next__方法,调用next()就会自动调用__next__方法 (1)文件是一个迭代器
f=open("text.text")
try:
while True:
line=next(f)
print(line,end='')
except StopIteration:
pass
finally:
f.close()
(2)列表是一个可迭代对象,需要先调用iter函数生成一个迭代器
L=[1,2]
l=iter(L)
print(next(l))
print(next(l))
print(next(l))
运行结果:
1
2
Traceback (most recent call last):
File "/Users/jingsli/PycharmProjects/mocklearn/gernatorlearn/demo6.py", line 8, in <module>
print(next(l))
StopIteration
生成器
函数中只要出现了yield语句,就会将其转变成一个生成器,生成器只会在next调用时才会运行
def countdown(n):
print("Starting to count from ",n)
while n>0:
yield n
n-=1
print("done")
c=countdown(3)
print(next(c))
print("*"*20)
print(next(c))
print("*"*20)
print(next(c))
print("*"*20)
print(next(c))
运行结果:
Starting to count from 3
3
********************
2
********************
1
********************
done
Traceback (most recent call last):
File "/Users/jingsli/PycharmProjects/mocklearn/gernatorlearn/demo7.py", line 20, in <module>
print(next(c))
StopIteration
运行过程分析: c=countdown(3),只是将生成器赋值给一个变量,没有调用next,所以生成器不会运行 第一个next调用时,执行以下语句:
print("Starting to count from ",n)
while n>0:
yield n
遇到yield时,就返回n给调用的函数,生成器保存变量n的值 再次执行next时,从上次停止的地方再次执行,从n-=1处开始执行,到yield时再次将n的值返回
对于生成器,可以使用for循环,或者sum(),list()等可以访问迭代器中元素的函数
def frange(start,stop,increment):
x=start
while x<stop:
yield x
x+=increment
for n in frange(0,4,0.5):
print(n,end=' ')
print("\n")
print(list(frange(0,4,0.5)))
运行结果:
0 0.5 1.0 1.5 2.0 2.5 3.0 3.5
[0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5]
反转迭代器,迭代对象
内置的reserved函数可以实现反转 调用对象的__reversed__方法
L=[1,2,3,4]
for n in reversed(L):
print(n,end=' ')
运行结果:
4 3 2 1
enumerate,以索引-值对的形式迭代序列
迭代序列,又想记录索引
my_list=['a','b','c']
for index,value in enumerate(my_list):
print(index,value)
运行结果:
0 a
1 b
2 c
可以指定索引从某一个数字开始,比如1
my_list=["a","b","c"]
for index,value in enumerate(my_list,1):
print(index,value)
运行结果:
1 a
2 b
3 c
enumerate通常用来做计数器,或者行号
zip同时迭代多个序列
如果想要迭代的元素包含在多个序列中,可以使用zip函数来同时迭代多个序列
x=[1,5,3,2,6]
y=[3,4,6,8,0]
for x,y in zip(x,y):
print(x,y)
运行结果:
1 3
5 4
3 6
2 8
6 0
zip是一个生成器,元素是元组
使用zip生成一个dict
headers=["name","shares","price"]
values=["ACME",100,490.1]
dict1=dict(zip(headers,values))
print(dict1)
运行结果:
{'name': 'ACME', 'shares': 100, 'price': 490.1}
使用zip生成一个list
headers=["name","shares","price"]
values=["ACME",100,490.1]
l=list(zip(headers,values))
print(l)
运行结果:
[('name', 'ACME'), ('shares', 100), ('price', 490.1)]
|