Пользовательский ввод и циклы While в Python

Большинство программ пишутся для решения проблемы конечного пользователя. Для этого обычно требуется получить от пользователя некоторую информацию. Для простого примера, допустим, кто-то хочет узнать, достаточно ли он взрослый, чтобы голосовать. Если вы пишете программу для ответа на этот вопрос, вам необходимо знать возраст пользователя, прежде чем вы сможете дать ответ. Программа должна попросить пользователя ввести свой возраст; получив его, программа сравнит его с возрастом для голосования, чтобы определить, является ли пользователь достаточно взрослым, а затем сообщит результат.

Принцип работы функции input()

Функция input() приостанавливает работу вашей программы и ждет, пока пользователь введет текст. Как только Python получает введенный пользователем текст, он присваивает его переменной, чтобы вам было удобно с ним работать. Например, следующая программа просит пользователя ввести текст, а затем выводит это сообщение на экран:

message = input("Tell me something, and I will repeat it back to you: ")
print(message)
Вход в полноэкранный режим Выход из полноэкранного режима
Tell me something, and I will repeat it back to you: Hi
Hi
Войти в полноэкранный режим Выход из полноэкранного режима

Функция input() принимает один аргумент: подсказку, или инструкции, которые мы хотим вывести на экран, чтобы пользователь знал, что ему делать. В этом примере, когда Python выполняет первую строку, пользователь видит подсказку Скажи мне что-нибудь, и я повторю это тебе:. Программа ждет, пока пользователь введет свой ответ, и продолжает работу после того, как пользователь нажмет Enter. Ответ присваивается переменной message, а затем print(message) выводит введенные данные обратно пользователю.

Написание явных подсказок

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

name = input("Please enter your name: ")
print(f"Hello, {name}!")
Войти в полноэкранный режим Выйти из полноэкранного режима
Please enter your name: Ahmed
Hello, Ahmed!
Войти в полноэкранный режим Выйти из полноэкранного режима

Добавьте пробел в конце подсказок, чтобы отделить подсказку от ответа пользователя и чтобы пользователю было понятно, куда вводить текст.

Иногда требуется написать подсказку длиннее одной строки. Например, вы можете захотеть рассказать пользователю, почему вы просите ввести определенный текст. Вы можете присвоить подсказку переменной и передать ее в функцию input(). Это позволит вам создать подсказку в несколько строк, а затем написать чистый оператор input().

prompt = "If you tell us who you are, we can personalize the messages you see."
prompt += "nWhat is your first name? "

name = input(prompt)
print(f"Hello, {name}!")
Вход в полноэкранный режим Выход из полноэкранного режима
If you tell us who you are, we can personalize the messages you see.
What is your first name? Ahmed
Hello, Ahmed!
Вход в полноэкранный режим Выход из полноэкранного режима

Использование функции int() для приема числового ввода

Когда вы используете функцию input(), Python интерпретирует все, что вводит пользователь, как строку. Рассмотрим следующий сеанс интерпретатора, который запрашивает возраст пользователя:

>>> age = input("How old are you? ")
How old are you? 27
>>> age
'27'
Войти в полноэкранный режим Выйти из полноэкранного режима

Пользователь вводит число 27, но когда мы спрашиваем Python о значении возраста, он возвращает ’27’, строковое представление введенного числового значения. Мы знаем, что Python интерпретировал введенные данные как строку, потому что число теперь заключено в кавычки. Если все, что вы хотите сделать, это распечатать введенные данные, то это хорошо работает. Но если вы попытаетесь использовать введенное значение как число, вы получите ошибку.

>>> age = input("How old are you? ")
How old are you? 27
>>> age <= 20
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<=' not supported between instances of 'str' and 'int'
Вход в полноэкранный режим Выход из полноэкранного режима

Когда вы пытаетесь использовать ввод для числового сравнения, Python выдает ошибку, поскольку не может сравнить строку с целым числом: строка ’27’, присвоенная возрасту, не может быть сравнена с числовым значением 20. Мы можем решить эту проблему с помощью функции int(), которая указывает Python рассматривать вводимые данные как числовые значения. Функция int() преобразует строковое представление числа в числовое.

>>> age = input("How old are you? ")
How old are you? 27
>>> age = int(age)
>>> age <= 20
False
Вход в полноэкранный режим Выход из полноэкранного режима

