<p>如果<code>x</code>和<code>y</code>不依赖于<code>A</code>,我可能会尝试为它们创建一个生成器,然后从中构建<code>X</code>、<code>Y</code>和<code>A</code>(或者做任何事情)</p>
<pre><code>def genXYA(n):
x, y = x1, y1
for i in range(n):
nx, ny = (C * x + D * y + E1) % F, (D * x + C * y + E2) % F
a = (nx + ny) % F
yield nx, ny, a
x, y = nx, ny
X, Y, A = map(list, zip(*genXYA(N)))
</code></pre>
<hr/>
<p>只是为了解释这里发生了什么</p>
<p>生成器就像一个列表,除了不立即返回所有内容外,它一次只返回一项</p>
<p>函数<code>genXYA(n)</code>返回一个生成器,该生成器在每一步返回元组<code>(x, y, a)</code>,并在返回<code>n</code>后停止</p>
<p>现在我们有了这个生成器,我们可以直接创建列表<code>X</code>、<code>Y</code>和<code>A</code></p>
<p>说<code>N = 5</code>,如果你做了<code>list(genXYA(N))</code>,你会得到</p>
<pre><code>[(x2, y2, a1),
(x3, y3, a2),
(x4, y4, a3),
(x5, y5, a4),
(x6, y6, a5)]
</code></pre>
<p>您想要的是将这些列分隔为单独的命名列表。您可以使用<code>zip</code>进行此操作<code>zip</code>获取了许多iterables,并创建了新的iterables,这些iterables是每个iterables的第一个、第二个、第三个,等等</p>
<p>为了给<code>zip</code>提供正确的参数,我们需要<strong>解包生成器。这就是<code>*</code>的目的</p>
<p><code>zip(*genXYA(N))</code>的结果是另一个生成器,但是我们可以通过调用<code>list(zip(*genXYA(N)))</code>来查看其中的内容</p>
<pre><code>[(x2, x3, x4, x5, x6), # => X
(y2, y3, y4, y5, y6), # => Y
(a1, a2, a3, a4, a5)] # => A
</code></pre>
<p>所以我们离最终结果越来越近了</p>
<p>当我们调用<code>map(list, zip(*genXYA(N)))</code>时,我们是说对于该列表中的所有内容,我们需要每个项目的列表(元组列表是包含元组中所有内容的列表)</p>
<p><code>map</code>还返回一个生成器,然后我们可以将其解压到所需的变量中</p>
<hr/>
<p>使用生成器的好处是,只在需要时计算下一次迭代,而不必存储所有以前的迭代</p>
<p>例如,如果您只需要<code>A</code>的最后一个值,可以执行以下操作:</p>
<pre><code>for x, y, a in genXYA(N):
pass
print(a)
</code></pre>