【问题标题】:Why is this ternary operator syntax invalid?为什么这个三元运算符语法无效?
【发布时间】:2017-12-09 18:56:00
【问题描述】:

我正在尝试编写一个简单的三元运算符,它在 ruby​​ 中看起来像这样:

0 > 1 ? alice+=1 : bob+=1

我是这样用python写的:

alice += 1 if 0 > 1 else bob += 1

此三元运算符在 bob+=1 处引发无效语法。为什么会发生这种情况,我怎样才能让第二个操作员按照与第一个操作员相同的方式执行?

【问题讨论】:

  • 三元运算符只能写表达式,不能写语句
  • 因为bob += 1 是一个语句,而不是一个表达式
  • 如何渲染bob+=1 一个表达式?为什么alice+=1 是一个表达式,而bob+=1 是一个语句?
  • 这两个都是扩充的赋值语句,而不是表达式。不清楚你想要什么。
  • 赋值不能在 Python 中永远不能是表达式。您可以将逻辑包装在一个函数中并调用它(函数调用是一个表达式)

标签: python ternary-operator


【解决方案1】:

三元语法是一个表达式;您已尝试将其用作单行if-then-else。您可以选择增量值,它来自等式的 RHS,例如:

alice += 1 if bob > 1 else 0

...但是您不能像这样更改作业的目标。如果你真的需要这样做,你可以为 LHS alice, bob 分配一个自定义元组,但这似乎有点过头了。只需使用自然的if 语句

if 0 > 1:
    alice += 1
else:
    bob += 1

最终的执行代码将是相同的,并且源代码更具可读性。

【讨论】:

  • 好吧,这是有道理的。那么 Python 中的三元与 ruby​​ 中的三元有很大的不同吗?它似乎对变量的分配比对语句的评估更有用。 python 是否只是缺乏以流线型方式执行这种布尔逻辑的能力?
  • 对。大多数具有“三元”运算符的语言都使用旧版definition。面向表达式的语言,例如 C 或 Ruby,可以选择允许将完整语句作为表达式。 Python 和 C 选择不走那么远。 Ruby 做到了。
  • Python 的逻辑路径相当有能力。基本原理文档中可能有一些东西解释了为什么三元运算符以这种方式工作。我只是还没有找到它。
  • 对......但我很确定 C 不允许在三元表达式中进行赋值。 Python 也不行——例如,它允许 a = b = c = -1
  • @Prune 好的,重点是,我意识到 C 因经验结果不一定能代表标准而臭名昭著……但我对 C 标准的阅读并不深入,所以也许它 写在某处“赋值语句不能在三元运算符中使用”。
猜你喜欢
  • 2020-04-12
  • 2011-07-13
  • 2010-11-20
  • 2020-11-05
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
相关资源
最近更新 更多