迭代器

- 迭代器

迭代器!=迭代对象
迭代对象:可以被遍历,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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值