欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

函數(shù)生成器python,函數(shù)生成器desmos

Python生成器簡(jiǎn)介

Python 中的 yield 關(guān)鍵字鮮為人知,但是作用卻很大,正是因?yàn)橛辛藋ield,才有了Python生成器。

在尼瑪?shù)鹊貐^(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營(yíng)銷推廣,外貿(mào)網(wǎng)站制作,尼瑪網(wǎng)站建設(shè)費(fèi)用合理。

yield 是 Python 的關(guān)鍵字,它用于 從函數(shù)返回而不破壞其局部變量的狀態(tài) ,并且在調(diào)用該函數(shù)時(shí),從最后一個(gè) yield 語(yǔ)句開始執(zhí)行。任何包含 yield 關(guān)鍵字的函數(shù)都稱為生成器。

Python 中的 yield 關(guān)鍵字的作用類似于 Python 中的 return 語(yǔ)句,不同之處在于:

yield的優(yōu)點(diǎn)

yield的缺點(diǎn)

Python 可以使用 括號(hào)() 創(chuàng)建生成器

更多時(shí)候,我們使用 yield 關(guān)鍵字創(chuàng)建生成器

下面這個(gè)生成器,前4次調(diào)用它時(shí),返回的是0-3這幾個(gè)特殊值,第5次調(diào)用它時(shí)返回一個(gè)10-20之間的隨機(jī)整數(shù)。

更多時(shí)候,生成器可以返回?zé)o限的值。

注意 generator() 函數(shù)返回的是一個(gè)生成器對(duì)象,要想獲取它的值,可以像上面那樣在迭代器中取出它的值,我們也可以顯式的調(diào)用next函數(shù)獲取值。

Python | yield Keyword - GeeksforGeeks:

python生成器是怎么使用的

生成器(generator)概念

生成器不會(huì)把結(jié)果保存在一個(gè)系列中,而是保存生成器的狀態(tài),在每次進(jìn)行迭代時(shí)返回一個(gè)值,直到遇到StopIteration異常結(jié)束。

生成器語(yǔ)法

生成器表達(dá)式: 通列表解析語(yǔ)法,只不過(guò)把列表解析的[]換成()

生成器表達(dá)式能做的事情列表解析基本都能處理,只不過(guò)在需要處理的序列比較大時(shí),列表解析比較費(fèi)內(nèi)存。

Python

1

2

3

4

5

6

7

8

9

10

11

gen = (x**2 for x in range(5))

gen

generator object genexpr at 0x0000000002FB7B40

for g in gen:

... print(g, end='-')

...

0-1-4-9-16-

for x in [0,1,2,3,4,5]:

... print(x, end='-')

...

0-1-2-3-4-5-

生成器函數(shù): 在函數(shù)中如果出現(xiàn)了yield關(guān)鍵字,那么該函數(shù)就不再是普通函數(shù),而是生成器函數(shù)。

但是生成器函數(shù)可以生產(chǎn)一個(gè)無(wú)線的序列,這樣列表根本沒有辦法進(jìn)行處理。

yield 的作用就是把一個(gè)函數(shù)變成一個(gè) generator,帶有 yield 的函數(shù)不再是一個(gè)普通函數(shù),Python 解釋器會(huì)將其視為一個(gè) generator。

下面為一個(gè)可以無(wú)窮生產(chǎn)奇數(shù)的生成器函數(shù)。

Python

1

2

3

4

5

6

7

8

9

10

11

def odd():

n=1

while True:

yield n

n+=2

odd_num = odd()

count = 0

for o in odd_num:

if count =5: break

print(o)

count +=1

當(dāng)然通過(guò)手動(dòng)編寫迭代器可以實(shí)現(xiàn)類似的效果,只不過(guò)生成器更加直觀易懂

Python

1

2

3

4

5

6

7

8

9

10

11

class Iter:

def __init__(self):

self.start=-1

def __iter__(self):

return self

def __next__(self):

self.start +=2

return self.start

I = Iter()

for count in range(5):

print(next(I))

題外話: 生成器是包含有__iter()和next__()方法的,所以可以直接使用for來(lái)迭代,而沒有包含StopIteration的自編Iter來(lái)只能通過(guò)手動(dòng)循環(huán)來(lái)迭代。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

from collections import Iterable

from collections import Iterator

isinstance(odd_num, Iterable)

True

isinstance(odd_num, Iterator)

True

iter(odd_num) is odd_num

