第一部分:迭代器
例1. for....in 运行机制
li=[1,2,3,4]
# 在列表中取值从第一个取到最后一个结束
# for i in li:
# print(i) # 1,2,3,4
i=0
while i < len(li): # 索引
# print(i) # 输出索引 0,1,2,3
print(li[i]) # 取列表值
i+=1
print(i) # i=4的时候结束
运行截图:
例题2. 可迭对象
一个数据类型中包含__iter__魔术方法就被称为可迭对象
__iter__:确定你是一个可迭代对象、生成迭代器
li1=[1,2,3,4]
# print(dir(li1)) # 有__iter__
s=123
s1='123' # 可迭代
# print(dir(s)) # 没有__iter__,不可迭代
print(dir(s1)) # __iter__
运行截图:
例3. 迭代器:iter(可迭代对象),取值=next(迭代器),同时具备有__iter__、__next__这两个魔术方法被称为一个迭代器
生成迭代器的两种方法
1.通过iter()函数生成
2.通过__iter__魔术方法
li21=iter(li2) # 必须是可迭代对象才可以生成
# print('================================================')
# li21=li2.__iter__() # 跟上述作用一样的
print(dir(li21)) # 有__iter__' __next__
运行截图:
通过__next__方法取迭代器里面的值:当取完的时候会出现异常,可以写个对应异常
li21=iter(li2) # 必须是可迭代对象才可以生成
# print('================================================')
# li21=li2.__iter__() # 跟上述作用一样的
# print(dir(li21)) # 有__iter__' __next__
print(li21.__next__()) # 1 相当于在一个盒子里面逐一取值
print(li21.__next__()) # 2 [2,3,4]
print(li21.__next__()) # 3
print(li21.__next__()) # 4 []
print(li21.__next__()) # 取完了 ===StopIteration
# next是一个一个取值
# 与以上方法一样
# print(next(li21))
# print(next(li21))
# print(next(li21))
# print(next(li21))
运行截图:
例4. for 循环的实现原理
li3=[1,2,3,4]
li31=li3.__iter__()
# 写一个异常
try:
while True:
# print(next(li31))
var=next(li31)
print(var)
except StopIteration as e:
print(e)
同理以下写法:
def f(o):
li31=o.__iter__()
try:
while True:
print(next(li31))
except Exception:
pass
f(li3)
运行截图:
第二部分:生成器:
是一个函数,函数里面包含一个yield关键字
例1.生成器
def f(): print('第一次执行') yield 1 # 具备 return的返回值 # return 1 print('第二次执行') yield 2 print('第三次') l=f() # l:迭代器 # print(dir(l)) # __iter__,__next__ print(l) # yield:返回、暂停、等待(等待下次取值) print(next(l)) # 取值 print(next(l)) # 第二次取值 print(next(l)) # 第三次执行并抛出一个异常
运行截图:
例2.
def f2():
i=0
while i<5:
yield i
i+=1
j=0
l=f2()
try:
while j<5: # i和j实际上没什么关联
# l=f2() # 迭代器
print(next(l))
j+=1
except Exception:
pass
运行截图:
总结:
生成器,是Python提供的一种非常简便的语法 能让我们来自己写出迭代器;
注意:1. 生成器,是一种特殊的迭代器
2. 生成器指的是一个函数,返回的结果是一个迭代器
第三部分:模块(待续)
练习:
在一个模块中定义一个生成器, 这个生成器可以生成斐波拉契数列, 再另一个模块中使用这个生成器,得到斐波拉契数列
斐波那契数列:数列中每一个数的值都等于前两个数相加的值 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55.........]
方法1:通过函数的方式实现
def f(n): # n 为序列值
if n==1:
return 1
if n==2:
return 1
return f(n-2)+f(n-1)
# print(f(4))
li=[]
for i in range(1,10):
li.append(f(i))
运行截图:
方法2:通过生成器实现
# yield:返回、等待、暂停 # f() 为一个生成器 def f(max): # max:循环的次数 a=0 b=1 # 每个元素值 n=0 while n < max: yield b # 1 # 改变b的值 a,b=b,a+b # 第一次循环: a=1,b=1(因为是同时性这个时候的a还是0) # 第二次循环: a=1,b=2 # 第三次循环: a=2,b=3 # 第四次循环: a=3,b=5 # 第五次循环: n+=1 # 改变条件
li2=[] for i in f(10): li2.append(i) print(li2)
# f=f(5) # 调用一次就行了,不能像以下调用多次 # print(next(f)) # print(next(f)) # print(next(f)) # print(next(f)) # print(next(f))
# 以下形式不可以调用多次 # print(next(f(5))) # 如果传5进去,循环5次 # print(next(f(5))) # print(next(f(5))) # print(next(f(5))) # print(next(f(5)))
运行截图: