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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM