Python 3 条件变量选择增量
Python 3 conditional variable selection increment
我目前正在做一个项目,其中有很多不同的会计,我经常看到这种模式:
if A > X:
B += 1
else:
C += 1
我知道三元运算符,但如果我理解正确,最短的使用方法是:
B += 1 if A > X else False
C += 1 if A <= X else False
因为三元运算符连接到其头部使用的变量。所以从计算和可读性的角度来看,使用三元运算符显然比以前的 if/else
差。
另一个想法是创建一个像这样的简单函数:
conditional_bumper(positive_case_var, negative_case_var, condition_var, compare_to=0)
那么用法如下:
conditional_bumper(B, C, A, X) # X being optional
所以我每次看到它都可以写成一行,但同时在我看来这是一个非常 'hacky' 的解决方案。有没有更好的方法我没看到?
我认为您的代码可读性越高越好。 “一行”代码有效但不可行
这不是一行,但您可以通过增量乘以布尔表达式来增加每个变量
inc = 1
B += inc * (A > X)
C += inc * (A < X)
或者你可以使用这个
inc = 1
B += inc * (A > X); C += inc * (A < X)
如果你真的追求 one-liner 并且不关心可读性(你不应该),你可以使用这个老把戏(以构建列表和有点神秘为代价代码)
A = 2
B = 0
C = 0
X = 3
CB = [C, B]
print(CB)
CB[A > X] += 1
print(CB)
# [0, 0]
# [1, 0]
请注意 C
和 B
本身未被修改,更改仅通过 CB
列表可见。
这是有效的,因为 A > X
计算为 True
或 False
,可用于索引,因为 bool
子类 int
.
使用字典的更好方法
另一个不那么神秘的选项是使用 dict
代替。我认为这实际上是一个更好的选择。你甚至可以使用全名:)
A = 2
X = 3
times_a_greater_than_x = {True: 0, False: 0}
times_a_greater_than_x [A > X] += 1
print(times_a_greater_than_x )
# {True: 0, False: 1}
增强使用函数的想法:
def inc_if(condition, true_var, false_var):
if condition:
true_var += 1
else:
false_var += 1
return (true_var, false_var)
B, C = inc_if(A > X, B, C)
这是非常可读的,因为它可以从左到右阅读为“如果 A > X 则递增”,然后是 if 子句中的变量,最后是 else 子句中的变量。
变量需要由函数返回并重新赋值,除非使用全局变量。
如果 X 在条件中变化但 A
、B
和 C
保持不变,您可以重构为一个简单的循环。
for X in (1, 2, 3, 5, 7, 13, 17, 23):
if A > X:
B += 1
else:
C += 1
试试这个朋友!希望这能让你对这件事有所了解。干杯!
# declare and initialize variables
B, C = 0, 0
A, X = 1, 2
# ternary operator to work with this conditional
B,C = (B + 1, C) if A > X else(B,C + 1)
#display results
print(B,C)
我目前正在做一个项目,其中有很多不同的会计,我经常看到这种模式:
if A > X:
B += 1
else:
C += 1
我知道三元运算符,但如果我理解正确,最短的使用方法是:
B += 1 if A > X else False
C += 1 if A <= X else False
因为三元运算符连接到其头部使用的变量。所以从计算和可读性的角度来看,使用三元运算符显然比以前的 if/else
差。
另一个想法是创建一个像这样的简单函数:
conditional_bumper(positive_case_var, negative_case_var, condition_var, compare_to=0)
那么用法如下:
conditional_bumper(B, C, A, X) # X being optional
所以我每次看到它都可以写成一行,但同时在我看来这是一个非常 'hacky' 的解决方案。有没有更好的方法我没看到?
我认为您的代码可读性越高越好。 “一行”代码有效但不可行
这不是一行,但您可以通过增量乘以布尔表达式来增加每个变量
inc = 1
B += inc * (A > X)
C += inc * (A < X)
或者你可以使用这个
inc = 1
B += inc * (A > X); C += inc * (A < X)
如果你真的追求 one-liner 并且不关心可读性(你不应该),你可以使用这个老把戏(以构建列表和有点神秘为代价代码)
A = 2
B = 0
C = 0
X = 3
CB = [C, B]
print(CB)
CB[A > X] += 1
print(CB)
# [0, 0]
# [1, 0]
请注意 C
和 B
本身未被修改,更改仅通过 CB
列表可见。
这是有效的,因为 A > X
计算为 True
或 False
,可用于索引,因为 bool
子类 int
.
使用字典的更好方法
另一个不那么神秘的选项是使用 dict
代替。我认为这实际上是一个更好的选择。你甚至可以使用全名:)
A = 2
X = 3
times_a_greater_than_x = {True: 0, False: 0}
times_a_greater_than_x [A > X] += 1
print(times_a_greater_than_x )
# {True: 0, False: 1}
增强使用函数的想法:
def inc_if(condition, true_var, false_var):
if condition:
true_var += 1
else:
false_var += 1
return (true_var, false_var)
B, C = inc_if(A > X, B, C)
这是非常可读的,因为它可以从左到右阅读为“如果 A > X 则递增”,然后是 if 子句中的变量,最后是 else 子句中的变量。
变量需要由函数返回并重新赋值,除非使用全局变量。
如果 X 在条件中变化但 A
、B
和 C
保持不变,您可以重构为一个简单的循环。
for X in (1, 2, 3, 5, 7, 13, 17, 23):
if A > X:
B += 1
else:
C += 1
试试这个朋友!希望这能让你对这件事有所了解。干杯!
# declare and initialize variables
B, C = 0, 0
A, X = 1, 2
# ternary operator to work with this conditional
B,C = (B + 1, C) if A > X else(B,C + 1)
#display results
print(B,C)