True

help(odd_num)

Help on generator object:

odd = class generator(object)

| Methods defined here:

|

| __iter__(self, /)

| Implement iter(self).

|

| __next__(self, /)

| Implement next(self).

......

看到上面的結(jié)果,現(xiàn)在你可以很有信心的按照Iterator的方式進(jìn)行循環(huán)了吧!

在 for 循環(huán)執(zhí)行時(shí),每次循環(huán)都會(huì)執(zhí)行 fab 函數(shù)內(nèi)部的代碼,執(zhí)行到 yield b 時(shí),fab 函數(shù)就返回一個(gè)迭代值,下次迭代時(shí),代碼從 yield b 的下一條語(yǔ)句繼續(xù)執(zhí)行,而函數(shù)的本地變量看起來(lái)和上次中斷執(zhí)行前是完全一樣的,于是函數(shù)繼續(xù)執(zhí)行,直到再次遇到 yield。看起來(lái)就好像一個(gè)函數(shù)在正常執(zhí)行的過(guò)程中被 yield 中斷了數(shù)次,每次中斷都會(huì)通過(guò) yield 返回當(dāng)前的迭代值。

yield 與 return

在一個(gè)生成器中,如果沒有return,則默認(rèn)執(zhí)行到函數(shù)完畢時(shí)返回StopIteration;

Python

1

2

3

4

5

6

7

8

9

10

11

def g1():

... yield 1

...

g=g1()

next(g) #第一次調(diào)用next(g)時(shí),會(huì)在執(zhí)行完yield語(yǔ)句后掛起,所以此時(shí)程序并沒有執(zhí)行結(jié)束。

1

next(g) #程序試圖從yield語(yǔ)句的下一條語(yǔ)句開始執(zhí)行,發(fā)現(xiàn)已經(jīng)到了結(jié)尾,所以拋出StopIteration異常。

Traceback (most recent call last):

File "stdin", line 1, in module

StopIteration

如果遇到return,如果在執(zhí)行過(guò)程中 return,則直接拋出 StopIteration 終止迭代。

Python

1

2

3

4

5

6

7

8

9

10

11

12

def g2():

... yield 'a'

... return

... yield 'b'

...

g=g2()

next(g) #程序停留在執(zhí)行完yield 'a'語(yǔ)句后的位置。

'a'

next(g) #程序發(fā)現(xiàn)下一條語(yǔ)句是return,所以拋出StopIteration異常,這樣yield 'b'語(yǔ)句永遠(yuǎn)也不會(huì)執(zhí)行。

Traceback (most recent call last):

File "stdin", line 1, in module

StopIteration

如果在return后返回一個(gè)值,那么這個(gè)值為StopIteration異常的說(shuō)明,不是程序的返回值。

生成器沒有辦法使用return來(lái)返回值。

Python

1

2

3

4

5

6

7

8

9

10

11

def g3():

... yield 'hello'

... return 'world'

...

g=g3()

next(g)

'hello'

next(g)

Traceback (most recent call last):

File "stdin", line 1, in module

StopIteration: world

生成器支持的方法

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

help(odd_num)

Help on generator object:

odd = class generator(object)

| Methods defined here:

......

| close(...)

| close() - raise GeneratorExit inside generator.

|

| send(...)

| send(arg) - send 'arg' into generator,

| return next yielded value or raise StopIteration.

|

| throw(...)

| throw(typ[,val[,tb]]) - raise exception in generator,

| return next yielded value or raise StopIteration.

......

close()

手動(dòng)關(guān)閉生成器函數(shù),后面的調(diào)用會(huì)直接返回StopIteration異常。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

def g4():

... yield 1

... yield 2

... yield 3

...

g=g4()

next(g)

1

g.close()

next(g) #關(guān)閉后,yield 2和yield 3語(yǔ)句將不再起作用

Traceback (most recent call last):

File "stdin", line 1, in module

StopIteration

send()

生成器函數(shù)最大的特點(diǎn)是可以接受外部傳入的一個(gè)變量,并根據(jù)變量?jī)?nèi)容計(jì)算結(jié)果后返回。

這是生成器函數(shù)最難理解的地方,也是最重要的地方,實(shí)現(xiàn)后面我會(huì)講到的協(xié)程就全靠它了。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

def gen():

value=0

while True:

receive=yield value

if receive=='e':

break

value = 'got: %s' % receive

g=gen()

print(g.send(None))

