Python 在函数中调用函数时会出现什么问题?

Python 在函数中调用函数时会出现什么问题?,python,python-3.x,Python,Python 3.x,我正在学习编码,下面是华氏温度和摄氏温度之间的简单转换。我在check函数中创建了一个循环,如果用户在confirm数组中输入了一些内容,它将再次调用convert函数(我删除了数组以节省空间) 据我所知,与在函数中调用函数相比,使用do-while循环是更好的编码实践 所以我想知道函数中的函数会出现什么新的人们可能不会想到的问题 def convert(): while True: usrchoice = input("Would you like to change

我正在学习编码,下面是华氏温度和摄氏温度之间的简单转换。我在check函数中创建了一个循环,如果用户在confirm数组中输入了一些内容,它将再次调用convert函数(我删除了数组以节省空间)


据我所知,与在函数中调用函数相比,使用do-while循环是更好的编码实践

所以我想知道函数中的函数会出现什么新的人们可能不会想到的问题

def convert():

    while True:
        usrchoice = input("Would you like to change Cel or Far? :")
        if usrchoice in Celsius:
            usrcel = int(input("Input temp in Celc: "))
            far = usrcel * (9.0/5.0) +32
            print("that's " + str(far) + " degrees in Far")   
            break
        elif usrchoice in Far:
            usrfar = int(input("Input temp in Far: "))
            cel = (usrfar - 32) / (9.0/5.0)
            print("that's " + str(cel) + " degrees in Cel" )
            break
        else: print("Choose Cel or Far")
        continue



def check():

    while True:
        dblchk = input("Would you like to make another conversion? ")
        if dblchk in Confirm:
            convert()                                                           
        elif dblchk in Deny:
            print("Conversion finished")
            break
        else: print("Please enter yes or no")
        continue


convert()

check()

好吧,你可能会得到一个堆栈溢出

调用新函数时,有关它的一些信息会保存在内存中。当它运行时,它的局部变量也保存在那里。这种结构称为“堆栈帧”。当您在函数中调用函数时,描述调用方的堆栈帧保持在那里,因为控制必须(或至少应该)在某个点返回给调用方(有一些技术,如尾部调用优化,可以防止这种情况,但它们不适用于大多数情况),所以递归越深入,更多的堆栈帧被推到堆栈上

您可能会因为堆栈上的堆栈帧过多而耗尽内存,这称为堆栈溢出,导致程序崩溃


例如,我曾经编写过一个递归函数,它不断地使我的Python解释器崩溃,因为它在内存非常少的环境中运行。一旦我从这个函数中删除了一个局部变量,它就停止崩溃了。正如您所看到的,有时一个局部变量(在新的堆栈帧中一次又一次地复制)会产生不同。

嗯,您可能会遇到堆栈溢出

调用新函数时,有关它的一些信息会保存在内存中。当它运行时,它的局部变量也保存在那里。这种结构称为“堆栈帧”。当您在函数中调用函数时,描述调用方的堆栈帧保持在那里,因为控制必须(或至少应该)在某个点返回给调用方(有一些技术,如尾部调用优化,可以防止这种情况,但它们不适用于大多数情况),所以递归越深入,更多的堆栈帧被推到堆栈上

您可能会因为堆栈上的堆栈帧过多而耗尽内存,这称为堆栈溢出,导致程序崩溃


例如,我曾经编写过一个递归函数,它不断地使我的Python解释器崩溃,因为它在内存非常少的环境中运行。一旦我从这个函数中删除了一个局部变量,它就停止崩溃了。正如您所看到的,有时一个局部变量(在新的堆栈帧中一次又一次地复制)会产生不同。

提示:这是这个站点的名称“据我所知,使用类似do-while循环的编码实践比在函数中调用函数更好。”您能澄清一下这是什么意思吗?一般来说,在函数中调用函数绝对没有什么错。请注意,Python并没有真正的DO-WHILE循环,当然,您可以伪造它。在Python中,递归函数调用被认为是完全正常/可以接受的。但是你必须小心,在其他函数中调用函数是完全正常的,也是应该做的事情。几乎每一个项目都会涉及到这一点,当然有很多方法会出错。例如,新来者试图编写一个“重试”的东西或那些无处不在的文本冒险项目,结果往往会认为函数调用是“这就是下一步应该发生的事情”,这往往会导致堆栈溢出问题,或者忘记函数返回时会发生什么。提示:这是此站点的名称“据我所知,与在函数中调用函数相比,使用do-while循环是更好的编码实践。“你能澄清一下这是什么意思吗?一般来说,在函数中调用函数绝对没有什么错。请注意,Python并没有真正的DO-WHILE循环,当然,您可以伪造它。在Python中,递归函数调用被认为是完全正常/可以接受的。但是你必须小心,在其他函数中调用函数是完全正常的,也是应该做的事情。几乎每一个项目都会涉及到这一点,当然有很多方法会出错。例如,新来者试图编写一个“重试”的东西或那些无处不在的文本冒险项目中的一个,最终往往会将函数调用视为“这就是下一步应该发生的事情”,这往往会导致堆栈溢出问题或忘记函数返回时会发生什么。谢谢你的回答,我试着从让事情运作的角度出发,去正确理解它们为什么会运作。因此,这有两个次要问题;在do-while/do-until循环中,每个循环是创建新函数/新堆栈帧,还是创建相同的“实例”?第二,只要代码有适当的方法来避免不必要的递归和退出,那么堆栈溢出就没有多大关系。正确吗?@MarsHall 1)循环不同于递归。循环不会创建堆栈帧,它们只是来回跳转(从循环结束到条件检查再来回跳转)。2) 当然,只要一个人“正确”地编写代码,就不太可能出现堆栈溢出/分段错误之类的情况。问题是,编写“适当”的代码并不容易,因此在处理递归函数时,应该注意潜在的无限递归。谢谢您的帮助。我知道这是一个基本的问题,只是想稍微了解一下编码的规则