三元算子中的参考第一值

2024-10-03 11:17:38 发布

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

我经常发现自己在写一个三元运算符,它等价于

var = a if returnsBool(a) else b

使用returnsBool返回一个布尔值,具体取决于a的值

a是一个较长的变量时,它开始显得丑陋和“不和谐”。有没有办法在语句的条件部分(returnsBool(a))中引用a,这样就不必写a两次

或者,对于这种情况,是否有更好的方法,也有助于列表理解


Tags: 方法列表ifvar情况运算符语句条件
3条回答

只要a本身不能是“假”值,就可以将returnsBool更改为返回a/None,而不是True/False

然后你可以写:

var = maybe(a) or b

否则,定义自己的三元似乎是最好的选择:

def conditional(func, a, b):
    return a if func(a) else b

您可以使用partial针对特定条件对其进行自定义:

from functools import partial
some_cond = partial(conditional, returnsBool)
vars = [some_cond(a, b) for a, b in whatever]

这里有一个不太惯用的方法,但它是有效的;next函数可以接受第二个参数,如果第一个参数是空迭代器,则返回第二个参数

>>> def is_even(x): return x % 2 == 0
... 
>>> very_long_variable_name = 12
>>> next(filter(is_even, [very_long_variable_name]), 'default')
12
>>> very_long_variable_name = 13
>>> next(filter(is_even, [very_long_variable_name]), 'default')
'default'

如果您发现自己必须经常这样做,那么编写一个helper函数可能是值得的,这样您就可以编写例如if_else(is_even, very_long_variable_name, 'default')

def if_else(predicate, a, b):
    return a if predicate(a) else b

您可以使用Python 3.8中引入的:=“walrus”assignment operator

def returnsBool(a):
    return bool(a)

reallylengthiervariablename = 42
b = 2

var = a if returnsBool(a := reallylengthiervariablename) else b
print(f'{var=}')  # -> var=42

相关问题 更多 >