請問這個 Python 迭代器裡 next 定義怎麼理解?

時間 2021-06-01 14:46:56

1樓:LiDH

首先理解迭代器。先看看C++怎麼實現乙個迭代器。在C++中,任何乙個資料型別(不論是內建型別還是類)的變數p都可以作為乙個迭代器,若同時滿足四個性質(「IDEA"):

(1)Increment: p可以實現自增,【並且】遍歷整個容器,即p++和++p是有意義的並可以實現遍歷;

(2)Dereference: p可以解析,即*p是有意義的;

(3)Equality: p可以和同型別的變數q做相等/不等比較,即p==q和p!=q是有意義的;

(4)Assignment: p可以賦值給同型別的變數q,即q=p是有意義的。

(從上面的定義來看,C++的指向陣列元素指標顯然滿足這四條要求,因此指標可以作為陣列的迭代器。而有的C++類,只要它有合適的成員方法可以實現上面四個條件,那麼也可以作迭代器,比如標準模版庫里容器的迭代器。)

現在看看Python。Python的迭代器中,next方法就是實現(1)和(2)的,而(3)(4)是C++為自己提的個性要求,Python不需要管它。

具體來看,next的功能是是先解析,再自增。所以呼叫next後,會返回當前迭代器的解析值,並自增指向下乙個容器元素。這也可以在Python原始碼看出來(3.

5.1版本iterobject.c的46-66行):

iter_iternext(PyObject *iterator)

現在回到題主的問題。

self.a, self.b = self.b, self.a+self.b

可以拆成兩個語句:

self.a = self.b,就是解析,獲得斐波那契數列乙個項

self.b = self.a+self.b,就是迭代器自增,指向下乙個容器元素,即指向斐波那契數列下乙個項

return self.a,就是返回解析值

依個人愚見,應該可以回答題主問題。以上。

(抽象地說,迭代器都是乙個套路)

2樓:何偉

self.a, self.b = self.b, self.a + self.b

在賦值的時候,是同時賦值的

例如一開始的時候 self.a=0,self.b=1那麼在賦值的時候

self.a已經變成1,但是在 self.b=self.a+self.b中的self.a還是0

這樣就能說清楚了

3樓:yangqingter

拋開類會更清楚:

a=0b=1

l=[a,b]

def next(L):

L[0],L[1]=L[1],L[0]+L[1]return L[0]

next(l)

4樓:

不知道你在說啥.元組的賦值是python的乙個"賦值魔法",BEGINNING PYTHON提過

如果你是在糾結next()的作用,我也剛剛做了一下實驗:

class

Foo:

def__init__

(self

):print"\n

[*]initializing\n"

self.a

=0defnext

(self

):self.a

+=2return

'*'*

self.a

def__iter__

(self

):print

"[*]when self.a=

%d,__iter__ is called\n"

%self.a

return

selff=

Foo()

#建立乙個迭代器

foriinf

:iflen(i)

<12:

printi+

'\n'else

:break結果:

C:\Python27

>python

iter_stuff.py

[*]initializing[*

]when

self.a

=0,__iter__

iscalled

******

******

********

'''你可以看到:

1,f是乙個"未來的"字串的序列,內容是next()返回的東西

2,iterator只被創造一次,終身呼叫

ps:__iter__返回的東西必須是self,例項化後,就是f,(f=Foo())

一開始,f只是乙個,當for,while這些機制觸發了next()的時候,next()開始往f=填充資料

step 1:[next()]

step 2:[next(),next()]

gt;這個掉渣天的序列不如說是乙個一次性的log,閱過即焚,除非你找乙個東西來記下,

不然等迭代器跑到最後,以前的資料你都找不到了'''

5樓:Fantasy

self.a, self.b = self.b, self.a + self.b

即python中的元組賦值,Python會按照位置把右邊的物件和左邊的目標從左至右相配對。

python的迭代器為什麼一定要實現 iter 方法?

劉昕宸 劉昕宸 徹底搞懂Python的 iter 和 next Iterable和Iteration iter 與 next iter 返回乙個迭代器物件,該物件是乙個實現了 next 的物件。該方法為容器類所擁有,類似於迭代器模式中Aggregate類的createIterator方法。next ...

請問這個極限

jqy123 考慮函式 易證 在 上恆成立,所以 是增函式。令 因為 0 eeimg 1 所以 b b 1 eeimg 1 0 eeimg 1 以此類推,可知 0,eeimg 1 所以 是遞增數列。再考慮函式 易知當 時,0 eeimg 1 遞增且 當 1 a eeimg 1 時,遞減且 當 時,0...

請問這個算是悖論麼?

真理是集合,有些真理 子集A 掌握在大部分人手裡,有些 子集B 在少數人手裡。那這個問題的真理是屬於子集A還是B呢?我的結論是屬於A子集。至於是不是哲學悖論,我倒覺得不是哲學問題,反而是語文和數學問題。問題的 真理 表述不清,是某個還是全體?表述邏輯清楚了,另外,高中數學集合論就能解決。 知音 不算...