没有其他的Python三元运算符

JCB*_*JCB 62 python ternary

是否可以在Python中的一行中执行此操作?

if <condition>:
    myList.append('myString')
Run Code Online (Sandbox Code Playgroud)

我试过三元运算符:

myList.append('myString' if <condition>)
Run Code Online (Sandbox Code Playgroud)

但我的IDE(MyEclipse)不喜欢它,没有else.

Cla*_*diu 89

是的,你可以这样做:

<condition> and myList.append('myString')
Run Code Online (Sandbox Code Playgroud)

如果<condition>为假,则短路将启动,右侧不会被评估.如果<condition>为true,则将评估右侧并附加元素.

我只想指出,做上述操作非常非pythonic,最好写这个,不管:

if <condition>: myList.append('myString')
Run Code Online (Sandbox Code Playgroud)

示范:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个答案在技术上是正确的,但这不是一个好的编程习惯.由于Python旨在成为一种易于阅读的语言,因此该代码将被视为非Pythonic. (5认同)
  • @LS:我同意,这就是为什么我说最好只使用if语句.但我稍微修改了答案以使其更清晰. (4认同)
  • 仅供参考,第二个示例将无法通过 pep8 检查:`E701 multiple statements on a line` 所以也是非 pythonic...;) (3认同)
  • @hard_working_ant 在这种情况下,“正确”的方法是 `x = object.get('attribute')` (2认同)
  • @wihlke:是的,并进一步添加 x = object.get('attribute', None) 以默认为 None (2认同)
  • @overflower dict.get 已经默认为 None 。 (2认同)

Emm*_*ler 32

语言不允许您使用语法的原因

variable = "something" if a_condition
Run Code Online (Sandbox Code Playgroud)

没有else那个,在这种情况下a_condition == False,variable突然不知道.也许它可以默认None,但Python要求所有变量赋值实际上都会导致显式赋值.这也适用于函数调用等情况,因为传递给函数的值的计算方式与赋值语句的RHS一样.

同样,所有returns必须实际返回,即使它们是有条件return的.例如:

return variable if a_condition
Run Code Online (Sandbox Code Playgroud)

不允许,但是

return variable if a_condition else None
Run Code Online (Sandbox Code Playgroud)

是允许的,因为第二个例子保证显式返回一些东西.

  • `else pass`不起作用,因为三元表达式应该返回一个可以传递给`return`的值.`pass`不是有效的`return`值. (4认同)
  • 具有讽刺意味的是,Python 不允许我们使用它,因此变量永远不是 none,但 `variable=None` 是完全合法的。:D (2认同)
  • 你可以做`else pass吗?` (2认同)
  • 鉴于`if a_condition:variable =“ something”`和`if a_condition:return variable'是合法的,所以我不同意这种动机是真正的原因。因此,它本质上是python的任意语法选择。 (2认同)

mgi*_*son 12

if <condition>: myList.append('myString')
Run Code Online (Sandbox Code Playgroud)

否则,没有.为什么需要把它放在一条线上?

注意,"三元运算符"是运算符.像任何操作员一样,它必须返回一些东西,那么如何在没有该else条款的情况下拥有一个三元运算符呢?如果条件不真实,应该返回什么?


Fil*_* W. 7

您基本上是在要求do_thing() if <condition> else pass构造(SyntaxError如果运行,它将抛出)。正如我在研究(某种程度上)时发现的那样,类似的问题 do_thing() if condition else None离您越近越好(这是另一种方法<condition> and do_thing())。因此,总结这个想法和其他答案,这里是您的选择:

  • if <condition>: myList.append('myString') -似乎是最少的“ hacky”(因此是首选)方式
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None


小智 5

如果我想根据条件向列表添加可选元素,i\xe2\x80\x99d 就这样做。

\n
nums = [\n        1,\n        2,\n        3 if <condition> else None,\n        4,\n       ]\n\n# nums now contains values of `None`, so we delete all occurrences of `None`\nnums.remove(None)\n
Run Code Online (Sandbox Code Playgroud)\n

如果不满足条件,这只是用 None 替换该值,然后,它只是重新定义没有 None 值的列表。\n这样,如果满足条件,它们会保留索引

\n