python 生成器

Posted pengdachui-1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 生成器相关的知识,希望对你有一定的参考价值。

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 生成器的主要内容,如果未能解决你的问题,请参考以下文章

python有关生成器函数的问题

Python生成器

python函数-生成器

python生成器

Python生成器的问题

Python-生成器