python 生成器需注意的小問題

2022-09-26 18:15:08 字數 1410 閱讀 1542

在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,執行後返回...