我试过编写一个函数,它尝试变量'a'和26的GCD是1,如果不是,那么将变量pgcd返回为True以退出'While'。但是该函数不会改变保持为False的pgcd的值,因此它保持在'While'中。我不明白为什么价值不会改变。你能帮帮我吗:)
def couplepgcd(pgcd):
try:
assert gcd(a,26) == 1
pgcd = True
except Exception:
print("a et 26 doivent être premiers entre eux !")
return pgcd
...
pgcd = False
while pgcd == False:
[...]
couplepgcd(pgcd)
答案 0 :(得分:2)
我认为这是因为你没有保存couplepgcd
函数的结果。
pgcd = False
while pgcd == False:
[...]
pgcd = couplepgcd(pgcd)
答案 1 :(得分:1)
pgcd
函数内的couplepgcd
变量是该函数的本地变量,因此即使将pgcd
更改为True
并从函数返回,也可以调用它,这不会更改您在循环条件中使用的pgcd
变量的值。
你也不必要将pgcd
的当前值传递给函数,这在任何地方都没有使用,因此没有必要。
以下是您可以用来解决此问题的所有选项:
将函数的返回值赋给变量pgcd
:
pgcd = False
while pgcd == False:
[...]
pgcd = couplepgcd()
在函数中使用global
语句,以便在函数中对pgcd
的赋值覆盖全局变量(仅当while
循环在全局范围内时才有效或者在Python 3.x上,您可以使用nonlocal
关键字):
def couplepgcd():
global pgcd
try:
assert gcd(a,26) == 1
except Exception:
print("a et 26 doivent être premiers entre eux !")
使用您在函数中修改的可变变量,例如使用单元素列表:
def couplepgcd(pgcd):
try:
assert gcd(a,26) == 1
pgcd[0] = True
except Exception:
print("a et 26 doivent être premiers entre eux !")
pgcd = [False]
while not pgcd[0]:
[...]
couplepgcd(pgcd)
答案 2 :(得分:1)
您的couplepgcd
函数即使尚未分配pgcd
函数也会尝试返回pgcd
。如果存在异常,则永远不会设置pgcd
,并且返回它是一个错误。
无论如何,您的def couplepgcd(a):
return gcd(a, 26) == 1
功能似乎是一种非常冗长的说法:
assert
另外,请记住,当您的程序以优化模式(python -O
)运行时,assert
语句将被删除,这将中断原始函数。您不应该以{{1}}的方式使用它。
然后您应该传入a
而不是pgcd
(没有理由将其传递给您,因为您不使用它并且无法更改它)并分配循环中couplepgcd()
到pgcd
的返回值。或者,因为它太短了,所以不要在第一时间写这个函数。
答案 3 :(得分:0)
这不是您的问题的答案(请参阅其他答案),但您使用的方法(断言和捕获异常)对于逻辑控制来说并不常见。使用if语句更为常见:
def couplepgcd(pgcd):
if gcd(a,26) == 1:
pgcd = True
else:
print("a et 26 doivent être premiers entre eux !")
return pgcd