python迭代器、生成器

1、迭代器

#迭代器,有两个bif:1、iter():对一个容器对象调用iter()可以得到他的迭代器;2、next():迭代器返回下一个值
#两个魔法方法:__inter__()   __next__()

for each in 'luffy': #'luffy'为一个容器对象
    print(each)
'''===================================
l
u
f
f0
y
0
'''
dic={'luffy':'op',\
     'chopper':'doctor',\
     'zoro':'sword'}
for xyz in dic:
    print('%s -> %s'% (xyz,dic[xyz]))
    
'''===========================
luffy -> op
chopper -> doctor
zoro -> sword
'''
    
string='luffy' #容器对象
one=iter(string) #one即为一个迭代器
while True:
    try:
        each=next(one)
    except:
        print('迭代完毕')
        break
    print(each)
'''========================
l
u
f
f
y
迭代完毕
'''
'''
#使用魔法方法重写,可获得想要的效果
class Fibs: #斐波那契
    def __init__(self):
        self.a=0
        self.b=1
    def __inter__(self): #返回自身
        return self
    def __next__(self):
        self.a,self.b=self.b,self.a+self.b
        return self.a
fibs=Fibs()
for i in fibs:
    if i<20:
        print(i)
    else:
        break
'''

2、生成器

#===============生成器===================
#生成器其实是特殊的迭代器
def luffy():
    print('生成器')
    yield 1   #yield,相当于普通函数的return,但是retrun返回后函数结束,而yield返回后会使程序暂停
              #下一次执行时,会从下一步开始执行
    yield 2

onep=luffy()
print(next(onep)) #输出1,下一次执行从  yield 2  开始
print(next(onep)) #输出2,再次执行会报错

#=============for可以自动调用next方法,探测报错======

for i in luffy(): #容器对象为luffy(),不是onep()
    print(i) #全部输出

#==============生成器表达式=============
#生成器表达式和生成器函数都能够得到生成器对象
#列表推导式
x=[i for i in range(50) if not(i%3) and i%2] #输出0-50中能被3整除不能被2整除的数,当满足条件时,才能进入for循环。not(i%3)为真,且i%2为真(即余数不为0)
#for前面是要被输出的数
print(x) #[3, 9, 15, 21, 27, 33, 39, 45]

#字典推导式
y={i:i for i in range(9) if not(i%2)} 
print(y) #{0: 0, 2: 2, 4: 4, 6: 6, 8: 8}

z={i:i%2==0 for i in range(20)} #for前面为布尔类型,故输出为布尔类型
print(z)
'''
{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False,10: True, 11: False, 12: True, 13: False, 14: True, 15: False, 16: True, 17: False, 18: True, 19: False}
''''
#还有集合推导式,元组推导式等等 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值