Python 声明多变量混淆
Python declaring multiple variable confusion
我想知道为什么这段代码给我两种不同的解决方案:
a = 0
b = 1
solution = 0
while b <= 4000000:
if b % 2 == 0:
solution += b
a, b = b, a + b
print(solution)
在这种情况下,solution
是 4613732。但是,当我尝试此代码时:
a = 0
b = 1
solution = 0
while b <= 4000000:
if b % 2 == 0:
solution += b
a = b
b = a + b
print(solution)
solution
是 4194302
有什么建议吗?
差异解释
因为你写:
a = b
b = a + b
在你的第二种方法中。这意味着 在第一行之后, a
的值为 b
。而第二行会产生 b = a + b = b + b
所以两次 b
。也就是说,第二个其实会走2的幂
第一种方法不会发生这种情况,因为您写了:
a, b = b, a + b
结果你首先构造一个元组(b,a+b)
(a
和b
旧 值)。 接下来你 解压 那个元组再次进入 a
和 b
。但是您首先使用旧值评估 a + b
。这就是本质的区别。
更有效的方法
您想对 偶数 斐波那契数求和。但是,您可以更有效地做到这一点。如果你对斐波那契数列进行分析,你会发现它是结构化的:
o o e o o e o o e ...
其中 o
是 奇数 数,e
是 偶数 数。因此,您可以简单地使用 三跳 ,例如:
a = 1
b = 2
solution = 0
while b <= 4000000:
solution += b
a,b = a+2*b,2*a+3*b
print(solution)
这里我们因此节省了迭代和检查b
是否是even:我们只知道它总是甚至。
当使用 timeit
(在 linux 上使用 Python 3.5.3 和 GCC 6.3.0)时,我们得到以下结果:
original 3.4839362499988056
optimized 1.5940769709995948 45.755%
所以优化后的程序平均运行时间是原来的一半左右
原因很简单,赋值运算符右侧的所有表达式都先求值。
假设您有以下代码:
a = 5
b = 7
a, b = b, a + b
您希望 a
被分配值 7,然后 b
被分配值 14,a
和 b
的总和使用a
的新值。
实际上,在=
运算符的右侧,b
被计算为7,a+b
被计算为12
a, b = 7, 12
我想知道为什么这段代码给我两种不同的解决方案:
a = 0
b = 1
solution = 0
while b <= 4000000:
if b % 2 == 0:
solution += b
a, b = b, a + b
print(solution)
在这种情况下,solution
是 4613732。但是,当我尝试此代码时:
a = 0
b = 1
solution = 0
while b <= 4000000:
if b % 2 == 0:
solution += b
a = b
b = a + b
print(solution)
solution
是 4194302
有什么建议吗?
差异解释
因为你写:
a = b
b = a + b
在你的第二种方法中。这意味着 在第一行之后, a
的值为 b
。而第二行会产生 b = a + b = b + b
所以两次 b
。也就是说,第二个其实会走2的幂
第一种方法不会发生这种情况,因为您写了:
a, b = b, a + b
结果你首先构造一个元组(b,a+b)
(a
和b
旧 值)。 接下来你 解压 那个元组再次进入 a
和 b
。但是您首先使用旧值评估 a + b
。这就是本质的区别。
更有效的方法
您想对 偶数 斐波那契数求和。但是,您可以更有效地做到这一点。如果你对斐波那契数列进行分析,你会发现它是结构化的:
o o e o o e o o e ...
其中 o
是 奇数 数,e
是 偶数 数。因此,您可以简单地使用 三跳 ,例如:
a = 1
b = 2
solution = 0
while b <= 4000000:
solution += b
a,b = a+2*b,2*a+3*b
print(solution)
这里我们因此节省了迭代和检查b
是否是even:我们只知道它总是甚至。
当使用 timeit
(在 linux 上使用 Python 3.5.3 和 GCC 6.3.0)时,我们得到以下结果:
original 3.4839362499988056
optimized 1.5940769709995948 45.755%
所以优化后的程序平均运行时间是原来的一半左右
原因很简单,赋值运算符右侧的所有表达式都先求值。
假设您有以下代码:
a = 5
b = 7
a, b = b, a + b
您希望 a
被分配值 7,然后 b
被分配值 14,a
和 b
的总和使用a
的新值。
实际上,在=
运算符的右侧,b
被计算为7,a+b
被计算为12
a, b = 7, 12