本文主要介紹python中的生成器函數(shù)s: list _ 2中的list _ 2 = [] for x append (x * * 2) print (list _ 2)列表生成器:我們可以通過列表生成器直接創(chuàng)建一個列表 但是 由于內存限制 列表容量肯定是有限的 而且 創(chuàng)建一個包含100萬個元素的列表 不僅占用大量的存儲空間 如果我們只需要訪問前幾個元素 后面大部分元素占用的空間都會被浪費掉 那么 如果列表元素可以按照某種算法計算出來 我們是否可以在循環(huán)的過程中連續(xù)計算后續(xù)元素呢?這樣 就不需要創(chuàng)建一個完整的列表 從而節(jié)省了大量空間 在python中 這種邊循環(huán)邊計算的機制被稱為生成器 有許多方法可以創(chuàng)建一個生成器 第一種方法非常簡單 只要你把一個列表生成器的[]改為 你就創(chuàng)建了一個生成器:代碼演示:list_1 = (x*2 for x in range(10))比較生成器和列表生成的代碼演示導入時間start _ time = time timelist _ 1 =(x * 2 for x in range(10))stop _ time = time 時間 打印(list_1)打印( list_1的運行時間是% s %(stop _ time-start _ time))start _ time = time . timelist _ 2 =[x * 2 for x in range(10)]stop _ time = time timeprint(list _ 2)print( list _ 2運行時為% s %(停止時間-開始時間)) 運行結果:生成器對象gen expr在0x0000011 facd1 : print(x)中x的生成器list _ 1 =(x * 2 for x in rang: a b c = 0 1 0而c sum: print(b)a b = b abc = 1 fib (6)仔細觀察 我們可以看到fib函數(shù)實際上定義了斐波那契數(shù)列的計算規(guī)則 可以從第一個元素開始計算任何后續(xù)的元素 這個邏輯其實和生成器很像 換句話說 上面的函數(shù)和生成器只有一步之遙 要將fib函數(shù)轉換為生成器 只需將print(b)更改為yi: a b c = 0 1 0 while c sum: # print(b)yield b #這里的代碼執(zhí)行會跳出這個函數(shù) 使用next將b的值返回給代碼 其中a b = b a b c = 1# print(fib(6)) #這里得到的是生成器p = fib (6) (下一步(p))打印(下一步(p))打印( 做點別的事情 )print(next(p))print(p(p))print(p . _ _ next _ _)第二種生成器生成方法是定義 如果一個函數(shù)定義包含yield關鍵字 那么這個函數(shù)就不再是一個普通的函數(shù) 而是一個生成器:f = fib(6)f generator object fib at 0x 104 f: a b c = 0 1 0而c sum:收益b a b = b a b c = 1返回 返回值只能傳遞給異常 g =纖維(3) 而tru: try: x =下一個(g)打印( ge: ; x)除了停止迭代作為:打印( 生成器返回值: ;: 1g: 1g echo 0-@ . c om2生成器返回valu:返回值只能傳遞給異常 獲取返回值的也可以通過yield達到單線程情況下并發(fā)操作的效果:next和_ __next__:作用相同 只是用法不同 它們既可以喚醒yield 也可以接收yield傳遞的值 send:還可以喚醒yield 接收yield傳遞的值 而且還可以喚醒yield 傳遞一個值# _ * _ coding: utf-8 _ * _ #來實現(xiàn)生成器并發(fā)操作 進口timedef consum:打印%s準備吃包子了! % nam:包子= yield print( 包子[%s]來了 被[%s]吃了! %(包子 姓名))def produc: c =消費者(姓名)c2 =消費者( b )c. _ _下一個_ c2 _ _ n:時間 睡眠(1)打印( 做了2個饅頭! c .發(fā)送(i) c2 .發(fā)送(i)制作人( 飛某人 )標簽:發(fā)電機功能,下面一起看看python中的生成器函數(shù)s: list _ 2中的list _ 2 = [] for x append (x * * 2) print (list _ 2)列表生成器:我們可以通過列表生成器直接創(chuàng)建一個列表 但是 由于內存限制 列表容量肯定是有限的 而且 創(chuàng)建一個包含100萬個元素的列表 不僅占用大量的存儲空間 如果我們只需要訪問前幾個元素 后面大部分元素占用的空間都會被浪費掉 那么 如果列表元素可以按照某種算法計算出來 我們是否可以在循環(huán)的過程中連續(xù)計算后續(xù)元素呢?這樣 就不需要創(chuàng)建一個完整的列表 從而節(jié)省了大量空間 在python中 這種邊循環(huán)邊計算的機制被稱為生成器 有許多方法可以創(chuàng)建一個生成器 第一種方法非常簡單 只要你把一個列表生成器的[]改為 你就創(chuàng)建了一個生成器:代碼演示:list_1 = (x*2 for x in range(10))比較生成器和列表生成的代碼演示導入時間start _ time = time timelist _ 1 =(x * 2 for x in range(10))stop _ time = time 時間 打印(list_1)打印( list_1的運行時間是% s %(stop _ time-start _ time))start _ time = time . timelist _ 2 =[x * 2 for x in range(10)]stop _ time = time timeprint(list _ 2)print( list _ 2運行時為% s %(停止時間-開始時間)) 運行結果:生成器對象gen expr在0x0000011 facd1 : print(x)中x的生成器list _ 1 =(x * 2 for x in rang: a b c = 0 1 0而c sum: print(b)a b = b abc = 1 fib (6)仔細觀察 我們可以看到fib函數(shù)實際上定義了斐波那契數(shù)列的計算規(guī)則 可以從第一個元素開始計算任何后續(xù)的元素 這個邏輯其實和生成器很像 換句話說 上面的函數(shù)和生成器只有一步之遙 要將fib函數(shù)轉換為生成器 只需將print(b)更改為yi: a b c = 0 1 0 while c sum: # print(b)yield b #這里的代碼執(zhí)行會跳出這個函數(shù) 使用next將b的值返回給代碼 其中a b = b a b c = 1# print(fib(6)) #這里得到的是生成器p = fib (6) (下一步(p))打印(下一步(p))打印( 做點別的事情 )print(next(p))print(p(p))print(p . _ _ next _ _)第二種生成器生成方法是定義 如果一個函數(shù)定義包含yield關鍵字 那么這個函數(shù)就不再是一個普通的函數(shù) 而是一個生成器:f = fib(6)f generator object fib at 0x 104 f: a b c = 0 1 0而c sum:收益b a b = b a b c = 1返回 返回值只能傳遞給異常 g =纖維(3) 而tru: try: x =下一個(g)打印( ge: ; x)除了停止迭代作為:打印( 生成器返回值: ;: 1g: 1g echo 0-@ . c om2生成器返回valu:返回值只能傳遞給異常 獲取返回值的也可以通過yield達到單線程情況下并發(fā)操作的效果:next和_ __next__:作用相同 只是用法不同 它們既可以喚醒yield 也可以接收yield傳遞的值 send:還可以喚醒yield 接收yield傳遞的值 而且還可以喚醒yield 傳遞一個值# _ * _ coding: utf-8 _ * _ #來實現(xiàn)生成器并發(fā)操作 進口timedef consum:打印%s準備吃包子了! % nam:包子= yield print( 包子[%s]來了 被[%s]吃了! %(包子 姓名))def produc: c =消費者(姓名)c2 =消費者( b )c. _ _下一個_ c2 _ _ n:時間 睡眠(1)打印( 做了2個饅頭! c .發(fā)送(i) c2 .發(fā)送(i)制作人( 飛某人 )標簽:發(fā)電機功能相關資訊。
了解更多python中的生成器函數(shù)s: list _ 2中的list _ 2 = [] for x append (x * * 2) print (list _ 2)列表生成器:我們可以通過列表生成器直接創(chuàng)建一個列表 但是 由于內存限制 列表容量肯定是有限的 而且 創(chuàng)建一個包含100萬個元素的列表 不僅占用大量的存儲空間 如果我們只需要訪問前幾個元素 后面大部分元素占用的空間都會被浪費掉 那么 如果列表元素可以按照某種算法計算出來 我們是否可以在循環(huán)的過程中連續(xù)計算后續(xù)元素呢?這樣 就不需要創(chuàng)建一個完整的列表 從而節(jié)省了大量空間 在python中 這種邊循環(huán)邊計算的機制被稱為生成器 有許多方法可以創(chuàng)建一個生成器 第一種方法非常簡單 只要你把一個列表生成器的[]改為 你就創(chuàng)建了一個生成器:代碼演示:list_1 = (x*2 for x in range(10))比較生成器和列表生成的代碼演示導入時間start _ time = time timelist _ 1 =(x * 2 for x in range(10))stop _ time = time 時間 打印(list_1)打印( list_1的運行時間是% s %(stop _ time-start _ time))start _ time = time . timelist _ 2 =[x * 2 for x in range(10)]stop _ time = time timeprint(list _ 2)print( list _ 2運行時為% s %(停止時間-開始時間)) 運行結果:生成器對象gen expr在0x0000011 facd1 : print(x)中x的生成器list _ 1 =(x * 2 for x in rang: a b c = 0 1 0而c sum: print(b)a b = b abc = 1 fib (6)仔細觀察 我們可以看到fib函數(shù)實際上定義了斐波那契數(shù)列的計算規(guī)則 可以從第一個元素開始計算任何后續(xù)的元素 這個邏輯其實和生成器很像 換句話說 上面的函數(shù)和生成器只有一步之遙 要將fib函數(shù)轉換為生成器 只需將print(b)更改為yi: a b c = 0 1 0 while c sum: # print(b)yield b #這里的代碼執(zhí)行會跳出這個函數(shù) 使用next將b的值返回給代碼 其中a b = b a b c = 1# print(fib(6)) #這里得到的是生成器p = fib (6) (下一步(p))打印(下一步(p))打印( 做點別的事情 )print(next(p))print(p(p))print(p . _ _ next _ _)第二種生成器生成方法是定義 如果一個函數(shù)定義包含yield關鍵字 那么這個函數(shù)就不再是一個普通的函數(shù) 而是一個生成器:f = fib(6)f generator object fib at 0x 104 f: a b c = 0 1 0而c sum:收益b a b = b a b c = 1返回 返回值只能傳遞給異常 g =纖維(3) 而tru: try: x =下一個(g)打印( ge: ; x)除了停止迭代作為:打印( 生成器返回值: ;: 1g: 1g echo 0-@ . c om2生成器返回valu:返回值只能傳遞給異常 獲取返回值的也可以通過yield達到單線程情況下并發(fā)操作的效果:next和_ __next__:作用相同 只是用法不同 它們既可以喚醒yield 也可以接收yield傳遞的值 send:還可以喚醒yield 接收yield傳遞的值 而且還可以喚醒yield 傳遞一個值# _ * _ coding: utf-8 _ * _ #來實現(xiàn)生成器并發(fā)操作 進口timedef consum:打印%s準備吃包子了! % nam:包子= yield print( 包子[%s]來了 被[%s]吃了! %(包子 姓名))def produc: c =消費者(姓名)c2 =消費者( b )c. _ _下一個_ c2 _ _ n:時間 睡眠(1)打印( 做了2個饅頭! c .發(fā)送(i) c2 .發(fā)送(i)制作人( 飛某人 )標簽:發(fā)電機功能相關內容請關注本站點。