# 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