不明白为什么 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)