try / except函数不返回!在python 3中

时间:2013-11-01 16:42:08

标签: python python-3.x exception-handling function try-except

我试过编写一个函数,它尝试变量'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 个答案:

答案 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