Не понимаю, почему while(t-=1): является синтаксической ошибкой

#python #while-loop

Вопрос:

Я уже писал код на C/C раньше.

В C приведенный ниже код работает нормально. Он печатает «Привет» 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?

Комментарии:

1. В Python 0 не означает False . Вы должны изменить условие на что-то вроде while (not (t -= 1) == 0)

2. Ну, похоже, вы только что заметили, что Python и C имеют разные синтаксисы. Здесь: Присвоения не допускаются в выражениях. Исключение: новый := оператор.

3. В Python это так while t := t - 1: , но мы бы написали for t in range(5): цикл пять раз.

4. Это означает, что вы не знаете языка Python. Stackoverflow не предназначен для замены существующих учебных пособий или документации.

5. Не существует разумного эквивалента для t-- . Существует разумный эквивалент --t , который находится t := t - 1 в текущих версиях python. Неразумным способом реализации t-- является (s:=t) and (t:=t-1) or s … но это зависит от контекста, в котором t-- используется. Например , это выражение перестанет уменьшаться после достижения 0 , если вы хотите перейти к негативам, вам нужно что-то еще


Ответ №1:

C( ), в отличие от Python, возвращает присвоенное значение из назначений, и поэтому они являются допустимыми выражениями, которые вы можете использовать в условиях и т. Д. В 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)
 

Комментарии:

1. Python print предоставляет новую строку в конце. Вы можете избежать этого с print('Hello', end='') помощью ; но опять же, много раз вы просто предоставляли бы полный вывод в качестве аргумента print() , а затем не нужно было бы явно добавлять новую строку после.

Ответ №2:

Потому t -= 1 что это не выражение, это утверждение. Это в сущности:

 t = t - 1
 

Выражение таково t - 1 , утверждение таково t = <some_expression>

while Ключевое слово требует выражения, которое может быть (1) вызовом функции или (2) математическим выражением.

Итак, написание

 while t -= 1:
 

эквивалентно:

 while t = t - 1:
 

и, таким образом, является синтаксической ошибкой.

(В отличие от этого, оператор декремента C -- является «выражением с побочным эффектом»)

Ответ №3:

Чтобы напечатать «Привет» 5 раз с помощью while :

 t = 5
while t:
    print("Hello")
    t -= 1
 

С принтами:

 Hello
Hello
Hello
Hello
Hello