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
"[*]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子集。至於是不是哲學悖論,我倒覺得不是哲學問題,反而是語文和數學問題。問題的 真理 表述不清,是某個還是全體?表述邏輯清楚了,另外,高中數學集合論就能解決。 知音 不算...