我正在试着做this。 这就是我想到的:
X, Y, A = [x1], [y1], [(x1 + y1) % F]
for i in range(1, N):
X.append((C * X[i-1] + D * Y[i-1] + E1) % F)
Y.append((D * X[i-1] + C * Y[i-1] + E2) % F)
A.append((X[i] + Y[i]) % F)
这项工作,但正如你看到的,它不是很Python。我想知道是否有一种方法可以通过pythonic的方式获得相同的结果,可能是通过使用列表理解。 谢谢
如果
x
和y
不依赖于A
,我可能会尝试为它们创建一个生成器,然后从中构建X
、Y
和A
(或者做任何事情)只是为了解释这里发生了什么
生成器就像一个列表,除了不立即返回所有内容外,它一次只返回一项
函数
genXYA(n)
返回一个生成器,该生成器在每一步返回元组(x, y, a)
,并在返回n
后停止现在我们有了这个生成器,我们可以直接创建列表
X
、Y
和A
说
N = 5
,如果你做了list(genXYA(N))
,你会得到您想要的是将这些列分隔为单独的命名列表。您可以使用
zip
进行此操作zip
获取了许多iterables,并创建了新的iterables,这些iterables是每个iterables的第一个、第二个、第三个,等等为了给
zip
提供正确的参数,我们需要解包生成器。这就是*
的目的zip(*genXYA(N))
的结果是另一个生成器,但是我们可以通过调用list(zip(*genXYA(N)))
来查看其中的内容所以我们离最终结果越来越近了
当我们调用
map(list, zip(*genXYA(N)))
时,我们是说对于该列表中的所有内容,我们需要每个项目的列表(元组列表是包含元组中所有内容的列表)map
还返回一个生成器,然后我们可以将其解压到所需的变量中使用生成器的好处是,只在需要时计算下一次迭代,而不必存储所有以前的迭代
例如,如果您只需要
A
的最后一个值,可以执行以下操作:使用递归+
numpy
:样本输出:
如果您有两个变量,每个变量都应该使用两个变量的当前值进行更新,那么最好的解决方案是使用并行赋值
相关问题 更多 >
编程相关推荐