Python:简化条件表达式

3

快捷条件表达式:

expression1 如果 condition 为真 否则 expression2
例如:x=1 if a>3 else 2
但是:我能在开头有两个表达式吗?
x=1,b=3 if a>3 else 2
感谢 >idontknow,解决方案如下:

    previousTime,BS_Count=(db_row_to_list[0][14],BS_Count+1) if db_row_to_list[0][14] is not None else (db_row_to_list[0][3],BS_Count)

3
为什么你不直接自己试试呢? - Random Davis
你好!你能告诉我们更多关于这些表达式的使用情况吗?一些背景信息肯定会很有帮助! - idontknow
没关系,我现在理解你的问题了。 - idontknow
1
@RandomDavis 我认为这是因为它对OP没有起作用,他们想学习如何做类似的事情。 - idontknow
5个回答

4

不太对。对于这种情况,可以使用if语句。

if a > 3:
    x = 1
    b = 3
else:
    x = 2
    b = None

如果你希望将所有内容变成一行,你可以在Python中使用元组解包。元组解包基本上是将元组中的元素作为变量存储,而不是作为元组的元素。

这个概念的一个应用是这样的:

x, b = (1, 3) if a > 3 else (2, None)

请注意,这是一行代码! 编辑:回答您更新后的问题,您可以使用以下较短的代码。我认为效果将是相同的。
a = 3
b = 7
c = 6
a, b = (8, b+1) if c > 3 else (5, b)
print(a, b)

感谢那些回答“元组”的人。在我的实际代码中:我想把'count+=1'放在第二个表达式中。但我觉得这不可能。不过我认为我可以把它放在一个函数中:num=doIt() if a>3 else 5,在doIt()函数内部我可以增加我的计数。 - pythonDerby
@pythonDerby 你能详细说明一下吗?你想要做什么?对于你的情境来说,这样做是否有意义?points += (100 if answer_correct is True else 0) - idontknow
我已经在下面添加了上下文>>(即不易在这些评论框中!) - pythonDerby
@pythonDerby 你可以随时编辑你的原始问题来提供上下文。 - idontknow
a,b = (8,b + 1)if c > 3 else(5,b),我曾尝试过这样做,但是我尝试了“b+=1”,当我遇到错误时,我放弃了那个实验;)再次感谢。 - pythonDerby

2
在您的示例中:
x=1 if a>3 else 2

条件表达式部分是:
1 if a>3 else 2

因此,您将条件表达式的结果分配给x

在您的第二个示例中,这是无效的语法:

x=1,b=3 if a>3 else 2

那是因为它相当于:

(1,b)=3 if a>3 else 2

或者,举个更简单的例子:
(1,b)=3

这是无效的语法,因为你不能在Python中做像1 = 3这样的事情,这就是那段代码试图做的。尽管如果元组的两个元素都不是字面常量,你会得到一个不同的错误:

(b,a)=3
TypeError: cannot unpack non-iterable int object

因此,如果您想使用条件表达式进行多个赋值操作,可以使条件表达式返回一个元组,并将左侧设为要分配值的两个变量的元组:

x,b=(1, 3) if a>3 else (2, 2)

这相当于:

if a > 3:
    x = 1
    b = 3
else:
    x = 2
    b = 2

这是我理解你最初的代码意图所做的。

谢谢,我试图将if-else语句放入一行中,但我猜在Python中这是不可能的... 目前还不支持!if db_row_to_list[0][14] is not None: previousTime=db_row_to_list[0][14] BS_Count+=1 else: db_row_to_list[0][3] - pythonDerby

1
你可以使用元组(tuples):
>>> a = 4
>>> (x, b) = (1, 3) if a > 3 else (2, 2)
>>> x
1
>>> b
3
>>>

0

语句x = 1, b = 3 if a > 3 else 2是无效的。不过你仍然可以使用一行代码:

x, b = 1 if a > 3 else 2, 3 if a > 3 else 2

这将把 x 的值设置为 1 if a > 3 else 2,并将 b 的值设置为 3 if a > 3 else 2


0

背景信息:这是实际的代码 >

     if db_row_to_list[0][14] is not None:  
        previousTime=db_row_to_list[0][14]    
        BS_Count+=1  
     else:  
        db_row_to_list[0][3] 

我可以这样做:使用一个函数>,但这样会更好吗?

     num=3  
     num1=7
     def doIt():
        print("doIt()")
        global num,num1
        num=8
        num1+=1
        return num

     a=6
     num=doIt() if a>3 else 5
     print(num," ",num1)

我已根据这个上下文更新了我的回答。 - idontknow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接