我是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)
答案 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的回答中,您可以使用Increment
和iter
来改变它。如果在循环中修改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")