把一个if-elif-else语句放在一行上?
我已阅读下面的链接,但它不能解决我的问题。
Python是否有三元条件运算符? (这个问题是关于将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]
不,这是不可能的(至less没有任何陈述),也不可取。 把所有东西都放在一行上很可能会违反PEP-8的规定,行长不应超过80个字符。
这也反对Python的禅:“可读性计数”。 (在Python提示符下import this
来读取整个事物)。
您可以在Python中使用三元expression式,但只能用于expression式,不能用于语句:
>>> 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
如果你只需要不同情况下的不同expression式,那么这可能适合你:
expr1 if condition1 else expr2 if condition2 else expr
例如:
a = "neg" if b<0 else "pos" if b>0 else "zero"
只要在else语句中嵌套另一个if子句。 但是这并没有使它看起来更漂亮。
>>> 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'
这也取决于你的表情的性质。 关于“不这样做”的其他答案的一般build议对于generics语句和genericsexpression式是非常有效的。
但是,如果您只需要一个“dispacth”表,就像根据给定选项的值调用不同的函数一样,您可以将这些函数放在字典中调用。
就像是:
def save(): ... def edit(): ... options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"} option = get_input() result = options[option]()
(而不是
if option=="save": save() ...
)
在我看来,还有一个很难理解的问题,但我仍然会分享一些好奇心:
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
那么,我在几个月前遇到过类似的问题,那么有一天我意识到你实际上可以利用一个dict
对象的get
方法。
x = {i>100: 2, i<100: 1}.get(True, 0)
基本上, i>100
和i<100
不能都是真的,所以如果他们中的任何一个是True
你得到你想要的值(2或1),如果他们都不是True
,你会得到0
。
人们已经提到了三元expression。 有时候以一个简单的条件赋值为例,可以使用mathexpression式来执行条件赋值。 这可能不会让你的代码更具可读性,但它确实可以在很短的时间内完成。 你的例子可以这样写:
x = 2*(i>100) | 1*(i<100)
比较结果是True或False,并且与数字相乘的结果可能是1或0.可以使用+而不是| 在中间。