{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ввод данных и циклы while"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Как работает функция input()\n",
"Функция _input()_ приостанавливает выполнение программы и ожидает, пока пользователь введет некоторый текст. Получив ввод, Python сохраняет его в переменной, чтобы вам было удобнее работать с ним. Например, следующая программа предлагает пользователю ввести текст, а затем выводит сообщение для пользователя:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Tell me something, and I will repeat it back to you: hi\n",
"hi\n"
]
}
],
"source": [
"message = input(\"Tell me something, and I will repeat it back to you: \")\n",
"print(message)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Каждый раз, когда в вашей программе используется функция _input()_, вы должны включать четкую, понятную подсказку, которая точно сообщит пользователю,какую информацию вы от него хотите получить. Подойдет любое предложение, которое сообщает пользователю, что нужно вводить."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Иногда подсказка занимает более одной строки. Например, вы можете сообщить пользователю, для чего программа запрашивает данные. Текст подсказки можно сохранить в переменной и передать эту переменную функции input(): вы строите длинное приглашение из нескольких строк, а потом выполняете одну компактную команду _input()_"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"prompt = \"If you tell us who you are, we can personalize the messages you see.\"\n",
"prompt += \"\\nWhat is your first name? \"\n",
"\n",
"name = input(prompt)\n",
"print(\"\\nHello, \" + name + \"!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Использование int() для получения числового ввода"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"При использовании функцииinput()Python интерпретирует все данные, введен-ные пользователем, как строку. Вследующем сеансе интерпретатора программазапрашивает упользователя возраст:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"age = input(\"How old are you? \")\n",
"How old are you? \n",
"21\n",
"age'21'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Пользователь вводит число 21, но, когда мы запрашиваем у Python значение age, выводится'21'— представление введенного числа в строковом формате. Кавычки, в которые заключены данные, указывают на то, что Python интерпретирует ввод как строку. Но попытка использовать данные как число приведет к ошибке."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Проблему можно решить при помощи функцииint(), интерпретирующей строку как числовое значение. Функция _int()_ преобразует строковое представление числа в само число."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"age = input(\"How old are you? \")\n",
"How old are you?\n",
"21\n",
"age = int(age)\n",
"age >= 18\n",
"True"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Оператор вычисления остатка"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"При работе с числовыми данными может пригодиться оператор вычисления остатка _(%)_, который делит одно число на другое и возвращает остаток:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"4 % 3"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"2"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"5 % 3"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"6 % 3"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"7 % 3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Оператор % не сообщает частное от целочисленного деления; он возвращает только остаток."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Циклы while"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Цикл _for_ получает коллекцию элементов и выполняет блок кода по одному разу для каждого элемента в коллекции. В отличие от него, цикл _while_ продолжает выполняться, пока остается истинным некоторое условие."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Цикл while в действии"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"2\n",
"3\n",
"4\n",
"5\n"
]
}
],
"source": [
"current_number = 1\n",
"while current_number <= 5:\n",
" print(current_number)\n",
" current_number += 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Пользователь решает прервать работу программы"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Программа может выполняться, пока пользователь не захочет остановить ее,— для этого бульшая часть кода заключается в цикл _while_. В программе определяется признак завершения, и программа работает, пока пользователь не введет нужное значение:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Tell me something, and I will repeat it back to you:\n",
"Enter 'quit' to end the program. q\n",
"q\n",
"\n",
"Tell me something, and I will repeat it back to you:\n",
"Enter 'quit' to end the program. quit\n",
"quit\n"
]
}
],
"source": [
"prompt = \"\\nTell me something, and I will repeat it back to you:\"\n",
"prompt += \"\\nEnter 'quit' to end the program. \"\n",
"message = \"\"\n",
"while message != 'quit':\n",
" message = input(prompt)\n",
" print(message)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Флаги"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"В предыдущем примере программа выполняла некоторые операции, пока заданное условие оставалось истинным. А что если вы пишете более сложную программу, выполнение которой может прерываться по нескольким разным условиям? Например, компьютерная игра может завершаться по разным причинам: у игрока кончились все «жизни»; прошло отведенное время; все города, которые он должен был защищать, были уничтожены ит.д. Игра должна завершаться при выполнении любого из этих условий. Попытки проверять все возможные условия в одной команде while быстро усложняются и становятся слишком громоздкими."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Если программа должна выполняться только при истинности нескольких условий,определите одну переменную-_флаг_. Эта переменная сообщает, должна ли программа выполняться далее. Программу можно написать так, чтобы она продолжала выполнение, если флаг находится в состоянии True, и завершалась, если любое из нескольких событий перевело флаг в состояние False. В результате в команде while достаточно проверить всего одно условие: находится ли флаг в состоянии True. Все остальные проверки (которые должны определить, произошло ли событие, переводящее флаг в состояние False) удобно организуются в остальном коде.Добавим флаг в программу из предыдущего раздела лекции. Этот флаг, которыймы назовем active(хотя переменная может называться как угодно), управляет тем, должно ли продолжаться выполнение программы:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Tell me something, and I will repeat it back to you:\n",
"Enter 'quit' to end the program. й\n",
"й\n",
"\n",
"Tell me something, and I will repeat it back to you:\n",
"Enter 'quit' to end the program. quit\n"
]
}
],
"source": [
"prompt = \"\\nTell me something, and I will repeat it back to you:\"\n",
"prompt += \"\\nEnter 'quit' to end the program. \"\n",
"active = True\n",
"while active:\n",
" message = input(prompt)\n",
" if message == 'quit':\n",
" active = False\n",
" else:\n",
" print(message)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Команда break и выход из цикла"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Чтобы немедленно прервать цикл while без выполнения оставшегося кода в цикле независимо от состояния условия, используйте команду _break_. Команда break управляет ходом выполнения программы; она позволит вам управлять тем, какая часть кода выполняется, а какая нет.Рассмотрим пример — программу, которая спрашивает у пользователя, в каких городах он бывал. Чтобы прервать цикл while, программа выполняет команду break,как только пользователь введет значение'quit':"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Please enter the name of a city you have visited:\n",
"(Enter 'quit' when you are finished.) London\n",
"I'd love to go to London!\n",
"\n",
"Please enter the name of a city you have visited:\n",
"(Enter 'quit' when you are finished.) Rio\n",
"I'd love to go to Rio!\n",
"\n",
"Please enter the name of a city you have visited:\n",
"(Enter 'quit' when you are finished.) quit\n"
]
}
],
"source": [
"prompt = \"\\nPlease enter the name of a city you have visited:\"\n",
"prompt += \"\\n(Enter 'quit' when you are finished.) \"\n",
"while True:\n",
" city = input(prompt)\n",
" if city == 'quit':\n",
" break\n",
" else:\n",
" print(\"I'd love to go to \" + city.title() + \"!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Команда continue и продолжение цикла"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Вместо того чтобы полностью прерывать выполнение цикла без выполнения оставшейся части кода, вы можете воспользоваться командой _continue_ для возвращения к началу цикла и проверке условия. Например, возьмем цикл, который считает от 1 до 10, но выводит только нечетные числа в этом диапазоне:"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1\n",
"3\n",
"5\n",
"7\n",
"9\n"
]
}
],
"source": [
"current_number = 0\n",
"while current_number < 10:\n",
" current_number += 1\n",
" if current_number % 2 == 0:\n",
" continue\n",
" print(current_number)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Предотвращение зацикливания"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"У каждого цикла while должна быть предусмотрена возможность завершения, что-бы цикл не выполнялся бесконечно. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Использование цикла while со списками и словарями"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"До настоящего момента мы работали только с одним фрагментом информации,полученной от пользователя. Мы получали ввод пользователя, а затем выводили ответ на него. При следующем проходе цикла while программа получала новое входное значение и реагировала на него. Но, чтобы работать с несколькими фрагментами информации, необходимо использовать в цикла хwhile списки и словари.\n",
"
Цикл for хорошо подходит для перебора списков, но, скорее всего, список не должен изменяться в цикле, потому что у Python возникнут проблемы с отслеживанием элементов. Чтобы изменять список в процессе обработки, используйте цикл while. Использование циклов while со списками и словарями позволяет собирать,хранить и упорядочивать большие объемы данных для последующего анализа и обработки.\n",
"
Возьмем список недавно зарегистрированных, но еще не проверенных пользователей сайта. Как переместить пользователей после проверки в отдельный список проверенных пользователей? Одно из возможных решений: используем цикл while для извлечения пользователей из списка непроверенных, проверяем их и включаем в отдельный список проверенных пользователей. Код может выглядеть так:"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Verifying user: Candace\n",
"Verifying user: Brian\n",
"Verifying user: Alice\n",
"Candace\n",
"Brian\n",
"Alice\n"
]
}
],
"source": [
"# Начинаем сдвух списков: пользователей для проверки# ипустого списка для хранения проверенных пользователей.\n",
"unconfirmed_users = ['alice', 'brian', 'candace']\n",
"confirmed_users = []\n",
"# Проверяем каждого пользователя, пока остаются непроверенные# пользователи. Каждый пользователь, прошедший проверку,# перемещается всписок проверенных.\n",
"while unconfirmed_users:\n",
" current_user = unconfirmed_users.pop()\n",
" print(\"Verifying user: \" + current_user.title())\n",
" confirmed_users.append(current_user)\n",
"# Вывод всех проверенных пользователей.print(\"\\nThe following users have been confirmed:\")\n",
"for confirmed_user in confirmed_users:\n",
" print(confirmed_user.title())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Удаление всех вхождений конкретного значения из списка"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Допустим, имеется список pets, в котором значение'cat'встречается многократно.Чтобы удалить все экземпляры этого значения, можно выполнять цикл while до тех пор, пока всписке не останется ни одного экземпляра'cat':"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']\n",
"['dog', 'dog', 'goldfish', 'rabbit']\n"
]
}
],
"source": [
"pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']\n",
"print(pets)\n",
"while 'cat' in pets:\n",
" pets.remove('cat')\n",
"print(pets)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Заполнение словаря данными, введенными пользователем"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"При каждом проходе цикла while ваша программа может запрашивать любое необходимое количество данных. Напишем программу, которая при каждом проходе цикла запрашивает имя участника и его ответ. Собранные данные будут сохраняться в словаре, потому что каждый ответ должен быть связан с конкретным пользователем:"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"What is your name? Ivan\n",
"Which mountain would you like to climb someday? Denali\n",
"Would you like to let another person respond? (yes/ no) yes\n",
"\n",
"What is your name? Pit\n",
"Which mountain would you like to climb someday? Daly\n",
"Would you like to let another person respond? (yes/ no) no\n",
"\n",
"--- Poll Results ---\n",
"Ivan would like to climb Denali.\n",
"Pit would like to climb Daly.\n"
]
}
],
"source": [
"responses = {}\n",
"# Установка флага продолжения опроса.\n",
"polling_active = True\n",
"while polling_active:\n",
" # Запрос имени иответа пользователя.\n",
" name = input(\"\\nWhat is your name? \")\n",
" response = input(\"Which mountain would you like to climb someday? \")\n",
" # Ответ сохраняется всловаре:\n",
" responses[name] = response\n",
" # Проверка продолжения опроса.\n",
" repeat = input(\"Would you like to let another person respond? (yes/ no) \")\n",
" if repeat == 'no':\n",
" polling_active = False\n",
" # Опрос завершен, вывести результаты.\n",
"print(\"\\n--- Poll Results ---\")\n",
"for name, response in responses.items():\n",
" print(name + \" would like to climb \" + response + \".\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}