码迷,mamicode.com
首页 > 编程语言 > 详细

python 生成器

时间:2019-09-10 17:46:10      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:创建   函数   结果   color   生成   font   机制   筛选   包含   

1. 生成器和生成器函数
生成器的本质就是迭代器
生成器的三种创建办法;
1. 通过生成器函数
2. 通过生成器表达式创建出生成器
3. 通过数据转换
生成器函数:
函数包含了yield的就是生成器函数
注意:生成器函数被执行,获取的是生成器(迭代器),而不是函数的执行
生成器表达式:
(结果(变量) for 变量 in 可迭代的对象 筛选) 没有元祖推倒式
取值:
1. __next__()
2. send(值) 给上一个yield位置传一个值, 第一个和最后一个yield不用传值
3. 可以for循环
4. list(g(生成器))
生成器的特点:
1. 节省内存
2. 惰性机制
3. 只能往前



1. 生成器的简单应用
def func():
    print(最近变帅呢?)
    yield 没有      # 有yield的函数是生成器
    print(知道知道)       # 最后一个yield之后如果在进行__next__() 会报错

it = func()     # it 是生成器
print(it.__next__())     # it(生成器)的本质是迭代器,可以当迭代器使用


# return和yield的区别:
# return 直接返回结果, 结束函数的调用
# yield 返回结果, 可以让函数分段执行

 

2. 使用生成器的三种方法:

def func():
    yield 最近天气有点热
    yield 没毛病
    yield 你们的作业还没写完呢?
    yield 下个月,准备吃草了!
    print(12)

g = func()  # 拿到的是生成器,生成器的本质是迭代器,迭代器可以被迭代,生成器可以直接for循环

# 方法一:
for i in g:
    print(i)  # 本质上执行的是__next__(),函数里面的yield的有多少就打印多少

# 方法二:
print(g.__next__())  # 把生成器当迭代器使用,打印yield后面的内容
print(g.__next__())
print(g.__next__())
print(g.__next__())

it = g.__iter__()   # 把生成器转换成迭代器
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())      # 报错

# 方法三:
# 用异常处理
it = g.__iter__()
while True:
    try:
        print(it.__next__())    # 把函数里面的内容打印完
    except StopIteration:
        break

 

3. 可以相当于迭代器使用

def func():
    num = 1
    while num < 50:
        yield 第%d名 % num
        num += 1

g = func()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())

 














python 生成器

标签:创建   函数   结果   color   生成   font   机制   筛选   包含   

原文地址:https://www.cnblogs.com/Pengdachui-1/p/11498548.html

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