Когда вы используете числовой ввод для вычислений и сравнений, обязательно сначала преобразуйте вводимое значение в числовое представление.

Оператор Modulo

Полезным инструментом для работы с числовой информацией является оператор modulo (%), который делит одно число на другое и возвращает остаток.

>>> 4 % 3 
1
>>> 2 % 4
2
>>> 3 % 3
0
>>> 7 % 2
1
Вход в полноэкранный режим Выход из полноэкранного режима

Оператор modulo не говорит вам, сколько раз одно число делится на другое; он просто сообщает вам остаток.

Когда одно число делится на другое, остаток равен 0, поэтому оператор modulo всегда возвращает 0. Вы можете использовать этот факт, чтобы определить, является ли число четным или нечетным:

number = input("Enter a number, and I'll tell you if it's even or odd: ")
number = int(number)

if number % 2 == 0:
    print(f"nThe number {number} is even.")
else:
    print(f"nThe number {number} is odd.")
Войти в полноэкранный режим Выход из полноэкранного режима
Enter a number, and I'll tell you if it's even or odd: 8

The number 8 is even.
Войти в полноэкранный режим Выход из полноэкранного режима

Знакомство с циклами while

Цикл for берет коллекцию элементов и выполняет блок кода один раз для каждого элемента коллекции. В отличие от него, цикл while выполняется до тех пор, пока или пока определенное условие истинно.

Цикл while в действии

Цикл while можно использовать для подсчета ряда чисел. Например, следующий цикл while считает от 1 до 5:

current_number = 1

while current_number <= 5:
    print(current_number)
    current_number += 1
Вход в полноэкранный режим Выход из полноэкранного режима
1
2
3
4
5
Вход в полноэкранный режим Выход из полноэкранного режима

Программы, которыми вы пользуетесь каждый день, скорее всего, содержат циклы while. Например, в игре цикл while нужен для того, чтобы она продолжала работать до тех пор, пока вы хотите продолжать игру, и чтобы она могла прекратить работу, как только вы попросите ее выйти. Программы были бы неинтересны, если бы они прекращали работу раньше, чем мы им прикажем, или продолжали работать даже после того, как мы захотим выйти из игры, поэтому циклы while весьма полезны.

Предоставление пользователю возможности выбирать время выхода из программы

Мы можем сделать так, чтобы программа выполнялась столько, сколько хочет пользователь, поместив большую часть кода в цикл while. Мы определим значение quit, а затем продолжим выполнение программы до тех пор, пока пользователь не введет значение quit.

prompt = "nTell me something, and I will repeat it back to you:"
prompt += "nEnter 'quit' to end the program. "

message = ""
while message != 'quit':
    message = input(prompt)

    if message != 'quit':
        print(message)
Вход в полноэкранный режим Выход из полноэкранного режима

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hi
Hi

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello
Hello

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Ok
Ok

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
Вход в полноэкранный режим Выход из полноэкранного режима

Использование флага

В предыдущем примере мы заставили программу выполнять определенные задачи, пока заданное условие было истинным. Но как быть с более сложными программами, в которых множество различных событий может привести к прекращению работы программы?

Например, в игре несколько различных событий могут привести к завершению игры. Когда у игрока заканчиваются корабли, истекает его время или все города, которые он должен был защищать, разрушены, игра должна завершиться. Она должна закончиться, если произойдет хотя бы одно из этих событий. Если для остановки программы может произойти много возможных событий, то попытка проверить все эти условия в одном операторе while становится сложной и трудной.

Для программы, которая должна выполняться только до тех пор, пока многие условия верны, можно определить одну переменную, которая определяет, активна ли вся программа. Эта переменная, называемая флагом, действует как сигнал для программы. Мы можем написать наши программы так, чтобы они выполнялись, пока флаг установлен в True, и прекращали выполнение, когда любое из нескольких событий устанавливает значение флага в False. В результате наш общий оператор while должен проверять только одно условие: является ли флаг в данный момент True или нет. Тогда все остальные проверки (на предмет того, произошло ли событие, которое должно установить флаг в значение False) можно аккуратно организовать в остальной части программы.

prompt = "nTell me something, and I will repeat it back to you:"
prompt += "nEnter 'quit' to end the program. "

