在Python 3中,带有try/except的函数不会返回!

2024-10-02 04:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个函数,如果变量'a'和26的GCD是1,如果不是,那么返回变量pgcd为True,以便退出'While'。但是函数不会改变pgcd的值,pgcd的值保持为False,因此它将保留在“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

。。。在

^{pr2}$

Tags: 函数falsetruedefexceptionassert价值print
3条回答

我想这是因为你没有保存couplepgcd函数的结果。在

pgcd = False
while pgcd == False:
    [...]
    pgcd = couplepgcd(pgcd)

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

无论如何,您的pgcd函数似乎是一个非常冗长的说法:

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

另外,请记住,当程序以优化模式(python -O)运行时,assert语句将被剥离,这将使原来的函数中断。你不应该像现在这样使用assert。在

然后您应该传入a,而不是pgcd(没有理由传入,因为您不使用它也不能更改它),并在循环中将couplepgcd()返回值分配给pgcd。或者,因为它很短,所以首先不要费心编写函数。在

您的couplepgcd函数中的pgcd变量是该函数的本地变量,因此当您调用它时,即使pgcd被更改为True并从函数返回,这不会更改您在循环条件中使用的pgcd变量的值。在

您还不必要地将当前值pgcd传入函数中,这在任何地方都没有使用,因此没有必要。在

以下是可用于解决此问题的所有选项:

  • 将函数的返回值赋给变量pgcd

    pgcd = False
    while pgcd == False:
        [...]
        pgcd = couplepgcd()
    
  • 在函数中使用global语句,以便在函数中对pgcd的赋值覆盖全局变量(这只适用于while循环在全局范围内,或者在python3.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)
    

相关问题 更多 >

    热门问题