This question already has answers here:
Return in Recursive Function
(3个答案)
3年前关闭。
Python版本:2.7。操作系统:Windows 10 64-bit。
注意:我找到了一种解决以下问题的方法,该方法不使用try / except / else语句。我问以下问题仅是因为我很好奇为什么代码会按照其行为方式运行,以及是否有一种方法可以使用try / except / else来完成我想做的事情。
我有一个名为
现在,我进入Powershell,然后输入:
它确实完成了我所期望的-创建了一个名为myFolder_0的文件夹,并打印了
这次,正如我期望的那样,它将创建一个名为myFolder_1的文件夹,但它不会打印
如果将我在Powershell中键入的命令放在脚本内,则行为也很奇怪。我制作了一个名为
然后在Powershell中:
这次,它使myFolder_0并打印
为什么脚本的行为与交互式会话不同,为什么脚本中会发生无限递归,并且我的代码版本是否仍然使用try / except / else但可以正常工作?
至于为什么看到自己看到的东西……肯定还有其他事情在发生。您为
(3个答案)
3年前关闭。
Python版本:2.7。操作系统:Windows 10 64-bit。
注意:我找到了一种解决以下问题的方法,该方法不使用try / except / else语句。我问以下问题仅是因为我很好奇为什么代码会按照其行为方式运行,以及是否有一种方法可以使用try / except / else来完成我想做的事情。
我有一个名为
blah.py
的文件,其中包含以下代码:import os
def makeFolder(dirName, num = 0):
try:
os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists
except:
makeFolder(dirName, num = num + 1)
else:
return dirName + '_' + str(num)
现在,我进入Powershell,然后输入:
import blah
myStr = blah.makeFolder('myFolder')
print myStr
print type(myStr)
它确实完成了我所期望的-创建了一个名为myFolder_0的文件夹,并打印了
myFolder_0
和<type 'str'>
。现在,仍然在Powershell中,键入:myStr1 = blah.makeFolder('myFolder')
print myStr1
print type(myStr1)
这次,正如我期望的那样,它将创建一个名为myFolder_1的文件夹,但它不会打印
myFolder_1
和<type 'str'>
,而是打印None
和<type 'NoneType'>
。以后每次使用blah.makeFolder('myFolder')
时,它将继续执行此操作。如果将我在Powershell中键入的命令放在脚本内,则行为也很奇怪。我制作了一个名为
blah2.py
的文件,该文件与blah.py
相同,但是最后有一个脚本:import os
def makeFolder(dirName, num = 0):
try:
os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists
except:
makeFolder(dirName, num = num + 1)
else:
return dirName + '_' + str(num)
myStr = makeFolder('myFolder')
print myStr
print type(myStr)
myStr1 = makeFolder('myFolder')
print myStr1
print type(myStr1)
然后在Powershell中:
python blah2.py
这次,它使myFolder_0并打印
myFolder_0
和<type 'str'>
(因此myStr
块与blah.py
相同),然后进行无限递归(因此myStr1
块不起作用)。因此出于我不理解的原因,其行为与交互式会话期间的行为有所不同。如果再次键入python blah2.py
,它将生成myFolder_1并打印None
和<type 'NoneType'>
(myStr
块),然后再次进入无限递归(myStr1
块)。为什么脚本的行为与交互式会话不同,为什么脚本中会发生无限递归,并且我的代码版本是否仍然使用try / except / else但可以正常工作?
最佳答案
如果我在递归调用中添加return
,那么您的代码对我来说效果很好:
import os
def makeFolder(dirName, num = 0):
try:
os.mkdir(dirName + '_' + str(num))
except OSError:
return makeFolder(dirName, num = num + 1)
else:
return dirName + '_' + str(num)
print(makeFolder('myFolder')) # myFolder_0
print(makeFolder('myFolder')) # myFolder_1
至于为什么看到自己看到的东西……肯定还有其他事情在发生。您为
blah2.py
共享的代码无法正常工作,因为在任何地方都没有定义blah
。我的猜测是您正在运行不同的代码而没有意识到。 (也许文件在不同目录中的不同副本?)