生成器、列表推导式、生成器表达式

知识要点:
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))
大数据使用生成器表达式
小数据使用列表生成器表达式
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/banjh/p/9512915.html