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

生成器

时间:2019-06-21 09:36:14      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:code   出现   pre   python   优点   生成   迭代   list   返回   

1.生成器

1.生成器本质就是迭代器,Python社区生成器与迭代器是相同的
唯一区别:生成器是我们用Python代码构建的

2.生成器产生方式

  • 生成器函数
  • 生成器表达式
  • 一些内置函数返回一个生成器

3.生成器函数

只要函数中出现了yield那么它就是生成器函数
def func():
    print(111)
    yield 2
    print(111)
    yield 3
    print(111)
    yield 
    print(111)
    yield 5
ret = func()  # 生成器对象
print(ret)  # <generator object func at 0x0000000001E10F68>
print(next(ret))   #一个next对应一个yield

4.yield与return的区别

return   结束函数,给函数的执行者返回值
yield    不结束函数,对应着给next返回值
#多个值皆通过元祖的形式返回

5.生成器举例

def eat_baozi_gen():
    for i in range(1,2001):
        yield f'{i}号包子'
ret1 = eat_baozi_gen()
print(next(ret1))
print(next(ret1))
...
for i in range(200):
    print(next(ret))
for i in range(200):
    print(next(ret))

6.yield from

将一个可迭代对象的每一个元素返回给next
节省代码,提升效率(代替了for循环)
def func():
    l1 = [1, 2, 3]
    yield l1
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))

7.列表推导式

l1 = []
for i in range(1,101):
    l1.append(i)
print(l1)
列表推导式:一行代码构建一个有规律比较复杂的列表
l1 = [i for i in range(1, 101)]
print(l1)
构建方式:
1.循环模式:[变量(加工后的变量) for 变量 in iterable]
将10以内所有整数的平方写入列表
          print([i**2 for i in range(1, 11)])
100以内所有的偶数写入列表
          print([i for i in range(2, 101, 2)])
从python1期到python100期写入列表
          print([f'python{i}期' for i in range(1, 101)])
2.筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
三十以内可以被三整除的数。
          print([i for i in range(1, 31) if i % 3 == 0])      
优点:简单快捷    
缺点:可读性不高,不好排错

8.生成器表达式

与列表推导式相近  =>  循环模式,筛选模式
obj = (i for i in range(5))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
print(next(obj))
如何触发生成器(迭代器)取值
1.next(obj)
2.for循环
for i in obj:
   print(i)
3.数据转化
print(list(obj))
生成器节省内存

9.字典,集合推导式

与列表推导式相近  =>  循环模式,筛选模式
集合推导式
print({i for i in range(1, 101)})
字典推导式
{0: '小潘', 1: '怼怼哥', 2: '西门大官人'}
li = ['小潘', '蔡徐坤','西门大官人']
dic = {}
for index in range(len(li)):
    dic[index] = li[index]
print(dic)
print({i:l1[i] for i in range(len(li))})

生成器

标签:code   出现   pre   python   优点   生成   迭代   list   返回   

原文地址:https://www.cnblogs.com/wxl1025/p/11062481.html

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