我有以下代码
num1 = 10
someBoolValue = True
如果 someBoolValue
是 True
,我需要将 num1
的值设置为 20
;否则什么也不做。所以,这是我的代码
num1 = 20 if someBoolValue else num1
有什么办法可以避免 ...else num1
部分使其看起来更干净吗?相当于
if someBoolValue:
num1 = 20
我尝试将其替换为 ...else pass
,如下所示:num1=20 if someBoolValue else pass
。我得到的只是语法错误。我也不能省略 ...else num1
部分。
num1 = 20 if someBoolValue else 10
。然后你也保存 num1=10
行吗?
num1
已经存在...
我认为这在 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 的工作方式略有不同。
用这个:
num1 = 20 if someBoolValue else num1
在一行中:
if someBoolValue: num1 = 20
但不要那样做。这种风格通常不是预期的。为了清晰和一致,人们更喜欢较长的形式。
if someBoolValue:
num1 = 20
(同样,应该避免骆驼帽。所以宁愿使用 some_bool_value
。)
请注意,不存在没有 else
部分的内联 表达式 some_value if predicate
,因为如果谓词为 false,则不会有返回值。但是,表达式在所有情况下都必须具有明确定义的返回值。这与在 Ruby 或 Perl 中的用法不同。
您可以使用以下方法之一:
(falseVal, trueVal)[TEST]
TEST and trueVal or falseVal
True
/False
的测试,因为 bool
是 int
的子类。在所有情况下,如果测试返回的东西只会评估为真,它就会失败并出现异常。第二个只有在 trueVal
本身不评估 false 时才有效,即使测试为 true,也会导致分配 falseVal
。
对于来自 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)
如果你肯定会遇到一行代码,Python 3.8 引入了被亲切地称为“海象运算符”的 assignment expressions。
:=
someBoolValue and (num := 20)
如果第一个布尔表达式是 True
,则 20
将分配给 num
。赋值必须在括号内,否则会出现语法错误。
num = 10
someBoolValue = True
someBoolValue and (num := 20)
print(num) # 20
num = 10
someBoolValue = False
someBoolValue and (num := 20)
print(num) # 10
不。我猜你希望像 num1 = 20 if someBoolValue
这样的东西会起作用,但事实并非如此。我认为最好的方法是使用您编写的 if
语句:
if someBoolValue:
num1 = 20
num1 = 10 + 10*(someBoolValue is True)
这是我新的最终答案。先前的答案如下,对于所述问题来说太过分了。 Getting_too_clever == not Good
。这是先前的答案...如果您想为 True
cond 添加一件事并为 False
添加另一件事,仍然很好:
num1 = 10 + (0,10)[someBoolValue is True]
您提到 num1
已经有一个值,应该不理会。我假设 num1 = 10
因为这是帖子的第一条语句,所以到达 20
的操作是添加 10
。
num1 = 10
someBoolValue = True
num1 = 10 + (0,10)[someBoolValue is True]
print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')
产生了这个输出
num1 = 20
someBoolValue = 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
>>>
num1 = 20 * someBoolValue or num1
这是我可以建议的。使用另一个变量来派生 if 子句并将其分配给 num1。
代码:
num2 =20 if someBoolValue else num1
num1=num2
如果需要,您绝对可以使用 num1 = (20 if someBoolValue else num1) 。
另一种方式num1 = (20*boolVar)+(num1*(not boolVar))
你可以这样做。
try:
a = [i for i in [20] if False][0]
except IndexError:
print("Do what ever you want here")
您可以通过这种方式解决您的问题,但是使用“try/except 块”并不是 python 的最佳实践。
不定期副业成功案例分享
num1 = (20 if someBoolValue else num1)
。my_var
为 0,则num_cats = math.ceil(num_humans / my_var) if my_var > 1 else 1
生成除以零,即使该代码的条件为假