试图理解为什么在特定的python示例中,元组优于列表(来自教程)

2024-10-01 15:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试了解python中的迭代器和生成器是什么,我在网上找到了一个教程,以这个fibonacci迭代器为例。我对第9-11行的评论有问题。“旧的价值观”是什么意思自我.fn1以及自我.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


Tags: ofthetoselfonly列表returndef
3条回答

在这里使用list是没有意义的,因为你总是在处理三个元素,而不是它们的可变数量。通过“确保[sic]仅使用self.fn1和{}的旧值来分配新值”,程序员似乎正在将此方法与另一种方法进行比较:

self.fn1 = X
self.fn2 = Y
oldfn2   = Z

因为self.fn1在其旧值可以分配给self.fn2之前被重新分配了,这是不可能的。重新排序赋值可以解决这个问题,但是使用元组赋值,您不必担心顺序。在

如果没有帕伦斯夫妇,这本书也可以写成,顺便说一句:

^{pr2}$

在这里,使用tuple与使用list在功能上没有区别。他们想表达的观点是,在一个声明中这样做是好的。在

如果将这一行拆分为多个语句,则会得到如下结果:

oldfn2 = self.fn2
self.fn2 = self.fn1
self.fn1 = self.fn1 + oldfn2
return oldfn2

注释的意思是,不要像这样使用多个赋值:

# would be incorrect
self.fn1 = self.fn1+self.fn2 # because fn1 is overwritten here
self.fn2 = self.fn1
oldfn2 = self.fn2

它们使用元组赋值:

^{pr2}$

它更短,并且确保在第一次赋值之前计算所有新值。在

相关问题 更多 >

    热门问题