Can';我们不能像if(y=Foo())>;2:用python?
我是python新手。 在C/C++中,在while或if语句中,我经常执行变量赋值。以下是C++中的一个简单示例代码:Can';我们不能像if(y=Foo())>;2:用python?,python,conditional-statements,variable-assignment,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
#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);
}
错误消息如下所示:
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)
在Python中,无法在表达式中指定变量 但是,由于循环永远循环,并且
Increment(x)
没有副作用,因此您可以这样做(行为相同):
Python和C(或C++)之间的区别在于,在Python中,赋值是一个语句,而在C(和C++)中,赋值是一个表达式 表达式可以是其他表达式的一部分,但语句是独立的。否,但您可以(必须)绑定到
for
循环中的变量。因此,对于您的示例,尝试停止使用C/C++进行思考,开始使用Python进行思考:使用for
循环,并将while
的条件部分移动到生成器中
不幸的是,您的示例实际上并没有做任何有用的事情,并且永远循环,但是大多数真实的示例将很快简化为比使用while
时更清晰的东西
对于给定的示例,您甚至不需要生成器,只需迭代调用Increment(x)
其生成器版本为:
>>> 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
它将复杂的循环逻辑与我们希望在每次迭代中执行的操作巧妙地分开。与其重复调用
Increment()
,我将以以下方式构造循环:
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"
或:
这段代码实际上并不是每次在循环中调用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))
然后,您可以将
itertools.takewhile
应用于其中任何一个。我知道您的代码只是示例,但也许下次尝试制作一些不会进入无限循环的示例代码?:)也可以省略x=2
@TimCastelijns好的点:p
>>> 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
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"
itertools.repeat(Increment(x))
iter(lambda: Increment(x))
itertools.imap(Increment, itertools.repeat(x))
itertools.imap(Increment, iter(lambda: x))