一行if-condition-assignment


140

我有以下代码

num1 = 10
someBoolValue = True

我需要将to的值设置num120if someBoolValueis True; 否则就什么也不做。所以,这是我的代码

num1 = 20 if someBoolValue else num1

有什么办法可以避免...else num1使它看起来更干净的部分吗?相当于

if someBoolValue:
    num1 = 20

我尝试将其替换为...else passnum1=20 if someBoolValue else pass。我所得到的只是语法错误。我也不能忽略这一...else num1部分。


2
只需将其全部更改为即可num1 = 20 if someBoolValue else 10。那你也保存num1=10行吗?
Thomas Ahle

谢谢。但这不完全是我的代码。我的意思是那num1已经存在...
bdhar

Answers:


195

我认为这在Python中是不可能的,因为您实际尝试执行的操作可能会扩展为以下内容:

num1 = 20 if someBoolValue else num1

如果您排除else num1,则会收到语法错误,因为我非常确定分配实际上必须返回某些内容。

正如其他人已经提到的那样,您可以执行此操作,但是这样做很不好,因为您可能在下次阅读该代码段时最终会感到困惑:

if someBoolValue: num1=20

num1 = someBoolValue and 20 or num1出于完全相同的原因,我不是超级粉丝。我实际上必须对这条线在做什么进行三思。

实际实现您想要做的最好的方法是原始版本:

if someBoolValue:
    num1 = 20

最好的版本是因为您想做什么很明显,并且您不会混淆自己,或者其他人以后将与该代码联系。

另外,请注意,num1 = 20 if someBoolValue有效的Ruby代码是有效的,因为Ruby的工作方式略有不同。


8
根据PEP-308(docs.python.org/2.5/whatsnew/pep-308.html),如果将条件表达式放在paren中,则可以使条件表达式更清晰num1 = (20 if someBoolValue else num1)
haridsv

46

用这个:

num1 = 20 if someBoolValue else num1

3
这就是我一直在使用的..并寻找替代的..无论如何,谢谢!!
bdhar 2011年

如何调用该块?我的名字叫什么?
fuat

1
它是三元运算符
克里斯·梅斯

如果遍历大型数据集,则不应使用此方法,因为如果我们进入else语句,它将引入不必要的分配。
dapc

21

一行:

if someBoolValue: num1 = 20

但是不要那样做。通常不希望使用此样式。人们更喜欢较长的形式,以保持清晰度和一致性。

if someBoolValue:
    num1 = 20

(同样,应避免使用骆驼帽。因此请使用some_bool_value。)

注意,不存在没有部分的内联表达式 不存在,因为如果谓词为false,则不会有返回值。但是,在所有情况下,表达式必须具有明确定义的返回值。这与Ruby或Perl中的用法不同。some_value if predicateelse


2
因为它很难阅读,您可能最终会被自己的代码弄糊涂,这绝不是一个好主意。
弗罗斯特,

@bdhar,为什么要把它放在一行上?它不会运行得更快,只会让其他人更难以阅读
John La Rooy

1
@gnibbler,实际上没有理由。我一直在寻找更好的可读性较短的形式..
bdhar

17

您可以使用以下之一:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

1
一位不错的班轮有条件任务
minhas23 '17

该“结构”如何称呼?在学习Python的大约6个月中,我从未见过这样的事情。
Guimoute

1
至少这些不是作业,除非您在它们前面放一个,第二,它们将无法按此处描述的方式工作。第一个创建一个元组,然后通过索引选择其元素之一。由于它是的子类,因此仅适用于返回-1到1或True/ 之间的整数的测试。在所有测试返回的结果仅是true的情况下,它都会失败并出现异常。第二个仅在不评估假的情况下起作用,即使测试为真,也将导致分配蜂。FalseboolinttrueValfalseVal
巴绍(Bachsau)

它很短,但是要安全地用作“推荐模式” 也很棘手,请参见上面Bachsau的评论...(所以我对此表示反对)
tverrbjelke

6

不,我想您希望类似的方法num1 = 20 if someBoolValue可以工作,但是不行。我认为最好的方法就是if编写语句:

if someBoolValue:
    num1 = 20

5
num1 = 10 + 10*(someBoolValue is True)

那是我新的最终答案。先前的答复如下,并且对于所述问题过大。Getting_too_clever == not Good。这是先前的答案...如果您想为Truecond 添加一件事,为False:添加另一件事,还是不错的:

num1 = 10 + (0,10)[someBoolValue is True]

您提到num1的值已经应该保留。我假设num1 = 10因为这是该帖子的第一条语句,所以要进行的操作20是add 10

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue is True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

产生了这个输出

num1 = 20
someBoolValue = True

现在,我想我应该回答'num1 = 10 + 10 *(someBoolValue == True)'问题基本上被定义为“假”条件,即无操作。如果需要为“ False”添加不同的值,那么先前的答案比较合适。我要编辑我的帖子还是在评论中这样做?
MikeyB


2

如果希望在某个布尔值为true的情况下调用方法,则可以else None终止三进制。

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>

1

如果肯定要为您编写一行代码,Python 3.8会引入亲切的表达式,被称为“海象运算符”。

:=

someBoolValue and (num := 20)

如果第一个布尔表达式为,20则将分配给。赋值必须在括号内,否则会出现语法错误。numTrue

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10

0

对于来自Google的未来旅行者来说,这是一种新方法(可从python 3.8开始使用):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)

-1

如果需要,您绝对可以使用num1 =(如果someBoolValue为20,则为num1)。


上面的答案重复吗?
亚当·斯密

-1

这是我可以建议的。使用另一个变量派生if子句并将其分配给num1。

码:

num2 =20 if someBoolValue else num1
num1=num2


-1

您可以这样进行。

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

您可以通过这种方式解决问题,但是,使用“ try / except block”不是python的最佳实践。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.