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]

请注意 CB 本身未被修改,更改仅通过 CB 列表可见。

这是有效的,因为 A > X 计算为 TrueFalse,可用于索引,因为 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 在条件中变化但 ABC 保持不变,您可以重构为一个简单的循环。

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)