- 迭代器
迭代器!=迭代对象
迭代对象:可以被遍历,print(dir())查看是否有__iter__的魔术方法来判断,序列类型以及散列类型,具备可生产迭代器的魔术方法
迭代器: 同时具备__iter__,__next__魔术方法
大型网站偏向使用迭代器,效率更高/性能更快
普通情况用for循环
i = 123 #不可迭代对象,无法变成迭代器,
li = [1,2,3,4]
li1 = li.__iter__()
li2 = iter(li)
print(dir(li2))
print(next(li2))
print(next(li2)) #需把上面的注释掉,否则无法拿取
print(li2.next()) #取第一个参数,按照顺序拿取
print(li2.next()) #取第二个参数
print(li2.next()) ##没有数据就会报错
#for循环的原理
li3 = iter(li) #先变成迭代器
#第一种方法
# print(next(li3))
# print(next(li3))
# print(next(li3))
# print(next(li3))
第二种方法:
#第二种方法,是for的底层原理,
try:
while True:
print(next(li3)) #数据拿完了会报错,需用异常捕获
except Exception as e:
pass
#思路:1:先变成迭代器,2: 条件循环取值,3:捕获异常
#for 循环
for i in li:
print(i)
生成器
目的:怎么自己搞一个可迭代对象
什么是生成器:一个函数里面具备yield关键字,生成迭代器
特性:yield暂停函数, yield返回对象(返回值)/取值,等待next的下一次执行
def f(): #这个函数为一个生成器,
print('第一次') #直接调用,无法打印内容
yield 1
print('第二次')
yield 2
print('第三次')
yield 3
m = f()
# print(dir(m)) #具备__next__,__iter__,m是一个迭代器
# next(m) #只打印一次,yield暂停以下
n1 = next(m) #返回对象
print(n1)
n2 = next(m) #等待next的下一次执行
print(n2)
#作业题目:返回斐波拉契数列,无穷经的结果,需要靠调用函数时提供循环值
def f(max):
a = 0
b = 1
i = 0
while i < max:
yield b
a, b = b, a+b # 需要同时进行,这样a+b的时候a是原来的值
i += 1
k = f(10)
t = []
for i in range(10):
t.append(next(k))
print(t)