print(g.send('aaa'))

print(g.send(3))

print(g.send('e'))

執(zhí)行流程:

通過(guò)g.send(None)或者next(g)可以啟動(dòng)生成器函數(shù),并執(zhí)行到第一個(gè)yield語(yǔ)句結(jié)束的位置。此時(shí),執(zhí)行完了yield語(yǔ)句,但是沒有給receive賦值。yield value會(huì)輸出初始值0注意:在啟動(dòng)生成器函數(shù)時(shí)只能send(None),如果試圖輸入其它的值都會(huì)得到錯(cuò)誤提示信息。

通過(guò)g.send(‘a(chǎn)aa’),會(huì)傳入aaa,并賦值給receive,然后計(jì)算出value的值,并回到while頭部,執(zhí)行yield value語(yǔ)句有停止。此時(shí)yield value會(huì)輸出”got: aaa”,然后掛起。

通過(guò)g.send(3),會(huì)重復(fù)第2步,最后輸出結(jié)果為”got: 3″

當(dāng)我們g.send(‘e’)時(shí),程序會(huì)執(zhí)行break然后推出循環(huán),最后整個(gè)函數(shù)執(zhí)行完畢,所以會(huì)得到StopIteration異常。

最后的執(zhí)行結(jié)果如下:

Python

1

2

3

4

5

6

7

got: aaa

got: 3

Traceback (most recent call last):

File "h.py", line 14, in module

print(g.send('e'))

StopIteration

throw()

用來(lái)向生成器函數(shù)送入一個(gè)異常,可以結(jié)束系統(tǒng)定義的異常,或者自定義的異常。

throw()后直接跑出異常并結(jié)束程序,或者消耗掉一個(gè)yield,或者在沒有下一個(gè)yield的時(shí)候直接進(jìn)行到程序的結(jié)尾。

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

def gen():

while True:

try:

yield 'normal value'

yield 'normal value 2'

print('here')

except ValueError:

print('we got ValueError here')

except TypeError:

break

g=gen()

print(next(g))

print(g.throw(ValueError))

print(next(g))

print(g.throw(TypeError))

輸出結(jié)果為:

Python

1

2

3

4

5

6

7

8

normal value

we got ValueError here

normal value

normal value 2

Traceback (most recent call last):

File "h.py", line 15, in module

print(g.throw(TypeError))

StopIteration

解釋:

print(next(g)):會(huì)輸出normal value,并停留在yield ‘normal value 2’之前。

由于執(zhí)行了g.throw(ValueError),所以會(huì)跳過(guò)所有后續(xù)的try語(yǔ)句,也就是說(shuō)yield ‘normal value 2’不會(huì)被執(zhí)行,然后進(jìn)入到except語(yǔ)句,打印出we got ValueError here。然后再次進(jìn)入到while語(yǔ)句部分,消耗一個(gè)yield,所以會(huì)輸出normal value。

print(next(g)),會(huì)執(zhí)行yield ‘normal value 2’語(yǔ)句,并停留在執(zhí)行完該語(yǔ)句后的位置。

g.throw(TypeError):會(huì)跳出try語(yǔ)句,從而print(‘here’)不會(huì)被執(zhí)行,然后執(zhí)行break語(yǔ)句,跳出while循環(huán),然后到達(dá)程序結(jié)尾,所以跑出StopIteration異常。

下面給出一個(gè)綜合例子,用來(lái)把一個(gè)多維列表展開,或者說(shuō)扁平化多維列表)

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

def flatten(nested):

try:

#如果是字符串,那么手動(dòng)拋出TypeError。

if isinstance(nested, str):

raise TypeError

for sublist in nested:

#yield flatten(sublist)

for element in flatten(sublist):

#yield element

print('got:', element)

except TypeError:

#print('here')

yield nested

L=['aaadf',[1,2,3],2,4,[5,[6,[8,[9]],'ddf'],7]]

for num in flatten(L):

print(num)

如果理解起來(lái)有點(diǎn)困難,那么把print語(yǔ)句的注釋打開在進(jìn)行查看就比較明了了。

總結(jié)

按照鴨子模型理論,生成器就是一種迭代器,可以使用for進(jìn)行迭代。

第一次執(zhí)行next(generator)時(shí),會(huì)執(zhí)行完yield語(yǔ)句后程序進(jìn)行掛起,所有的參數(shù)和狀態(tài)會(huì)進(jìn)行保存。再一次執(zhí)行next(generator)時(shí),會(huì)從掛起的狀態(tài)開始往后執(zhí)行。在遇到程序的結(jié)尾或者遇到StopIteration時(shí),循環(huán)結(jié)束。

