python 生成器

Posted on 2019-09-10 17:18  S-skill  阅读(200)  评论(0)    收藏  举报
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__())

 

4. send的应用
# __next__()和send()的区别:
# __next__() 可以让生成器向下执行一次
# send() 也可以让生成器向下执行一次, 给上一个yield传一个值, 第一个不能用send(), 最后一个也不要传值.
def main():
    print('学习python')
    q = yield '加油!'
    print('send传的是一个值: ',q)
    w = yield '努力!'
    print('不能在第一个使用send: ',w)
    e = yield '不能放弃!'
    print('在最后也不要传值: ',e)
    r = yield '会报错的!'   # 不要把send里面的值传给最后一个yield前面的一个值,会报错的
    print(r)

g = main()        # 获取生成器
print(g.__next__())
print(g.send('对头'))
print(g.send('对头!'))
print(g.send('对对对!'))
print(g.send('报错'))  # 会报错(StopIteration)停止迭代

 

5. 生成器是可迭代的

def func():
    yield '一步步的'
    yield '加油'
    yield '努力'
    yield '相信自己能够成功!'

g = func()      # 生成器的本质是迭代器,迭代器是可迭代,生成器就是可迭代的
lst = list(g)   # 可迭代对象
print(lst)

 



博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3