Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据多个函数的结果返回值的Python方法_Python - Fatal编程技术网

根据多个函数的结果返回值的Python方法

根据多个函数的结果返回值的Python方法,python,Python,我想返回一个值,这取决于一组函数中哪个函数返回true if a(): return 'a' elif b(): return 'b' else: return 'c' 有没有更符合python的方法呢?如果您可以将所有函数放入一个iterable中: functions = [a, b] for func in functions: if func(): return func.__name__ return "c" 这在提供大量函数时更有意

我想返回一个值,这取决于一组函数中哪个函数返回true

if a():
    return 'a'
elif b():
    return 'b'
else:
    return 'c'

有没有更符合python的方法呢?

如果您可以将所有函数放入一个iterable中:

functions = [a, b]
for func in functions:
    if func():
        return func.__name__
return "c"
这在提供大量函数时更有意义,因为唯一需要更改的是
函数
(以及可选的“默认”返回值)。如果您希望将其作为一个函数:

def return_truthy_function_name(*functions, default):
    """Iterate over `*functions` until a function returns a truthy value, then return its name.
    If none of the functions return a truthy value, return `default`.
    """
    for function in functions:
        if function():
            return function.__name__
    return default

我不知道它是否更像python,但使用两个嵌套的三元表达式会更短:

return 'a' if a() else ('b' if b() else 'c')
return 'a' if a() else 'b' if b() else 'c'

如果有两个以上的条件,嵌套三元表达式会变得很麻烦,循环方法(如果两个条件之间没有明显的关系,则可能使用
元组列表来关联函数调用和返回值)更好。

可以使用条件表达式:

实际上,做你所要求的事情的最具python风格和普遍性的方式可能是

next((f for f in [a,b] if f()), c).__name__

请注意,如果生成器为空,则可调用的
c
(专门定义)将用作默认值。

可能是三元表达式?
如果a()else('b'if b()else'c')则返回'a'
是的,可以。谢谢。使用嵌套条件表达式肯定不会比使用
if…elif…else
@juanpa.arrivillaga更像python,这只是一个品味问题。但我会把它称为线条更短,不一定更像蟒蛇。如果有两个以上的条件,三元函数就不是这样做的。注意:
函数
在您的示例中是一个
集合
,因此可以在
a
之前计算
b
。把它列成一个列表。谢谢你的提醒,我现在已经习惯使用集合来处理这类事情:)返回值与函数调用匹配吗?好吧,即使没有,人们也可以列出元组,这样你的答案仍然可以。你可以补充一点,如果有4个链式条件,你的答案可以避免大量的复制/粘贴。shorter==更多Pythonic吗?你来晚了一分钟;-)这与让·弗朗索瓦·法布几乎相同';但是这不使用括号,因此它更简短;)。让我们把这个编码吧。为了安全起见,我加了括号。我不喜欢玩刀子。再说一次:把它做成一个有序的口述,否则你无法预测评估的顺序。这些并不等同于OP案例。实际上,元组列表会更好,因为您没有使用随机查找dict功能。您可以删除“,”之后的空格以保存1个字符。但对我来说,调用所有函数都是不可能的。这里的大多数答案都是DV。可能是我的问题的元效应,我甚至没有链接,但人们访问了我的个人资料,我得到了一些反对票,还有一些赞成票。您的更新增加了很多,因此+1,您应该完全删除第一个解决方案,只保留
下一个
内容
next((f for f in [a,b] if f()), c).__name__