2024-10-03 11:17:38 发布
网友
我经常发现自己在写一个三元运算符,它等价于
var = a if returnsBool(a) else b
使用returnsBool返回一个布尔值,具体取决于a的值
returnsBool
a
当a是一个较长的变量时,它开始显得丑陋和“不和谐”。有没有办法在语句的条件部分(returnsBool(a))中引用a,这样就不必写a两次
returnsBool(a)
或者,对于这种情况,是否有更好的方法,也有助于列表理解
只要a本身不能是“假”值,就可以将returnsBool更改为返回a/None,而不是True/False
None
True
False
然后你可以写:
var = maybe(a) or b
否则,定义自己的三元似乎是最好的选择:
def conditional(func, a, b): return a if func(a) else b
您可以使用partial针对特定条件对其进行自定义:
partial
from functools import partial some_cond = partial(conditional, returnsBool) vars = [some_cond(a, b) for a, b in whatever]
这里有一个不太惯用的方法,但它是有效的;next函数可以接受第二个参数,如果第一个参数是空迭代器,则返回第二个参数
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')
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
只要
a
本身不能是“假”值,就可以将returnsBool
更改为返回a
/None
,而不是True
/False
然后你可以写:
否则,定义自己的三元似乎是最好的选择:
您可以使用
partial
针对特定条件对其进行自定义:这里有一个不太惯用的方法,但它是有效的;
next
函数可以接受第二个参数,如果第一个参数是空迭代器,则返回第二个参数如果您发现自己必须经常这样做,那么编写一个helper函数可能是值得的,这样您就可以编写例如
if_else(is_even, very_long_variable_name, 'default')
您可以使用Python 3.8中引入的
:=
“walrus”assignment operator:相关问题 更多 >
编程相关推荐