如何从递归函数返回一个堆栈变量?

2024-06-16 11:13:52 发布

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

我需要返回列表中找到的第一个项,当我使用递归时,如何返回它

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' ]) 

我知道返回到调用堆栈,但我在这里寻找最佳实践,而不使用全局变量来获取值


Tags: to列表getreturnifdefdosomething
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

首先,如果你对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")

相关问题 更多 >