#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('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