1

我试图编写一个函数来尝试变量“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)
4

4 回答 4

2

我认为这是因为您没有保存couplepgcd函数的结果。

pgcd = False
while pgcd == False:
    [...]
    pgcd = couplepgcd(pgcd)
于 2013-11-01T16:45:28.983 回答
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)
    
于 2013-11-01T16:47:58.340 回答
1

即使没有分配,您的couplepgcd函数也会尝试返回。pgcd如果有异常,pgcd则永远不会设置,返回它是一个错误。

无论如何,您的pgcd功能似乎是一种非常冗长的说法:

def couplepgcd(a):
   return gcd(a, 26) == 1

另外,请记住,assert当您的程序以优化模式 ( python -O) 运行时,语句将被删除,这将破坏原始函数。你不应该使用assert你使用它的方式。

然后,您应该传入a而不是pgcd(没有理由将其传入,因为您不使用它并且无法更改它)并在循环中分配to的返回值。或者,因为它很短,所以一开始就不要费心编写函数。couplepgcd()pgcd

于 2013-11-01T16:53:13.053 回答
0

这不是您问题的答案(请参阅其他答案),但您使用的方法(断言和捕获异常)对于逻辑控制来说并不典型。使用 if 语句更为常见:

def couplepgcd(pgcd):
    if gcd(a,26) == 1:
        pgcd = True
    else:
        print("a et 26 doivent être premiers entre eux !")
    return pgcd
于 2013-11-01T16:52:56.503 回答