active = True
while active:
    message = input(prompt)

    if message == 'quit':
        active = False
    else:
        print(message)
Вход в полноэкранный режим Выход из полноэкранного режима

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hi
Hi

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello
Hello

Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
Вход в полноэкранный режим Выход из полноэкранного режима

Использование break для выхода из цикла

Чтобы немедленно выйти из цикла while без выполнения оставшегося кода в цикле, независимо от результатов условного теста, используйте оператор break. Оператор break направляет поток вашей программы; с его помощью вы можете контролировать, какие строки кода будут выполнены, а какие нет, так что программа будет выполнять только тот код, который вы хотите, и тогда, когда вы хотите.

Например, рассмотрим программу, которая спрашивает пользователя о местах, которые он посетил. Мы можем остановить цикл while в этой программе, вызвав break, как только пользователь введет значение ‘quit’:

prompt = "nPlease enter the name of a city you have visited:"
prompt += "n(Enter 'quit' when you are finished.) "

while True:
    city = input(prompt)

    if city == 'quit':
        break
    else:
        print(f"I'd love to go to {city.title()}!")
Вход в полноэкранный режим Выход из полноэкранного режима

Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) Cairo
I'd love to go to Cairo!

Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) New York 
I'd love to go to New York!

Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) quit
Войти в полноэкранный режим Выход из полноэкранного режима

Цикл, начинающийся с while True, будет выполняться вечно, пока не достигнет оператора break. Цикл в этой программе продолжает просить пользователя ввести названия городов, в которых он побывал, пока пользователь не введет ‘quit’. Когда пользователь вводит ‘quit’, выполняется оператор break, заставляя Python выйти из цикла.

Вы можете использовать оператор break в любом из циклов Python. Например, вы можете использовать break для выхода из цикла for, который работает со списком или словарем.

Использование continue в цикле

Вместо того чтобы полностью выходить из цикла, не выполняя остальной его код, вы можете использовать оператор continue для возврата к началу цикла на основе результата условного теста. Например, рассмотрим цикл, который считает от 1 до 10, но печатает только нечетные числа в этом диапазоне:

current_number = 0

while current_number < 10:
    current_number += 1
    if current_number % 2 == 0:
        continue

    print(current_number)
Вход в полноэкранный режим Выход из полноэкранного режима
1
3
5
7
9
Войти в полноэкранный режим Выйти из полноэкранного режима

оператор continue указывает Python проигнорировать остальную часть цикла и вернуться к началу.

Избегание бесконечных циклов

Каждый цикл while нуждается в способе прекращения работы, чтобы он не продолжался вечно. Например, этот цикл подсчета должен считать от 1 до 5:

x = 1
while x <= 5:
    print(x)
    x += 1
Войти в полноэкранный режим Выйти из полноэкранного режима

Но если вы случайно опустите строку x += 1, цикл будет выполняться вечно:

# This loop runs forever!
x = 1
while x <= 5:
    print(x)
Войти в полноэкранный режим Выход из полноэкранного режима

Теперь значение x будет начинаться с 1, но никогда не изменится. В результате условный тест x<= 5 всегда будет иметь значение True, и цикл while будет работать вечно, печатая серию 1.

Каждый программист время от времени случайно пишет бесконечный цикл while, особенно когда циклы программы имеют тонкие условия выхода. Если ваша программа застряла в бесконечном цикле, нажмите CTRL-C или просто закройте окно терминала, в котором отображается вывод вашей программы.

Чтобы избежать написания бесконечных циклов, проверяйте каждый цикл while и убедитесь, что цикл останавливается тогда, когда вы этого ожидаете. Если вы хотите, чтобы программа завершалась, когда пользователь вводит определенное значение, запустите программу и введите это значение. Если программа не завершается, тщательно проверьте, как ваша программа обрабатывает значение, которое должно привести к завершению цикла. Убедитесь, что хотя бы одна часть программы может сделать условие цикла False или заставить его достичь оператора break.

Использование цикла while со списками и словарями

До сих пор мы работали только с одним фрагментом пользовательской информации за раз. Мы получали ввод пользователя, а затем печатали его или ответ на него. В следующий раз в цикле while мы получали другое входное значение и отвечали на него. Но чтобы отслеживать множество пользователей и фрагментов информации, мы должны использовать списки и словари вместе с циклами while.

