python(day9)

1、生成器和生成器表达式
	本质就是一个迭代器
	三种生成办法:
		a、生成器函数
		注:生成器函数被执行,获取到的是生成器,而不是函数的执行
			def func():
			    print("jay")
			    yield "周杰伦" # 函数中包含了yield,当前函数为生成器函数
			    print("bubble")
			    yield "哈哈"
			g = func()  # 通过函数func()来创建一个生成器
			print(g.__next__())
			print(g.__next__())
		return:直接返回结果,结束函数调用
		yield:返回结果,让函数分段执行	
		
		b、生成器表达式
			(结果 for 变量 in 可迭代对象 if 条件)
	取值:1、__next__()
		 2、send(值)
			def eat():
			    print("我吃什么啊?")
			    a = yield "馒头"
			    print("a=",a)
			    b = yield "大饼"
			    print("b=",b)
			    c = yield "韭菜"
			    print("c=", c)
			    yield "GAME OVER"
			gen = eat()
			ret1 = gen.__next__()
			print(ret1)
			ret2 = gen.send("胡辣汤")
			print(ret2)
			ret3 = gen.send("狗粮")
			print(ret3)
			ret4 = gen.send("猫粮")
			print(ret4)
			# __next__():让生成器向下执行一次
			# send:让生成器向下执行一次,并给上一个yield传值,第一个和最后一个不能用
		c、数据转换
			生成器转换为列表
			def func():
			    yield 11
			    yield 22
			    yield 33
			g = func()
			li = list(g) # g可迭代对象
			print(li)

	
2、各种推倒式和生成器表达式
	列表推倒式:[结果(变量) for i in 可迭代对象 if 条件]
	生成器推倒式:(结果(变量) for i in 可迭代对象 if 条件)
	区别:列表比较消耗内存,一次性加载,生成器表达式几乎不占内存,使用时才分配
		 得到的值不一样,列表得到一个列表,生成器获得一个生成器
		 def func():
		    print(111)
		    yield 222
		g = func()  #生成器g
		g1 = (i for i in g)  #生成器g1 ,数据来源于g
		g2 = (i for i in g1)  #生成器g2 ,数据来源于g1
		print(list(g))   # 获取g中的数据,打印111,获取222
		print(list(g1))  # 获取g1中的数据,但是g中数据已经取完了,g1也就没有数据
		print(list(g2))
	
	字典推倒式:{结果(K:v) for i in 可迭代对象 if 条件}
		a、字典中key和value值互换
			dic = {'a':'1','b':'2'}
			new_dic = {dic[key]:key for key in dic}
			print(new_dic)
		b、li1[]和li2[]组成字典
			li1 = ['a','b','c','d']
			li2 = ['1','2','3','4']
			dic = {li1[i]:li2[i] for i in range(len(li1))}
			print(dic)
	集合推倒式(去重){结果(K:v) for i in 可迭代对象 if 条件}
		li = ['a','b','c','d','a','b','c','d']
		s = {i for i in li}
		print(s)
注:没有元组推倒式
def add(a,b):
    return a + b
def test():
    for i in range(4):
        yield i
g = test() # 0,1,2,3
for n in [2,10]:
    g = (add(n,i) for i in g)
    # g = (add(n,i) for i in (add(n,i) for i in test()))
print(list(g)) # 所有n都是10,都是最后一个元素
结果:[15, 16, 17, 18]
# m中[3,6,9]组成的列表
m = [[1,2,3],[4,5,6],[7,8,9]]
li = [i[2] for i in m]
print(li)   # 结果:[3,6,9]
m = [3,6,9]
li = [[x-2,x-1,x] for x in m]
print(li)   # 结果: [1,2,3],[4,5,6],[7,8,9]
# 求(x,y)其中x是0-5之间的偶数,y是奇数,组成的元组列表
li = [(x,y) for x in range(5) if x % 2 == 0\
      for y in range(5) if y % 2 ==1]
print(li)
x = {
    'name':'alex',
    'Values':[{'time':12763.232,'values':'100'},
        {'time':12333.232,'values':'200'},
        {'time':15433.232,'values':'700'},
        {'time':14263.232,'values':'800',}]
}
li = [[i['time'],i['values']] for i in x['Values'] ]
print(li)
结果:[[12763.232, '100'], [12333.232, '200'], [15433.232, '700'], [14263.232, '800']]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值