我正在尝试学习python中的迭代器和生成器是什么,通过我在网上找到的一个教程,它使用了这个斐波那契迭代器作为例子。我在第9-11行的注释中遇到了问题。“在分配新值时使用self.fn1和self.nf2的旧值”是什么意思?我知道元组是不可变的对象,但我不明白为什么使用元组比使用列表更可取。我想我不明白为什么在这里使用元组比使用列表更好,我想更好地理解是否有人可以帮助解释它:/
4 class fibnum:
5 def __init__(self):
6 self.fn2 = 1 # "f_{n-2}"
7 self.fn1 = 1 # "f_{n-1}"
8 def next(self): # next() is the heart of any iterator
9 # note the use of the following tuple to not only save lines of
10 # code but also to insure that only the old values of self.fn1 and
11 # self.fn2 are used in assigning the new values
12 (self.fn1,self.fn2,oldfn2) = (self.fn1+self.fn2,self.fn1,self.fn2)
13 return oldfn2
14 def __iter__(self):
15 return self
来自:http://heather.cs.ucdavis.edu/~matloff/Python/PyIterGen.pdf
发布于 2011-04-04 05:11:04
在这里使用list
是没有意义的,因为您总是要处理三个元素,而不是数量可变的元素。通过“确保sic在分配新值时只使用self.fn1
和self.fn2
的旧值”,程序员似乎是在将这种方法与替代方法进行比较:
self.fn1 = X
self.fn2 = Y
oldfn2 = Z
这将无法开箱即用,因为在将其旧值赋给self.fn2
之前,self.fn1
会被重新赋值。重新排序赋值可以解决这个问题,但是使用元组赋值,您不需要担心顺序。
这段代码本可以不使用括号,顺便说一句:
self.fn1, self.fn2, oldfn2 = self.fn1+self.fn2, self.fn1, self.fn2
发布于 2011-04-04 05:09:47
在这里,使用tuple
和使用list
在功能上没有区别。他们试图表达的观点是,用一句话就能做到这一点。
如果要将这一行拆分为多个语句,则会得到如下结果:
oldfn2 = self.fn2
self.fn2 = self.fn1
self.fn1 = self.fn1 + oldfn2
return oldfn2
发布于 2011-04-04 05:12:40
注释意味着不使用像这样的多个赋值:
# would be incorrect
self.fn1 = self.fn1+self.fn2 # because fn1 is overwritten here
self.fn2 = self.fn1
oldfn2 = self.fn2
它们使用元组赋值:
(self.fn1,self.fn2,oldfn2) = (self.fn1+self.fn2,self.fn1,self.fn2)
它更短,并且还确保在第一次赋值发生之前计算所有新值。
https://stackoverflow.com/questions/5532516
复制相似问题