迭代器说明&三元表达式

迭代器协议:一个对象必须提供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)#输出为一个迭代器对象

 






posted @ 2022-01-12 19:30  菜鸟层  阅读(53)  评论(0)    收藏  举报