#python #python-turtle
Вопрос:
У меня есть упражнение в школе, где мы должны использовать sys
модуль для чтения файла сценария, содержащего инструкции для turtle
модуля. Файл сценария .trtl
-это файл.
Он содержит следующую информацию, отформатированную следующим образом:
Walk
100
Turn
90
Walk
50
Turn
90
Walk
100
Turn
90
Walk
50
Я попробовал этот код:
import sys
import turtle
for idx, line in enumerate(sys.stdin):
move = 0
while (idx % 2) == 0:
move = line
while (idx % 2) != 0:
if line == "Walk":
forward(move)
elif line == "Turn":
left(move)
когда я пытаюсь запустить этот код с помощью stdin из файла сценария, мой терминал просто переходит к следующей строке, ничего не делая. Я вижу, что программа запущена, и могу KeyboardInterrupt
это сделать, но окно не появляется.
Любая помощь будет очень признательна!
Комментарии:
1. Вы пробовали распечатать свои строки (с чем-то вроде
print(f'->{line}<-')
того, чтобы узнать точное значение строки? Это может помочь вам определить, есть ли скрытый символ, который вы не замечаете в конце вашей строки . 😉2. @blackbrandt Мне кажется, я понимаю, что ты имеешь в виду. Теперь я вставляю «line = line.rstrip ()» в цикл, и теперь открывается окно! Спасибо! Однако Черепаха все еще не двигается.
3. Было слишком много проблем, которые я мог бы прокомментировать, поэтому я добавил ответ со всеми исправлениями.
Ответ №1:
Ваша проблема связана с двумя основными проблемами:
- При чтении строки из файла будет прочитана ВСЯ строка, включая символ новой строки в конце. Использование
.rstrip()
метода удалит это. - Чтение строки из файла считывает строку. Вы должны принудить его к тому типу, который вам нужен. Например, когда вы читаете строку
100
, вы читаете в 4 байтах:'1', '0' '0' 'n'
, а не число 100. Вам нужно будет добавитьint()
принуждение, а также убрать конецn
этих строк. - Прочитайте о разнице между
if
утверждением иwhile
утверждением.if
Оператор проверит логическое значение своего аргумента и решит, следует ли выполнять следующий блок кода или нет.while
Цикл будет проходить по коду до тех пор, пока существует логический операторtruthy
.
Есть еще несколько проблем с вашим кодом, на которые я укажу в комментариях.
Исправление вашего кода:
import sys
import turtle
for idx, line in enumerate(sys.stdin):
#Strip trailing character
line = line.rstrip()
#Change if to while
if (idx % 2) == 0:
#Coerce value to int instead of string
move = int(line)
# idx % 2 will either be 0 or not 0, no need to check twice.
# If it is not 0, then this else statement will run
else:
#Now that line has been stripped of trailing chars, we can check
if line == "Walk":
forward(move)
#Alternately, we can use
# if line.startswith("Walk"):
# and not have to do an rstrip
elif line == "Turn":
left(move)
Ответ №2:
Для развлечения, альтернатива подробному решению @blackbrandt ( 1), которое, хотя и лаконично, также легче расширить до дополнительных монадических операторов:
import sys
import turtle
commands = {'Walk': turtle.forward, 'Turn': turtle.left}
for command, argument in zip(sys.stdin, sys.stdin):
if method := commands.get(command.rstrip()):
method(int(argument))
turtle.exitonclick()
Комментарии:
1. Нашел функционального программиста. Это похоже на ввод кода в гольф 😉