不明白为什么 while(t-=1): 是 SyntaxError
Don't understand why while(t-=1): is a SyntaxError
我之前一直在用 C/C++ 编写代码。
在 C++ 中,以下代码运行良好。它打印 Hello 5 次。
int t = 5;
while (t--)
{
cout << "Hello";
}
上面的循环工作得很好。当 t
变为 0 时,循环条件将为假,循环将终止。
但是当我在 Python 中尝试类似的事情时:
t = 5
while (t-=1):
print("Hello")
它给出 SyntaxError: invalid syntax
。
我知道,在 python 中我们可以使用 1 == True 和 0 == False 逻辑。
那我的 Python 循环有什么问题?
打印 'Hello' 5 次 while
:
t = 5
while t:
print("Hello")
t -= 1
打印:
Hello
Hello
Hello
Hello
Hello
因为t -= 1
不是表达式,而是语句。本质上是:
t = t - 1
表达式为t - 1
,语句为t = <some_expression>
while
关键字需要一个表达式,可以是 (1) 函数调用,或 (2) 数学表达式。
所以,写作
while t -= 1:
相当于:
while t = t - 1:
因此是语法错误。
(作为对比,C 的递减运算符 --
是一个“有副作用的表达式”)
C(++),不像 Python,returns 赋值的赋值,所以它们是可以在条件等中使用的有效表达式。在 Python 中,你不能使用更简单的while t = 1:
,因为赋值t = 1
的值是None
,而不是1
;此外,它在语法上不是一个表达式 - 这就是为什么你得到 SyntaxError
.
海象运算符 :=
的引入恰恰是为了提供一种方法来做到这一点;但结果不是惯用的 Python.
# Requires Python >= 3.8; not a good example
t = 6 # Because the condition will be false and not print when you reach 0
while t := t-1:
print('Hello')
有些地方将赋值作为表达式是可以辩护的,但这并不是一个例子。 Python 是有意识地设计来避免这种类型的副作用,这可以说使 C 代码更紧凑,但一目了然更难理解,尤其是当您的表达式包含多个赋值时。
在 Python 中执行此操作的常用方法是
for t in range(5):
print('Hello')
或者,如果你真的坚持倒数,
for t in range(5, 0, -1):
print('Hello')
通常情况下,在 Python 中,您确实不需要显式循环多次使用相同的东西。
print('\n'.join(['Hello'] * 5))
或者,如果可以接受空格而不是换行符,
print(*['Hello'] * 5)
我之前一直在用 C/C++ 编写代码。
在 C++ 中,以下代码运行良好。它打印 Hello 5 次。
int t = 5;
while (t--)
{
cout << "Hello";
}
上面的循环工作得很好。当 t
变为 0 时,循环条件将为假,循环将终止。
但是当我在 Python 中尝试类似的事情时:
t = 5
while (t-=1):
print("Hello")
它给出 SyntaxError: invalid syntax
。
我知道,在 python 中我们可以使用 1 == True 和 0 == False 逻辑。
那我的 Python 循环有什么问题?
打印 'Hello' 5 次 while
:
t = 5
while t:
print("Hello")
t -= 1
打印:
Hello
Hello
Hello
Hello
Hello
因为t -= 1
不是表达式,而是语句。本质上是:
t = t - 1
表达式为t - 1
,语句为t = <some_expression>
while
关键字需要一个表达式,可以是 (1) 函数调用,或 (2) 数学表达式。
所以,写作
while t -= 1:
相当于:
while t = t - 1:
因此是语法错误。
(作为对比,C 的递减运算符 --
是一个“有副作用的表达式”)
C(++),不像 Python,returns 赋值的赋值,所以它们是可以在条件等中使用的有效表达式。在 Python 中,你不能使用更简单的while t = 1:
,因为赋值t = 1
的值是None
,而不是1
;此外,它在语法上不是一个表达式 - 这就是为什么你得到 SyntaxError
.
海象运算符 :=
的引入恰恰是为了提供一种方法来做到这一点;但结果不是惯用的 Python.
# Requires Python >= 3.8; not a good example
t = 6 # Because the condition will be false and not print when you reach 0
while t := t-1:
print('Hello')
有些地方将赋值作为表达式是可以辩护的,但这并不是一个例子。 Python 是有意识地设计来避免这种类型的副作用,这可以说使 C 代码更紧凑,但一目了然更难理解,尤其是当您的表达式包含多个赋值时。
在 Python 中执行此操作的常用方法是
for t in range(5):
print('Hello')
或者,如果你真的坚持倒数,
for t in range(5, 0, -1):
print('Hello')
通常情况下,在 Python 中,您确实不需要显式循环多次使用相同的东西。
print('\n'.join(['Hello'] * 5))
或者,如果可以接受空格而不是换行符,
print(*['Hello'] * 5)