Почему я получаю неожиданную строку при использовании .format для нарезки списка? - PullRequest
2 голосов
/ 23 октября 2019

Я пытаюсь создать игру в камень, ножницы, бумагу. Однако, когда я пытаюсь отформатировать строку внутри функции ввода с использованием среза, я получаю следующее: Choose Rock, Sciss or Scissors:

Я использую следующий скрипт:

options = ['rock', 'paper', 'scissors']

def rock_paper_scissors():
    x = ''
    for option in options:
        if x == '':
            x += option.title()
    else:
        x += ', ' + option.title()

    player = input('Choose {} or {}:'.format(x[0:11], x[-8:]))

1 Ответ

1 голос
/ 23 октября 2019

Это не срезы, которые идут не так, это конструкция строки. Вы должны отступить блок else: немного больше. Для справки попробуйте print() -ing x перед вводом команды.

Что произошло

Петли Python for могут иметь предложение else:. Они выполняются, если цикл не завершается break или return. Следовательно, ваш цикл только что-то делал на первой итерации, в то время как x был пустой строкой, а затем предложение else изменило бы вашу строку на option, все еще привязанный к последней итерации вашего цикла.

Edit

Возможно, я немного привык к Code Review, но я бы посоветовал сделать конструкцию иначе, примерно так:

player_move = input(f"Choose {', '.join(options[:-1])} or {options[-1]}")

Обратите внимание, что это будет толькоработать на 3+ длины для вариантов. Чтобы получить подходящую нить для меньшего количества вариантов, требуется более ... элегантная конструкция.

...