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

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

时间:2018-04-12 22:21:18      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:传递   div   迭代   tor   ext   gen   for循环   col   aaa   

一、生成器

  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(生成器,迭代器,闭包,装饰器)之生成器

标签:传递   div   迭代   tor   ext   gen   for循环   col   aaa   

原文地址:https://www.cnblogs.com/zhaopengyublogs/p/8798133.html

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