python try/except/else 递归
python try/except/else with recursion
Python 版本:2.7。 OS: Windows 10 个 64 位。
注意:我找到了一种解决下述问题的方法,该方法不使用 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
未在任何地方定义。我猜你是 运行 不同的代码而没有意识到。 (也许是不同目录中文件的不同副本?)
我的第一个想法是,您看到的不一致行为可能是因为如果您 运行 一个接一个地安装某些目录,它们可能已经存在。为防止这种情况,请尝试将此代码添加到开头以清理由之前的 运行:
创建的任何目录
import os
for dirname in [f for f in os.listdir('.') if
(os.path.isdir(f) and f.startswith('myFolder'))]:
os.rmdir(dirname)
但这是解决实际问题的方法:
import os
def makeFolder(dirName, num = 0):
try:
os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists
except:
return makeFolder(dirName, num = num + 1)
else:
return dirName + '_' + str(num)
Python 版本:2.7。 OS: Windows 10 个 64 位。
注意:我找到了一种解决下述问题的方法,该方法不使用 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
未在任何地方定义。我猜你是 运行 不同的代码而没有意识到。 (也许是不同目录中文件的不同副本?)
我的第一个想法是,您看到的不一致行为可能是因为如果您 运行 一个接一个地安装某些目录,它们可能已经存在。为防止这种情况,请尝试将此代码添加到开头以清理由之前的 运行:
创建的任何目录import os
for dirname in [f for f in os.listdir('.') if
(os.path.isdir(f) and f.startswith('myFolder'))]:
os.rmdir(dirname)
但这是解决实际问题的方法:
import os
def makeFolder(dirName, num = 0):
try:
os.mkdir(dirName + '_' + str(num)) #error if argument of os.mkdir already exists
except:
return makeFolder(dirName, num = num + 1)
else:
return dirName + '_' + str(num)