Зациклить переменную для поля ввода внутри оператора for в Python

Я хочу показать пользователям другое поле ввода, но это не сработает, если я не сделаю это внутри цикла For для new_urlnew_url = input("Please enter new URL for a screenshot (press return to stop): ").strip(), но я хочу переместить поле ввода куда-нибудь за пределы цикла For, поэтому я попытался сделать это для поля ввода например new_url = new_url_input, возьмите переменную new_url_input и добавьте ее где-нибудь еще в моем коде, например new_url_input = input("Please enter new URL for a screenshot (press return to stop): ").strip(), но когда я это делаю, код отображается только один раз, но он должен работать так, как когда пользователь нажимает ввод, он показывает другое поле ввода. См. этот вопрос ответ для получения дополнительной информации о моей теме.

Оригинальный код:

# Load the data
file_name = file_name = path/to/json/file
with open(file_name) as fh:
    full_data = json.load(fh)

# Dig into the data to find the screenshots
screen_shots = full_data['tabs'][0]['views'][1]['screenshots']

# Loop over each screen shot, updating each one
for number, screen_shot in enumerate(screen_shots):
    new_url = input("Please enter new URL (press return to stop): ").strip()

    if new_url:
        screen_shot.update({"url": new_url, "fullSizeURL": new_url})
    else:
        break

# Remove all entries which we did not update
screen_shots = screen_shots[:number]

# Save the data
with open(file_name, 'w') as fh:
    json.dump(full_data, fh, indent=4)

Пример того, как я хочу, чтобы это работало/выглядело:

new_url_input = input("Please enter new URL (press return to stop): ").strip()

# Load the data
file_name = path/to/json/file
with open(file_name) as fh:
    full_data = json.load(fh)

# Dig into the data to find the screenshots
screen_shots = full_data['tabs'][0]['views'][1]['screenshots']

# Loop over each screen shot, updating each one
for number, screen_shot in enumerate(screen_shots):
    new_url = new_url_input

    if new_url:
        screen_shot.update({"url": new_url, "fullSizeURL": new_url})
    else:
        break

 # Remove all entries which we did not update
 screen_shots = screen_shots[:number]

 # Save the data
 with open(file_name, 'w') as fh:
     json.dump(full_data, fh, indent=4)

Я не знаю, что именно вы ищете. Но на основе динамического new_url_input. Вы можете использовать первую строку встроенного лямбда-метода внутри forloop. что-то вроде этого... new_url = get_new_url_input()

Saad Abdullah 27.03.2019 22:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
285
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы вызываете input(), он возвращает строку, и в цикле вы просто присваиваете эту строку новой переменной. Вам нужно будет каким-то образом снова вызвать input(), даже если он обертывает его в функцию, например, используя lambda, как показано ниже...

new_url_input = lambda: input("Please enter new URL (press return to stop): ").strip()

# ...other code...

for number, screen_shot in enumerate(screen_shots):
    new_url = new_url_input()

Обновлено: Теперь, когда я понимаю, что вы говорите (помогли инструкции по вводу), я думаю, это то, что вы пытаетесь сделать...

new_url_inputs = []
input_prompt = 'Please enter new URL (press return to stop): '
new_url_input = input(input_prompt).strip()
while new_url_input:
    new_url_inputs.append(new_url_input)
    new_url_input = input(input_prompt).strip()

# ...other code...

for number, screen_short in enumerate(screen_shots):
    new_url = new_url_inputs[number]
    # ...etc...

Это не сработает для меня, потому что я хочу сначала получить ввод, поэтому даже при этом размещении new_url_input где-то не выполняется, пока он не попадет в цикл For. Я хочу задать вопрос, получить ввод и использовать его позже в/для Для петли.

user11204574 27.03.2019 23:22

@Unknown Проверьте мое редактирование, я думаю, что это поможет.

mVChr 28.03.2019 00:06

Спасибо, но когда я запускаю его, я получаю эту ошибку new_url = new_url_inputs[number] IndexError: list index out of range

user11204574 28.03.2019 00:18

Поскольку у вас должно быть больше снимков экрана, чем введенных URL-адресов, поэтому поймайте исключение и обработайте его, как хотите.

mVChr 28.03.2019 19:06

Извините, я не понимаю, как с этим справиться, но все еще очень новичок в Python.

user11204574 28.03.2019 22:55

Другие вопросы по теме