{ "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 }