在python中,生成器和函式很像,都是在執行的過程中才會去確定各種變數的值,所以在很多情況下,會導致各種各樣的問題。
def generator_te程式設計客棧st1():
# 0...9 ge
x = (i for i in range(10))
# 5..9 generator
x_filter = filter(lambda y: y >= 5, x)
# first use the x
l = list(x)
print("l, x", l)
# then use x_filter
l = list(x_filter)
print("l, x_filter", l)
if __name__ == "__main__":
generator_test1()
輸出結果為:
l, x [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
l, x_filter
上述**中,x_filter是基於生成器x構建的生成器,但是由於x在x_filter使用之前先被用掉了,所以在使用x_filter的時候,才去獲取x的值,而此時x已經用完了,最終導致x_filter轉化成的列表是空的。
def generator_test2():
x = (i for i in range(10))
for i in range(10):
x = (j + i for j in x)
l = list(x)
print("l, x", l)
if __name__ == "__main__":
generator_test2()
輸出結果:
l, x [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
上述**中,每次迴圈都基於原先的生成器構建乙個新的生成器,由於並未使用,所以生成器x中的i並沒有被賦值。在後面轉化成列表的時候才去獲www.cppcns.com取i的值,而此時由於i為9,所以所有的生成器x的i都為9,原始的x是0到9的生成器,接下來的10個生成器每個都在原始值上加9,導致每個值都增大了90。下面是此例的乙個變體:
def generator_test3():
x = (i for i in range(10))
for i in程式設計客棧 range(10):
x = (j + i for j in x)
i = 20
l = list(x)
print("l, x", l)
if __name__ == "__main__":
generator_test3()
輸出結果:
l, x [200, 201, 202, 203, 204, 205, 206, 207, 208, 209]
小談 python 生成器
生成器 迭代器的另一種操作,它能幹的事,list也都能幹,只不過在需要處理的序列比較大時,列表解析比較費記憶體。生成器表示式 通列表解析語法,只不過把列表解析的換成 例如 gen x 2 for x in range 5 gen at 0x0000000002fb7b40 for g in gen ...
Python的生成器Generator小結
一.生成器的介紹 在介紹生成器 generator 之前,我們首先需要熟悉列表生成式,列表生成式是python內建的簡單又強大的用來建立列表的生成式。舉個例子,如果我們想生成 1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9 9 比較笨的方法是 l for i in range 1...
python 生成器作用 Python生成器
生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...