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