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}
''''
#还有集合推导式,元组推导式等等