生成器列表推导式生成器表达式
Posted banjh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成器列表推导式生成器表达式相关的知识,希望对你有一定的参考价值。
知识要点:
1、生成器
定义:就是自己用Python代码写的迭代器,生成器的本质就是迭代器。
可以用以下两种方法构建一个生成器:
1、通过生成器函数
2、生成器表达式
一、生成器函数: 我们之前学的一般的函数: def fun(x): x+=1 return x fun(5) # 函数名+()是函数的执行命令,并且接受函数的返回值。 生成器函数: def fun(x): x+=1 print(666) yield x x+=3 yield ‘alex‘ g=fun(5) #这个执行的结果是生成器的对象 print(g.__next__()) #每一个netx执行对应的yield上面的所有语句 print(g.__next__()) #一个next对应一个yield,写多了会报错 yield的作用:yield将值返回给:生成器对象.__next__()
yeild和return的不同
1、return结束函数,给函数执行者返回值
2、yield不会结束函数,一个next对应一个yield,给生成器对象.__next__()返回值。
生成器函数VS迭代器
区别一:自定制的区别 def fun(x): #可以制定制取得什么值 x+=5 yield x x+=3 yield x x+=1 yield x g=fun(3) print(g.__next__()) 区别二:内存级别的区别 1、迭代器是需要可迭代对象进行转化。可迭代对象非常占内存。 2、生成器直接创建,不需要转化,从本质就节省内存。 def fun(): for i in range(10000000): yield i g=fun() for j in range(50): #虽然有很多数,但是我只生成50个! print(g.__next__())
send 与 next
1、send与next一样,也是对生成器取值(执行一个yield)的方法
2、send可以给上一个yield传值
3、第一次取值永远都是next,不能使用send否则报错,因为send是第一个的话它无法找到第一个
4、最后一个yield永远得不到send的值
send可以给上一个yield传值: def fun(): count=yield 6 print(count) yield 7 yield 8 g=fun() next(g) g.send(‘alex‘) next(g) 最后一个yield永远得不到send的值 def fun(): count=yield 6 print(count) count1=yield 7 print(count1) yield 8 g=fun() next(g) g.send(‘alex‘) g.send(‘wusir‘)
二、生成器表达式,列表推导式
列表推导式:一行代码搞定你需要的任何列表
1、循环模式,变量(加工后的变量)for 变量 in iterable l=[i for i in range(100)] print(l) l2 = [‘python{}期‘.format(i) for i in range(1,16)] print(l2) 2、筛选模式,变量(加工后的变量)for 变量 in iterable if 条件 print([i for i in range(1,31) if i % 3 == 0]) print([i**2 for i in range(1,31) if i % 3 == 0])
列表推导式:
优点:一行解决,方便
缺点,不易排错,不能超过3次循环
列表推导式不能解决所有的列表的问题,所以不要太刻意使用
生成器表达式:将列表推导式的[] 换成()即可
g=(i for i in range(100000)) print(next(g)) print(next(g)) print(next(g)) 或者使用for循环取出需要的那一部分的值: g=(i for i in range(100000)) for j in range(20): print(next(g))
大数据使用生成器表达式
小数据使用列表生成器表达式
以上是关于生成器列表推导式生成器表达式的主要内容,如果未能解决你的问题,请参考以下文章