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
相關文章
相關標籤/搜索