迭代器说明&三元表达式
迭代器协议:一个对象必须提供next方法,执行该方法要么返回迭代中下一项,要么就引起一个StopLteration异常,以中指迭代。
迭代对象:对象内部定义一个__iter__()方法
for循环使用的迭代器的形式
str_1 = [1,2,3,4]
for i in str_1:
pring(i)
for的迭代方法如下:
1.iter_str = str_1.__iter__() 将str_1转换为一个迭代对象
2.iter_str.__next__()将迭代对象输出一个,但如果输出完成后会报错,但for循环会自动捕获这个异常进行处理,不会保存
yield用法(生成器):
a.yield在方法里可以使用多次,也可返回多个,且保存状态;
b.在方法里遇到yield则暂停,遇到__next__()才会执行下一个
def xiajd(): for i in range(100): yield '鸡蛋%s'%i alex = xiajd() jidan=alex.__next__() print(jidan)
输出:鸡蛋0
若再执行jidan = alex.__next__()
输出:鸡蛋1
yield好处:
1.节省空间
2.执行效率高,遇到yield则暂停,遇到__next__()继续执行则下面的代码
send:相当于__next__(),该方法后面必须跟参数,相当于把参数发给当前保留状态中的yield。
#生产者消费者模型 import time def xiaofei(name): print('%s开始吃包子'%name) while True: ret = yield time.sleep(1) print('%s正在吃%s包子'%(name,ret)) def product_baozi(): c1 = xiaofei('jack')#c1是个迭代对象 c2 = xiaofei('rose') c1.__next__() c2.__next__() for i in range(100): time.sleep(1) c1.send(i) c2.send(i) product_baozi()
三元表达式:
eg1:
name = 'jack'
res ='sb' if name=='jack' else '帅哥'
print(res)
eg2:
ll = ["鸡蛋%s"%i for i in range(10) if i >=5] #输出一个列表 print(ll)
列表比较占内存,所以将上面的列表转换成可迭代的对象放在内存中,节省空间。如鸡蛋&母鸡的关系
ll = ("鸡蛋%s"%i for i in range(10) if i >=5) #生成器表达式 print(ll)#输出为一个迭代器对象
浙公网安备 33010602011771号