【问题标题】:Variable assignment in expressions表达式中的变量赋值
【发布时间】:2010-11-12 04:20:49
【问题描述】:

这是我在斐波那契数列中生成低于 10,000,000 的值的代码。

  3 fibs = [1,1]
  4 while((x = fibs[-1] + fibs[-2]) <= 10000000):
  5     fibs.append(x)

我尝试在 while 循环的条件下对 x 进行 C 风格的赋值。不幸的是,python 告诉我这是一个语法错误。什么是最简单的解决方案?

【问题讨论】:

  • 你用什么教程来学习Python?你在哪里见过这样的 Python 代码?语言手册的哪一部分暗示这可能有效?是什么让你认为这是合法的语法?

标签: python c


【解决方案1】:

In Python, assignment is not an expression, and therefore has no value.

最简单的解决方案是在循环的第一部分进行赋值:

fibs=[1,1]
while fibs[-1] <= 10000000:
   fibs.append(fibs[-1] + fibs[-2])

【讨论】:

  • 该死,我比我自己更喜欢这个。
  • 复活这个,注意赋值表达式很快就会变成一个东西:python.org/dev/peps/pep-0572
【解决方案2】:

基本上:

fibs = [1]
x = 1

while(x <= 10000000):
  fibs.append(x)
  # It is not possible for "fibs" not to have
  # at least two elements by now
  x = fibs[-1] + fibs[-2]

(事实上,Python 的设计目标之一是避免像 C 那样混合表达式和赋值——这就是为什么没有 x++x--,这也是一个半常见问题解答。)

【讨论】:

    【解决方案3】:

    不允许在 Python 表达式中赋值的原因是其他语言中一个常见的、难以发现的错误,由这种结构引起。

    请检查 http://effbot.org/pyfaq/why-can-t-i-use-an-assignment-in-an-expression.htm

    【讨论】:

      【解决方案4】:
      from functools import partial
      from itertools import imap, islice, takewhile
      import operator
      fibs = [1, 1]
      for x in takewhile(partial(operator.ge, 10000000),
                         imap(operator.add, fibs, islice(fibs, 1, None))):
          fibs.append(x)
      

      哦等等,你说“最简单”?那没关系。

      【讨论】:

        猜你喜欢
        • 2017-04-21
        • 2011-11-05
        • 2017-04-07
        • 2014-12-30
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-16
        相关资源
        最近更新 更多