python3--生成器

# Auther: Aaron Fan"""生成器:只有在调用的时候才会生成相应的数据(调用到这个数据的时候才会生成这个数据,没有调用到时就没有这个数据)只记录数据的当前位置生成器不能像普通的列表同样,经过下标或者切片的方式去取生成器只能经过 循环 或者__next__()(2.x中用next())方法去取。"""# 建立生成器"""# 方法一:generator1 = ( i*i for i in range(10) )for i in generator1:    print(i)"""# 生成一个列表,保存一个计算20次的斐波那契数列:# 斐波那契数列:除第一个和第二个数外,任意一个数均可由前两个数相加获得。"""# 普通的方法,用一个函数实现:def fib(max):    n, a, b = 0, 0, 1    while n < max:        print(b)        a, b = b, a + b # 注意,赋值语句a, b = b, a + b                        # 至关于:                        # t = (b, a + b)    #t是一个tuple(元组)                        # a = t[0]                        # b = t[1]        n += 1    return 'done'fib(20)"""# 方法二:# 使用生成器,来生成一个斐波那契数列:def fib(max):    n, a, b = 0, 0, 1    while n < max:        yield b # 注意这里的区别        a, b = b, a + b # 注意,赋值语句a, b = b, a + b                        # 至关于:                        # t = (b, a + b)    #t是一个tuple(元组)                        # a = t[0]                        # b = t[1]        n += 1    # 这个函数由于使用了yield,它便不能再称之为函数,而应该称之为生成器    # 而这里的return的返回值,值返回给一个异常状态下的值    # 好比这里当全部数据都生成完成后,没有数据了,会返回这么一个异常:StopIteration: done,这个done是能够自定义的,就是经过下面的这个return    return 'done'fib_generator = fib(20)print(fib_generator)print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print(fib_generator.__next__())print('start fib_generator:')#for i in fib_generator: # 注意:前面由于已经使用next方法,取过几个数据了,因此这里直接从最后一次取值的地方开始循环#    print(i)while True:    try:        fib_value = fib_generator.__next__()        print("fib_value: %s" % fib_value)    except StopIteration as fibs:        print("Generator return value: %s " % fibs.value)        break
相关文章
相关标签/搜索