我已阅读下面的链接,但它并没有解决我的问题。 Does Python have a ternary conditional operator?(问题是关于冷凝的if-else语句一行)
有没有使之适合在一行上写一个if-elif的 - else语句更简单的方法? 例如,
if expression1:
statement1
elif expression2:
statement2
else:
statement3
[UPDATE]
if i>100:
x=2
elif i<100:
x=1
else:
x=0
我只是觉得,如果上面的例子可以写成下面的方式,它可能看起来像更简洁。
x=2 if i>100 elif i<100 1 else 0 [WRONG]
不,这是不可能的(至少在任意语句不),也不是可取的。在一个线拟合一切都将最有可能违反PEP-8它的任务是线路不应超过长度80个字符。
这也是对的Python禅:“可读性罪状”。 (键入import this
在Python提示符读取整个事情)。
您可以使用Python中三元的表达,但仅限于表达,而不是语句:
>>> a = "Hello" if foo() else "Goodbye"
编辑:
您现在的修订问题显示,三个语句是除了值被赋予相同。在这种情况下,链三元运算符的工作,但我仍然认为这是不易阅读:
>>> i=100
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
0
>>> i=101
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
2
>>> i=99
>>> a = 1 if i<100 else 2 if i>100 else 0
>>> a
1
您可以使用if语句嵌套三元。
# if-else ternary construct
country_code = 'USA'
is_USA = True if country_code == 'USA' else False
print('is_USA:', is_USA)
# if-elif-else ternary construct
# Create function to avoid repeating code.
def get_age_category_name(age):
age_category_name = 'Young' if age <= 40 else ('Middle Aged' if age > 40 and age <= 65 else 'Senior')
return age_category_name
print(get_age_category_name(25))
print(get_age_category_name(50))
print(get_age_category_name(75))
如果你只需要针对不同的情况不同的表情,那么这可能为你工作:
expr1 if condition1 else expr2 if condition2 else expr
例如:
a = "neg" if b<0 else "pos" if b>0 else "zero"
只是窝另一个if语句else语句。但是,这并不使它看起来更漂亮的任何。
>>> x=5
>>> x if x>0 else ("zero" if x==0 else "invalid value")
5
>>> x = 0
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'zero'
>>> x = -1
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'invalid value'
您可以选择实际使用get
的dict
方法:
x = {i<100: -1, -10<=i<=10: 0, i>100: 1}.get(True, 2)
如果关键之一是保证评估为get
你不需要True
方法:
x = {i<0: -1, i==0: 0, i>0: 1}[True]
在大多数的关键之一应该理想地评价到True
。如果不止一个关键的计算结果为True
,结果可能似乎不可预知的。
还有那在我看来相当不可读的,但无论如何,我会分享,就像一个好奇的选择:
x = (i>100 and 2) or (i<100 and 1) or 0
这里更多的信息:https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not
if i > 100:
x = 2
elif i < 100:
x = 1
else:
x = 0
如果你想使用上述代码在同一行,你可以使用以下命令:
x = 2 if i > 100 else 1 if i < 100 else 0
上这样做,x将被分配2如果I> 100,1,如果I <100和0若i = 100
这也取决于你的表情的性质。对“不这样做”其他答案一般的建议是通用的语句和通用的表情相当有效。
但是,如果你需要的是一个“调度”表一样,呼吁根据给定选项的值不同的功能,你可以把这种函数的字典里打电话。
就像是:
def save():
...
def edit():
...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}
option = get_input()
result = options[option]()
(也就是说,而不是
if option=="save":
save()
...
)
人们已经提到的三元表达式。有时候,一个简单的有条件分配作为例子,可以使用数学表达式来有条件分配。这可能不会让你的代码可读性很强,但它确实得到它在一个相当短的线路。您的例子可以这样写:
x = 2*(i>100) | 1*(i<100)
攀比是真或假,然后用数字相乘时将1或0。人们可以使用的A +,而不是|在中间。
该ternary operator是一个简洁的表达的最好方式。语法是variable = value_1 if condition else value_2
。所以,你的例子,你必须两次申请三元运算符:
i = 23 # set any value for i
x = 2 if i > 100 else 1 if i < 100 else 0