我有一种情况需要返回列表中的第一个项目,当我使用递归时如何返回它?:
def get_hostname (ifname):
try :
# Do something to get hostname
return hostname
except IOError:
return -1
def get_hostname_r(lst):
if not lst:
return False
if get_hostname(lst[0]) != -1 :
print 'Found ', get_hostname(lst[0])
return get_hostname(lst[0]) # DOESNT WORK
else :
print 'Not found ', get_hostname(lst[0])
get_hostname_r(lst[1:])
print 'return = ', get_hostname_r(['eth1','eth2','eth3','eth4','eth5' ])
我知道返回会返回到调用堆栈但是Iam在这里寻找最佳实践而不使用全局变量来获取值?
答案 0 :(得分:2)
您可以简单地返回值,返回的值将移交整个递归堆栈:
def get_hostname_r(lst):
if not lst:
return False
if get_hostname(lst[0]) != -1 :
print 'Found ', get_hostname(lst[0])
return get_hostname(lst[0])
else:
print 'Not found ', get_hostname(lst[0])
return get_hostname_r(lst[1:])
但更易于阅读的是for循环:
def get_hostname_r(interfaces):
for interface in interfaces:
result = get_hostname(interface)
if result != -1:
return result
return False
答案 1 :(得分:0)
首先,如果你不能对IO错误做任何事情,不要通过返回-1来掩盖它(" -1是什么意思?为什么我没有得到一个?主持人回来了?")。只记录get_hostname
可能引发IOError。
def get_hostname(ifname):
# Do stuff that might raise an IOError
return hostname
递归版本也是如此。要么返回有效的主机名,要么引发异常(或者让未被捕获的异常继续)。
def get_hostname_r(lst):
if not lst:
raise IOError("Hostname not found")
try:
hostname = get_hostname(lst[0])
print >>sys.stderr, 'Found {0}'.format(hostname)
return hostname
except IOError:
print 'Not found with {0}'.format(lst[0])
return get_hostname_r(lst[1:])
当然,递归并不是写这个的最佳方式;使用简单的for
循环来迭代lst
。
def get_hostname_iter(lst):
for ifname in lst:
try:
return get_hostname(ifname)
except IOError:
continue
raise IOError("Hostname not found")