A = 200
B = -140
C = 400
D = -260
if A < 0:
v1 = 0
else:
v1 = A
if B < 0:
v2 = 0
else:
v2 = B
if C < 0:
v3 = 0
else:
v3 = C
if D < 0:
v4 = 0
else:
v4 = C
上述代码结构的简写实现是什么?有没有更好/优雅/方便的方法来做到这一点?
A = 200
B = -140
C = 400
D = -260
if A < 0:
v1 = 0
else:
v1 = A
if B < 0:
v2 = 0
else:
v2 = B
if C < 0:
v3 = 0
else:
v3 = C
if D < 0:
v4 = 0
else:
v4 = C
上述代码结构的简写实现是什么?有没有更好/优雅/方便的方法来做到这一点?
A = 200
B = -140
C = 400
D = -260
v1, v2, v3, v4 = [x if x > 0 else 0 for x in (A, B, C, D)]
如果您更喜欢将max
函数用于 python 三元运算符,它看起来像:
v1, v2, v3, v4 = [max(x, 0) for x in (A, B, C, D)]
但是,如果您计划对所有这些变量进行相同的处理,您可能需要首先考虑将它们放在列表/元组中。
values = [200, -140, 400, -260]
values = [max(x, 0) for x in values]
这可以通过使用内置max()
函数和解包列表理解轻松解决。
v1, v2, v3, v4 = [max(x, 0) for x in [a, b, c, d]]
另一种解决方案是使用该map()
函数 - 但是,它的可读性较差:
v1, v2, v3, v4 = map(lambda x: max(x,0), [a, b, c, d])
min()
使用和进行健全性检查max()
。
v1 = max(0, A)
作为mgilson 出色答案的替代方法,您可以将子类int
化为自定义类来实现这一点
>>> class V(int):
... def __new__(cls,val,**kwargs):
... return super(V,cls).__new__(cls,max(val,0))
然后直接使用:
>>> A=V(200)
200
>>> B=V(-140)
0
>>> [V(i) for i in [200, -140, 400, -260]]
[200, 0, 400, 0]
>>> A,B,C,D = [V(i) for i in [200, -140, 400, -260]]
这样做的唯一好处是您可以适当地覆盖__sub__
,__add__
__mul__
然后您的 V ints 将始终大于 0,即使您有a=V(50)-100
例子:
>>> class V(int):
... def __new__(cls,val,**kwargs):
... return super(V,cls).__new__(cls,max(val,0))
... def __sub__(self,other):
... if int.__sub__(self,other)<0:
... return 0
... else:
... return int.__sub__(self,other)
>>> a=V(50)
>>> b=V(100)
>>> a-b #ordinarily 50-100 would be -50, no?
0