可以通過(guò)generator.send(arg)來(lái)傳入?yún)?shù),這是協(xié)程模型。

可以通過(guò)generator.throw(exception)來(lái)傳入一個(gè)異常。throw語(yǔ)句會(huì)消耗掉一個(gè)yield。可以通過(guò)generator.close()來(lái)手動(dòng)關(guān)閉生成器。

next()等價(jià)于send(None)

閑話python 45: 淺談生成器yield

生成器似乎并不是一個(gè)經(jīng)常被開發(fā)者討論的語(yǔ)法,因此也就沒有它的大兄弟迭代器那么著名。大家不討論它并不是說(shuō)大家都已經(jīng)對(duì)它熟悉到人盡皆知,與之相反,即使是工作多年的開發(fā)者可能對(duì)生成器的運(yùn)行過(guò)程還是知之甚少。這是什么原因?qū)е碌哪兀课也孪氪蟾庞幸韵聨c(diǎn)原因: (1)運(yùn)行流程不同尋常,(2)日常開發(fā)不需要,(3)常常將生成器與迭代器混淆。 生成器的運(yùn)行流程可以按照協(xié)程來(lái)理解,也就是說(shuō) 返回中間結(jié)果,斷點(diǎn)繼續(xù)運(yùn)行 。這與我們通常對(duì)于程序調(diào)用的理解稍有差異。這種運(yùn)行模式是針對(duì)什么樣的需求呢? 一般而言,生成器是應(yīng)用于大量磁盤資源的處理。 比如一個(gè)很大的文件,每次讀取一行,下一次讀取需要以上一次讀取的位置為基礎(chǔ)。下面就通過(guò)代碼演示具體看看生成器的運(yùn)行機(jī)制、使用方式以及與迭代器的比較。

什么是生成器?直接用文字描述可能太過(guò)抽象,倒不如先運(yùn)行一段代碼,分析這段代碼的運(yùn)行流程,然后總結(jié)出自己對(duì)生成器的理解。

從以上演示可以看出,這段代碼定義了一個(gè)函數(shù),這個(gè)函數(shù)除了yield這個(gè)關(guān)鍵字之外與一般函數(shù)并沒有差異,也就是說(shuō)生成器的魔法都是這個(gè)yield關(guān)鍵字引起的。 第一點(diǎn),函數(shù)的返回值是一個(gè)生成器對(duì)象。 上述代碼中,直接調(diào)用這個(gè)看似普通的函數(shù),然后將返回值打印出來(lái),發(fā)現(xiàn)返回值是一個(gè)對(duì)象,而并不是普通函數(shù)的返回值。 第二點(diǎn),可以使用next對(duì)這個(gè)生成器對(duì)象進(jìn)行操作 。生成器對(duì)象天然的可以被next函數(shù)調(diào)用,然后返回在yield關(guān)鍵字后面的內(nèi)容。 第三,再次調(diào)用next函數(shù)處理生成器對(duì)象,發(fā)現(xiàn)是從上次yield語(yǔ)句之后繼續(xù)運(yùn)行,直到下一個(gè)yield語(yǔ)句返回。

生成器的運(yùn)行流程確實(shí)詭異,下面還要演示一個(gè)生成器可以執(zhí)行的更加詭異的操作:運(yùn)行過(guò)程中向函數(shù)傳參。

返回生成器和next函數(shù)操作生成器已經(jīng)并不奇怪了,但是在函數(shù)運(yùn)行過(guò)程中向其傳參還是讓人驚呆了。 調(diào)用生成器的send函數(shù)傳入?yún)?shù),在函數(shù)內(nèi)使用yield語(yǔ)句的返回值接收,然后繼續(xù)運(yùn)行直到下一個(gè)yield語(yǔ)句返回。 以前實(shí)現(xiàn)這種運(yùn)行流程的方式是在函數(shù)中加上一個(gè)從控制臺(tái)獲取數(shù)據(jù)的指令,或者提前將參數(shù)傳入,但是現(xiàn)在不用了,send方式使得傳入的參數(shù)可以隨著讀取到的參數(shù)變化而變化。

