码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-21 18:22:20      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:mat   生成   col   推导式   构建   style   级别   作用   返回   

知识要点:
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))
大数据使用生成器表达式
小数据使用列表生成器表达式
 
 
 
 
 
 
 
 
 

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

标签:mat   生成   col   推导式   构建   style   级别   作用   返回   

原文地址:https://www.cnblogs.com/banjh/p/9512915.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!