这个Python程序发生了什么?

2024-05-31 12:20:47 发布

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

我想知道第8行的任务是什么。在

# Iterators

class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def next(self):
        self.a, self.b = self.b, self.a+self.b # <--- here
        return self.a
    def __iter__(self):
        return self

fibs = Fibs()

for f in fibs:
    if f > 1000:
        print f
        break

剩下的节目我真的不需要太多的解释。我不确定分配给什么的。在


Tags: inselfforreturnifhereinitdef
3条回答

这是一对速记作业

t = self.a
self.a = self.b
self.b = t+self.b

只是用一行代码代替两个任务。。准确地说,我认为赋值的左操作数被认为是由两个元素组成的元组,所以你就像给元组(self.a, self,b)赋值(self.b, self.a+self.b),它与前面写的三个独立赋值相同,而不需要临时变量。这是因为,在不使用元组的情况下,赋值是按顺序执行的,在您的示例中,它们是同时解析的,在第二个赋值中保留self.a的值。在

如文件所述:

对象到目标列表的赋值递归定义如下。在

  • 如果目标列表是单个目标:将对象指定给该目标。在
  • 如果目标列表是一个逗号分隔的目标列表(您的案例):对象必须是iterable,其项数与目标列表中的目标数相同,并且这些项从左到右分配给相应的目标。(从Python1.5开始,这个规则已经放宽了;在早期版本中,对象必须是元组。由于字符串是序列,现在只要字符串的长度正确,像a,b=“xy”这样的赋值是合法的。)

这是一个多重任务,大致相当于:

tmp = self.a
self.a = self.b
self.b = tmp + self.b

或者这个伪代码:

^{pr2}$

如您所见,多重赋值比单独赋值简洁得多,并且更类似于伪代码示例。在

几乎这个例子在Python documentation中给出,作为计算Fibonacci数的例子。多重赋值的一个优点是,在任何赋值发生之前,右边的变量都被求值,这样就省去了对临时变量的需要。在

不看周围的代码,我想说它是计算斐波纳契数的算法的核心。在

它相当于:

a = b
b = a + b

…从而计算序列中的下一个数。在

如果你看一系列的数字

^{pr2}$

ab是最后两个数字,然后在b中有下一个数字,在a中有前最后一个数字(b)

使用这种奇怪符号的原因是为了同时完成两项任务。如果第二行的值是第二行的两倍。在

相关问题 更多 >