1

誰かが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))
4

2 に答える 2

3

それがタプル代入です。複数のターゲットに割り当てることができます。

右側の式が最初に評価され、次にそのシーケンスの各値が左側の名前に左から右に 1 つずつ割り当てられます。

したがって、およびにself.num, self.nums = 0, []代入0します。self.num[]self.nums

割り当てステートメントのドキュメントを参照してください。

  • ターゲット リストがターゲットのカンマ区切りリストの場合: オブジェクトは、ターゲット リスト内のターゲットと同じ数のアイテムを持つ iterable である必要があり、アイテムは左から右に対応するターゲットに割り当てられます。

右側の部分が最初に実行されるため、この行は計算してから にcur, self.num = self.num, self.num+1代入self.numし、 を に代入します。その行の前にがあった場合、その行の後はであり、は 6 です。cur self.num + 1self.numself.num5cur5self.num

于 2013-10-05T22:40:14.757 に答える
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

個人的な好みとして、これら 2 つの行のいずれにも複合代入は使用しません。割り当ては関連していないため、それらを組み合わせる理由はありません。

複合割り当てが役立つ場合があります。C や Java などの言語で 2 つの数値を交換する方法を考えてみましょう。

temp = a
a = b
b = temp

Python では、一時変数を削除できます。

a, b = b, a
于 2013-10-05T22:40:31.333 に答える