Цикл for эффективен для просмотра списка, но вы не должны изменять список внутри цикла for, потому что Python будет сложно отслеживать элементы в списке. Чтобы изменять список по мере его обработки, используйте цикл while. Использование циклов while со списками и словарями позволяет собирать, хранить и организовывать большое количество данных для последующего изучения и составления отчетов.

Перемещение элементов из одного списка в другой

Рассмотрим список недавно зарегистрированных, но непроверенных пользователей сайта. После проверки этих пользователей, как мы можем переместить их в отдельный список подтвержденных пользователей? Одним из способов может быть использование цикла while для извлечения пользователей из списка неподтвержденных пользователей по мере их проверки, а затем добавления их в отдельный список подтвержденных пользователей. Вот как может выглядеть такой код:

# Start with users that need to be verified,
# and an empty list to hold confirmed users.
unconfirmed_users = ['mohammed', 'ali', 'islam']
confirmed_users = []

# Verify each user until there are no more unconfirmed users.
# Move each verified user into the list of confirmed users.
while unconfirmed_users:
    current_user = unconfirmed_users.pop()

    print(f"Verifying user: {current_user.title()}")
    confirmed_users.append(current_user)

# Display all confirmed users.
print("nThe following users have been confirmed:")
for confirmed_user in confirmed_users:
    print(confirmed_user.title())
Вход в полноэкранный режим Выход из полноэкранного режима
Verifying user: Islam
Verifying user: Ali
Verifying user: Mohammed

The following users have been confirmed:
Islam
Ali
Mohammed
Войти в полноэкранный режим Выход из полноэкранного режима

Мы имитируем подтверждение каждого пользователя, печатая проверочное сообщение, а затем добавляем его в список подтвержденных пользователей. По мере уменьшения списка неподтвержденных пользователей список подтвержденных пользователей увеличивается. Когда список неподтвержденных пользователей становится пустым, цикл останавливается и печатается список подтвержденных пользователей.

Удаление всех экземпляров определенных значений из списка

Ранее мы использовали функцию remove() для удаления определенного значения из списка. Функция remove() работала, потому что интересующее нас значение появлялось в списке только один раз. Но что, если вы хотите удалить все экземпляры значения из списка?

Допустим, у вас есть список домашних животных, в котором значение “cat” повторяется несколько раз. Чтобы удалить все экземпляры этого значения, можно запустить цикл while до тех пор, пока “cat” не исчезнет из списка:

pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)

while 'cat' in pets:
    pets.remove('cat')

print(pets)
Войти в полноэкранный режим Выход из полноэкранного режима
['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
Войти в полноэкранный режим Выход из полноэкранного режима

Заполнение словаря пользовательским вводом

Вы можете запрашивать столько данных, сколько вам нужно, при каждом проходе цикла while. Давайте создадим программу опроса, в которой при каждом проходе цикла будет запрашиваться имя участника и его ответ. Собранные данные мы будем хранить в словаре, так как мы хотим связать каждый ответ с конкретным пользователем:

responses = {}

# Set a flag to indicate that polling is active.
polling_active = True

while polling_active:
    # Prompt for the person's name and response.
    name = input("nWhat is your name? ")
    response = input("Which programming language would you like to learn someday? ")

    # Store the response in the dictionary.
    responses[name] = response

    # Find out if anyone else is going to take the poll.
    repeat = input("Would you like to let another person respond? (yes/ no) ")
    if repeat == 'no':
        polling_active = False

# Polling is complete. Show the results.
print("n--- Poll Results ---")
for name, response in responses.items():
    print(f"{name} would like to learn {response}.")
Вход в полноэкранный режим Выход из полноэкранного режима

What is your name? Ahmed
Which programming language would you like to learn someday? Rust
Would you like to let another person respond? (yes/ no) yes

What is your name? Mohammed
Which programming language would you like to learn someday? Go
Would you like to let another person respond? (yes/ no) yes

What is your name? Omar
Which programming language would you like to learn someday? Python
Would you like to let another person respond? (yes/ no) no

--- Poll Results ---
Ahmed would like to learn Rust.
Mohammed would like to learn Go.
Omar would like to learn Python.
Войти в полноэкранный режим Выход из полноэкранного режима

Оцените статью
Procodings.ru
Добавить комментарий