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

Posted TiAmo_yu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python--核心2(生成器,迭代器,闭包,装饰器)之生成器相关的知识,希望对你有一定的参考价值。

一、生成器

  1.概念

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

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

    可以通过 next(生成器) 函数获得生成器的下一个返回值 

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

    生成器也可以使for 循环,因为生成器也是可迭代对象 

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

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.生成器

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

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"))

 

以上是关于Python--核心2(生成器,迭代器,闭包,装饰器)之生成器的主要内容,如果未能解决你的问题,请参考以下文章

Python核心编程的四大神兽:迭代器生成器闭包以及装饰器

Python概念之装饰器迭代器生成器

python装饰器迭代器生成器闭包等等

python中“生成器”“迭代器”“闭包”“装饰器”的深入理解

Python 函数对象生成器 装饰器迭代器闭包函数

Python学习之三大名器-装饰器迭代器生成器