生成器与列表生成式

 什么是生成器 

  我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处是可以节省呢内存。如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫做生成器。

python中提供的生成器:

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行。

2.生成器表达式:类似于列表推到,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

用以下两种方式构建一个生成器:

  1. 通过生成器函数写

  2. 生成器表达式

#生成器函数:
def func1(x):
	x+=1
	yield x
g=func1(5)#生成器对象
g.__next__()#一个next对应一个yield,到yield停止
#yield将值返回给.__next__()

  

yield与return的区别

  • return结束函数,给函数的执行者返回值

  • yeild不会结束函数 ,一个next对应一个yield

生成器和迭代器的区别

  1. 内存级别的区别

    • 迭代器是需要可迭代对象进行转化。可迭代对象非常占内存

    • 生成器直接创建,不需要转化。从本质就节省内存

send 与next

def func1():
	print(1)
	count = yield 6
    print (count)
	print(2)
	yield 7
	print(3)
	yield 8
g = func1()
print(next(g))
print(g.send('alex'))
print(next(g))
#send 与 next一样,也是对生成器取值(执行一个yield)的方法。
#send 可以给上一个yield传一个值
#send的坑:1.第一个值永远是next 2.最后一个yield永远得不到send传的值

  

列表推到式,生成器表达式

一行代码几乎搞定你需要的任何的列表

  • 循环模式[变量(加工后的变量)for 变量 in iterable]

l = [i for i in range(1,101)]
print(l)

  筛选模式

l3 =[i for i in range(1,31)ifi%==0]

  

  • 列表推到式

    优点:一行解决,方便

    缺点:容易着迷,只能构建相对的列表 ,不易排错 不能超过三次循环,

生成器表达式:将列表表达式【】换成()

g = (i for i in range(100))
print(g)
print(next(g))

  

原文地址:https://www.cnblogs.com/buchiyudeyang/p/9505538.html