Python--核心2(生成器,迭代器,闭包,装饰器)之生成器

1、生成器函数

  1.概念spa

    在Python中, 一边循环一边计算的机制, 称为生成器: generator code

    建立生成器: G = ( x*2 for x in range(5)) 协程

    能够经过 next(生成器) 函数得到生成器的下一个返回值 对象

    没有更多的元素时, 抛出 StopIteration 的异常 blog

    生成器也能够使for 循环,由于生成器也是可迭代对象 generator

  2.生成器1 生成的第一种方式 it

list2 = [x for x in rang(10)]
print(type(list2))
#获得一个生成器对象
g = (x*2 for x in rang(10))
print(type(g))
#打印生成器生成第一个数字
peint(next(g))
peint(next(g))
peint(next(g))
一共10个数字,打印超出报StopIteration异常 

  3.生成器io

   3.1使用循环求斐波那契数列的第n个数for循环

def feibo(items):
    a, b, n = 1, 1, 3
    while n <=items:
        if items == 1 or items ==2:
            return 1
        else:
            a, b =b, a +b
            print(b,end=" ")
            n += 1
    return b
feibo(4)

   3.2生成器的第二种生成方式  yield

    函数中只要有yield关键字,这个函数就变成了生成器

def fibo(n):
    a = 1
    b = 1
    i = 3
    if n == 1 or n == 2:
        return 1
    while i <= n:
        a, b = b, a + b
        i += 1
        # 协程 让函数变成了生成器 至关于循环的暂停
        yield b
    return b
# 获得生成器对象
v = fibo(10)
# 用生成器的方式打印出来
print(next(v))
# 使用for循环遍历生成器
for x in v:
    print(x,end="\t")

  3.3 生成器 send()的用法 必须有一个参数

def test():
    i = 0
    while i < 5:
#赋值运算下次会被执行  yield会使程序停住
        temp = yield i
        print(temp)
        i += 1
g = test()
print("-----send----")
print(g.__next__())
print(next(g))
print(g.send("aaa"))
运行结果:
-----send---
0
None
1
aaa
2

 3.4 首次调用send()异常问题

  解决方案:

    1.首次调用使用__next__(),不使用send()

    2.或者首次使用send(None)

def test():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i += 1
g = test()
print("-----send----")
# 首次调用不传参或者传递非None参数都会致使异常
print(g.send())
print(g.send("aaa"))
相关文章
相关标签/搜索