推导式:通过循环去判断、遍历数据,生成结果数据
语法:val for val in iterable
三种方式:
列表推导式[val for val in iterable]
字典推导式{a:b for a,b in iterable}
集合推导式{a for a in iterable}
生成器(函数)
概念:可以自定义逻辑的迭代器
区别与迭代器:
迭代器为内置的,生成器是自定义结构
生成器的创建两种方法:
(1)生成器表达式——区别于其他表达式:用()执行,(fuc(i) for i in iterable)
(2)生成器函数 (def定义,里面含有yield)
生成器方法yield区别于return ,yield执行完成后会继续执行函数中的其他内容
1、生成器表达式
gen = (i*2 for i in range(1,11)
2、生成器函数
def igen():
n = yield 1
n = yield 2
n = yield 3
gen = igen() # gen为迭代器,next调用或send传参
生成器的使用
1、next方法
result = gen.__next__()
#生成器对象的调用,每次调用将得到一个yield返回值,并暂停生成器函数(暂停yield表达式),下次next调用接着执行剩余的部分直到yield返回值
2、send方法
gen.send(None)
result = send(res)
# 具有next属性,区别是send(res)对生成器的上一次的yield进行赋值,必须第一次执行send(None),send方法作用是:改变生成器中yield的参数,以及后续yield的相关表达式
例:
def consumer(): n = yield "a" print("consunmer:%s" %n) n = yield "b" print("consunmer:%s" %n) n = yield "c" print("consunmer:%s" %n) n = yield "d" print("consunmer:%s" %n) # r = ' ' # while True: # n = yield r # if not n: # return # print('[CONSUMER]Consuming %s...' % n) # r = '200 OK' def producer(c): # next方法启动生成器 # c1 = c.__next__() # print(c1) # c2 = c.__next__() # print(c2) # send方法启动生成器 # res = c.send(None) # print("once:%s" %res) # n = 0 # while n < 3: # n = n + 1 # # print('[PRODUCER]Producing %s...' % n) # r = c.send(n) # # r = c.__next__() # print('[pro]consumer return: %s' % r) # c.close() if __name__ == '__main__': c = consumer() producer(c)