很多的開發(fā)者比較容易混淆生成器和迭代器,而迭代器的運(yùn)行過(guò)程更加符合一般的程序調(diào)用運(yùn)行流程,因此從親進(jìn)度和使用熟悉度而言,大家對(duì)迭代器更有好感。比如下面演示一個(gè)對(duì)迭代器使用next方法進(jìn)行操作。

從以上演示來(lái)看,大家或許會(huì)認(rèn)為迭代器比生成器簡(jiǎn)單易用得太多了。不過(guò),如果你了解迭代器的實(shí)現(xiàn)機(jī)制,可能就不會(huì)這么早下結(jié)論了。python內(nèi)置了一些已經(jīng)實(shí)現(xiàn)了的迭代器使用確實(shí)方便,但是如果需要自己去寫一個(gè)迭代器呢?下面這段代碼就帶大家見識(shí)以下迭代器的實(shí)現(xiàn)。

在python中,能被next函數(shù)操作的對(duì)象一定帶有__next__函數(shù)的實(shí)現(xiàn),而能夠被迭代的對(duì)象有必須實(shí)現(xiàn)__iter__函數(shù)。看了這么一段操作,相信大家對(duì)迭代器實(shí)現(xiàn)的繁瑣也是深有體會(huì)了,那么生成器的實(shí)現(xiàn)是不是會(huì)讓你覺得更加簡(jiǎn)單易用呢?不過(guò)千萬(wàn)別產(chǎn)生一個(gè)誤區(qū),即生成器比迭代器簡(jiǎn)單就多用生成器。 在實(shí)際開發(fā)中,如果遇到與大量磁盤文件或者數(shù)據(jù)庫(kù)操作相關(guān)的倒是可以使用生成器。但是在其他的任務(wù)中使用生成器難免有炫技,并且使邏輯不清晰而導(dǎo)致可讀性下降的嫌疑。 這大概也能解釋生成器受冷落的原因。不過(guò)作為一個(gè)專業(yè)的開發(fā)者,熟悉語(yǔ)言特性是分內(nèi)之事。

到此,關(guān)于生成器的討論就結(jié)束了。本文的notebook版本文件在github上的cnbluegeek/notebook倉(cāng)庫(kù)中共享,歡迎感興趣的朋友前往下載。

Python中如何使生成器函數(shù)來(lái)用元組返回一個(gè)字符串大寫字母?jìng)€(gè)數(shù)和小寫字母?jìng)€(gè)數(shù)?

#如何使生成器函數(shù)來(lái)用元組返回一個(gè)字符串大寫字母?jìng)€(gè)數(shù)和小寫字母?jìng)€(gè)數(shù)

def getUorL(s):

# [A-Z]是匹配內(nèi)容,str是待匹配的對(duì)象

rtn = f"大寫字母?jìng)€(gè)數(shù): {len(re.findall('[A-Z]',s))}"

yield rtn

# [a-z]是匹配內(nèi)容,str_是待匹配的對(duì)象

rtn = f"小寫字母?jìng)€(gè)數(shù): {len(re.findall('[a-z]',s))}"

yield rtn

str = "10ABC23sD~45ffe67e;oo++"

#第一次返回大寫

g = getUorL(str)

print(next(g))

#第二次返回小寫

print(next(g))

Python 函數(shù) - 返回生成器

如果函數(shù)要返回一系列結(jié)果,我們常見的方法就是將結(jié)果放到一份列表中,然后返回給調(diào)用者。比如下面的函數(shù),返回字符串中每個(gè)單詞的首字母在真?zhèn)€字符串中的索引:

運(yùn)行結(jié)果:

上述的結(jié)果完全符合我們的預(yù)期,但 get_word_index 函數(shù)不夠簡(jiǎn)潔。下面我們嘗試使用生成器來(lái)實(shí)現(xiàn):

運(yùn)行結(jié)果:

改寫之后,不僅運(yùn)行結(jié)果符合要求,由于不需要和 result 列表交互,函數(shù)也變得非常簡(jiǎn)潔。下面我們就來(lái)詳細(xì)學(xué)習(xí)下生成器吧~

生成器是指使用 yield 表達(dá)式的函數(shù),調(diào)用生成器函數(shù)時(shí),它并不會(huì)真的運(yùn)行,而是會(huì)返回迭代器。每次在這個(gè)迭代器上面調(diào)用內(nèi)置的 next 函數(shù)時(shí),迭代器就會(huì)把生成器推進(jìn)到下一個(gè) yield 表達(dá)式那里。生成器傳給 yield 的值均會(huì)由迭代器返回給調(diào)用者。

