需要帮助理解python语法

时间:2013-10-05 22:38:53

标签: python iterable-unpacking

有人可以解释第5行和第5行的语法吗? 16

   1 # Using the generator pattern (an iterable)
   2 class firstn(object):
   3     def __init__(self, n):
   4         self.n = n
   5         self.num, self.nums = 0, []
   6 
   7     def __iter__(self):
   8         return self
   9 
  10     # Python 3 compatibility
  11     def __next__(self):
  12         return self.next()
  13 
  14     def next(self):
  15         if self.num < self.n:
  16             cur, self.num = self.num, self.num+1
  17             return cur
  18         else:
  19             raise StopIteration()
  20 
  21 sum_of_first_n = sum(firstn(1000000))

2 个答案:

答案 0 :(得分:3)

这是元组任务;你可以分配到多个目标。

首先评估右手表达式,然后将该序列中的每个值从左到右依次分配给左侧的名称。

因此,self.num, self.nums = 0, []0分配给self.num,将[]分配给self.nums

请参阅assigment statements documentation

  
      
  • 如果目标列表是以逗号分隔的目标列表:对象必须是与目标列表中的目标具有相同项目数的可迭代对象,并且项目将从左到右分配到相应的目标。
  •   

因为右侧部分是首先执行,所以计算后,cur, self.num = self.num, self.num+1行会将self.num分配给cur { {1}},已分配给self.num + 1。如果self.num在该行之前为self.num,则该行5之后为cur,而5为6。

答案 1 :(得分:1)

self.num, self.nums = 0, []
cur, self.num = self.num, self.num+1

这些是以下方面的缩写:

self.num = 0
self.nums = []

cur = self.num
self.num = self.num + 1

作为个人偏好,我不会在这两行中的任何一行中使用复合赋值。作业不相关,因此没有理由将它们组合起来。

复合指派有时候可以证明是有用的。考虑如何在C和Java等语言中交换两个数字:

temp = a
a = b
b = temp

在Python中我们可以消除临时变量!

a, b = b, a