【问题标题】:Python's syntactical sugar gone wrongPython 语法糖出了问题
【发布时间】:2014-02-03 17:19:57
【问题描述】:

我正在查看here 列出的代码,它们提供了一个非常有趣的结构来在线用 Python 编写“时钟”。我以前从未见过这种古怪的语法,老实说,我不知道它是如何工作的。这在 Python 中完全是黑魔法。但即使它不是编写作者意图的最 Pythonic 方式,我仍然想知道它是如何运作的。

qClock = (lambda:0, time.clock)[qDuration > 0]
qDuration = (1, (qClock() + qDuration))[qDuration > 0]

我的过程:

  • qClock 返回 True 表示持续时间已过
  • qDurration 以 int 开头,但后来改为 lambda 函数?
  • 为什么每个列表的末尾都有列表?我觉得这些不是列表。

【问题讨论】:

    标签: python


    【解决方案1】:

    这是编写三元条件的一种古老方式。应该是:

    qClock = time.clock if qDuration > 0 else lambda: 0
    qDuration = (qClock() + qDuration) if qDuration > 0 else 1
    

    在引入三元条件 (link) 的 Python 2.5 之前,您可以通过创建 2 元素元组并使用布尔表达式对其进行索引来模拟它,因为 False 被视为 0True作为1

    【讨论】:

    • qClock lambda 与time.clock 设置是为了解决“布尔索引”技巧不会延迟评估的事实。并不是说调用time.clock() 有那么贵,真的..
    【解决方案2】:

    在 Python 中,boolint 的子类,因此布尔值是 0 或 1,具体取决于值 FalseTrue

    因此,qClock 被设置为 lambda: 0time.clock,这取决于 qDuration 是否大于 0。

    然后将qDuration 设置为1qClock() + qDuration

    你可以把它翻译成:

    qDuration = time.clock() + qDuration if qDuration else 1
    

    它更短且更具可读性。去图吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2011-04-21
      • 1970-01-01
      • 2010-10-19
      • 2015-05-24
      • 1970-01-01
      相关资源
      最近更新 更多