此外,如果輸入量非常大,使用列表作為返回值,那么程序就有可能耗盡內(nèi)存并崩潰。相反,使用生成器之后,則可以應(yīng)對(duì)任意長(zhǎng)度的輸入數(shù)據(jù)。

例如,下面這個(gè)生成器函數(shù)可以獲取文件中單詞的索引,而不管文件內(nèi)容多大,該函數(shù)執(zhí)行時(shí)消耗的內(nèi)存,只由單行的文本長(zhǎng)度決定:

其中 test_generator.txt 中的內(nèi)容如下:

運(yùn)行結(jié)果:

下面這句話特別重要: 生成器函數(shù)返回的迭代器,是由狀態(tài)的,及調(diào)用者不應(yīng)該反復(fù)使用它 。我們那 word_index_iter 來(lái)說(shuō)明:

如果想重復(fù)調(diào)用,請(qǐng)將其封裝成容器:

運(yùn)行結(jié)果:

關(guān)于上述自定義容器的實(shí)現(xiàn)原理,我的另外一篇文章做了詳細(xì)介紹,鏈接奉上:

Python中生成器的理解?

9.10. 生成器

Generator 是創(chuàng)建迭代器的簡(jiǎn)單而強(qiáng)大的工具。它們寫起來(lái)就像是正規(guī)的函數(shù),需要返回?cái)?shù)據(jù)的時(shí)候使用 yield 語(yǔ)句。每次 next() 被調(diào)用時(shí),生成器回復(fù)它脫離的位置(它記憶語(yǔ)句最后一次執(zhí)行的位置和所有的數(shù)據(jù)值)。以下示例演示了生成器可以很簡(jiǎn)單的創(chuàng)建出來(lái):

前一節(jié)中描述了基于類的迭代器,它能作的每一件事生成器也能作到。因?yàn)樽詣?dòng)創(chuàng)建了 __iter__() 和 __next__() 方法,生成器顯得如此簡(jiǎn)潔。

另一個(gè)關(guān)鍵的功能在于兩次執(zhí)行之間,局部變量和執(zhí)行狀態(tài)都自動(dòng)的保存下來(lái)。這使函數(shù)很容易寫,而且比使用 self.index 和 self.data 之類的方式更清晰。

除了創(chuàng)建和保存程序狀態(tài)的自動(dòng)方法,當(dāng)發(fā)生器終結(jié)時(shí),還會(huì)自動(dòng)拋出 StopIteration 異常。綜上所述,這些功能使得編寫一個(gè)正規(guī)函數(shù)成為創(chuàng)建迭代器的最簡(jiǎn)單方法。

Generator 是創(chuàng)建迭代器的簡(jiǎn)單而強(qiáng)大的工具。它們寫起來(lái)就像是正規(guī)的函數(shù),需要返回?cái)?shù)據(jù)的時(shí)候使用 yield 語(yǔ)句。每次 next() 被調(diào)用時(shí),生成器回復(fù)它脫離的位置(它記憶語(yǔ)句最后一次執(zhí)行的位置和所有的數(shù)據(jù)值)。以下示例演示了生成器可以很簡(jiǎn)單的創(chuàng)建出來(lái):

前一節(jié)中描述了基于類的迭代器,它能作的每一件事生成器也能作到。因?yàn)樽詣?dòng)創(chuàng)建了 __iter__() 和 __next__() 方法,生成器顯得如此簡(jiǎn)潔。

另一個(gè)關(guān)鍵的功能在于兩次執(zhí)行之間,局部變量和執(zhí)行狀態(tài)都自動(dòng)的保存下來(lái)。這使函數(shù)很容易寫,而且比使用 self.index 和 self.data 之類的方式更清晰。

除了創(chuàng)建和保存程序狀態(tài)的自動(dòng)方法,當(dāng)發(fā)生器終結(jié)時(shí),還會(huì)自動(dòng)拋出 StopIteration 異常。綜上所述,這些功能使得編寫一個(gè)正規(guī)函數(shù)成為創(chuàng)建迭代器的最簡(jiǎn)單方法。

本文名稱:函數(shù)生成器python,函數(shù)生成器desmos
文章網(wǎng)址:http://chinadenli.net/article40/dsgpgho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)網(wǎng)站設(shè)計(jì)公司營(yíng)銷型網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站小程序開發(fā)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站