我们不能做像if(y = Foo())>这样的事情。 2:在python中?

时间:2015-09-18 07:57:01

标签: python conditional-statements variable-assignment

我是python的新手。 在C / C ++中,在while或if语句中,我经常进行变量赋值。以下是C ++中的一个简单示例代码:

#include <iostream>

int Increment(const int x) {
  return (x + 1); 
}

int main(void) {
  int x = 2, y;
  while ((y = Increment(x)) > 2) {
    std::cout << "y is larger than 2" << std::endl;
  }

  return (0);
}

但是下面的python代码不起作用:

#!/usr/bin/python

def Increment(x):
  return x + 1

def main():
  x= 2
  while (y = Increment(x)) > 2:
    print "y is larger than 2"

if __name__ == "__main__"
  main()

错误消息如下:

   while (y = Increment(x)) > 2:
          ^
SyntaxError: invalid syntax

似乎在python中,不可能在比较语句中进行变量赋值吗?那么,在python中执行此操作的最佳方法是什么?

def main():
x = 2
  y = Increment(x)
  while y > 2:
    print "y is larger than 2"
    y = Increment(x)

4 个答案:

答案 0 :(得分:7)

Python和C(或C ++)之间的区别在于Python赋值是语句,而在C(和C ++)中赋值是表达式

表达式可以是其他表达式的一部分,但语句是独立的。

答案 1 :(得分:2)

不,但您可以(必须)绑定到for循环中的变量。因此,对于您的示例,尝试停止在C / C ++中思考并开始使用Python进行思考:使用for循环并将while的条件部分移动到生成器中。

不幸的是,你的例子实际上没有做任何有用的事情并且永远循环,但是大多数真实的例子会很快简化为比while更清晰的东西。

根据给出的示例,您甚至不需要生成器,只需将调用迭代到Increment(x)

#!/usr/bin/python

def Increment(x):
  return x + 1

def main():
  x= 2
  for y in iter(lambda: Increment(x)):
      if y <= 2: break
      print "y is larger than 2"

if __name__ == "__main__"
  main()

如果指示完成的函数有固定的返回值(例如,None表示数据结束),则iter()的两个参数版本很有用,您不需要单独检查:

>>> def collatz(x):
    if x%2:
        return 3*x+1
    return x//2

>>> x = 5
>>> for y in iter(lambda: collatz(x), 1):
    print(y)
    x = y


16
8
4
2

它的生成器版本将是:

>>> def collatz(x):
    while x != 1:
        x = 3*x+1 if x%2 else x//2
        yield x

>>> for y in collatz(7):
    print(y, end=' ')


22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 

它巧妙地将复杂循环逻辑与我们想要在每次迭代中执行的操作分开。

答案 2 :(得分:2)

不是重复对.classname::-moz-placeholder {....}的调用,而是以这种方式构造循环:

Increment()

这也在The Python design FAQ中讨论,它建议使用相同的代码。

FAQ还提到了使用迭代:

x = 2
while True:
    y = Increment(x);
    if not y > 2:
        break
    print "y is larger than 2"

或者:

for y in itertools.repeat(Increment(x)):
    if not y > 2:
        break
    print "y is larger than 2"

这段代码实际上并不是每次在循环中调用from itertools import takewhile, repeat for y in takewhile(lambda y: y > 2, repeat(Increment(x)): print "y is larger than 2" ,而是依赖于每次都知道它是相同的值。但正如在Duncan的回答中,您可以使用Incrementiter来改变它。如果在循环中修改lambda,则需要某种类型的东西。以下任何一个都将进行迭代,并且根据实际代码与此示例的不同之处,您可能希望将代码基于其中任何一个。例如,x可以轻松更改为itertools.repeat(x)itertools.count(x)或任何其他迭代器,而在xrange(x)中,iter(lambda: x)可以轻松更改为您喜欢的任何其他表达式

x

然后,您可以将itertools.repeat(Increment(x)) iter(lambda: Increment(x)) itertools.imap(Increment, itertools.repeat(x)) itertools.imap(Increment, iter(lambda: x)) 应用于其中任何一个。

答案 3 :(得分:0)

无法在Python中为表达式分配变量。

但是,由于你的循环永远循环,并且Increment(x)没有副作用,你可以这样做(它的行为相同):

def main():
    while True:
        print("y is larger than 2")