{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Программирование на Python \n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*\n", "\n", "*Данный ноутбук основан на [лекции](http://nbviewer.math-hse.info/github/ischurov/pythonhse/blob/master/Lecture%203.ipynb#%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D0%B9) Щурова И.В., курс «Программирование на языке Python для сбора и анализа данных» (НИУ ВШЭ).*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Цикл `while`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "С циклом `for` мы уже знакомы. Сейчас мы познакомимся с циклом `while`, логика которого отличается от `for`. Конструкции с циклом `while` устроены следующим образом: действия, которые указаны в теле цикла, должны выполняться до тех пор, пока верно условие, прописанное после `while` (отсюда и название). Если в цикле `for` мы указывали некоторый промежуток, по которому в ходе цикла мы будем \"пробегаться\", то в случае с циклом `while` мы просто фиксируем стартовую точку, а конечную точку никак не указываем: программа сама остановится, когда условие в цикле перестанет выполняться." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "nums = [1, 0, 9, 10, -1, 8]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Давайте, используя цикл `while`, будем выводить на экран элементы списка `nums` до тех пор, пока не столкнемся с отрицательным значением." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "0\n", "9\n", "10\n" ] } ], "source": [ "i = 0 # начинаем с индекса i=0\n", "\n", "while nums[i] >= 0: # пока элемент nums[i] >= 0\n", " print(nums[i]) # выводим элемент на экран\n", " i = i + 1 # переходим к следующему элементу" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "На значении 10 мы остановились: за ним идет значение -1, для которого условие `nums[i] > = 0` не выполняется. \n", "\n", "Давайте теперь попробуем переписать код так, чтобы он работал точно так же, но только чтобы в нем использовался цикл `for`, а не `while`. Вообще почти любой код с `while` можно переписать через `for`, и иногда это полезно: код с циклом `while` обычно более медленный, плюс, склонен к зацикливанию." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "0\n", "9\n", "10\n" ] } ], "source": [ "for n in nums:\n", " if n >= 0:\n", " print(n)\n", " else:\n", " break # выходим из цикла" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В коде выше мы использовали оператор `break`, который позволяет выйти из цикла, то есть закончить исполнение строк кода в теле цикла и перейти к коду дальше. \n", "\n", "А теперь напишем маленькую игру-угадайку. Программа будет загадывать целое число от 1 до 100, а пользователь его угадывать. Как программа будет загадывать число? Выбирать случайным образом из интервала [1, 100] (на самом деле псевдослучайным образом, так как абсолютной случайности не получится, генерирование чисел происходит по фиксированным алгоритмам)." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "from random import randrange # импортируем функию randrange" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "n = randrange(1, 101) # n и есть загаданное число" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось написать цикл. До тех пор, пока пользователь не угадает число, программа не будет останавливаться, но зато она будет давать подсказки: если введенное пользователем число больше загаданного, то будет выводиться сообщение \"Вы ввели слишком большое число.\", если меньше – \"Вы ввели слишком маленькое число.\"" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ваша попытка:53\n", "Вы ввели слишком большое число.\n", "Ваша попытка:32\n", "Вы ввели слишком маленькое число.\n", "Ваша попытка:44\n", "Вы ввели слишком маленькое число.\n", "Ваша попытка:47\n", "Вы ввели слишком маленькое число.\n", "Ваша попытка:52\n", "Вы ввели слишком большое число.\n", "Ваша попытка:51\n", "Вы ввели слишком большое число.\n", "Ваша попытка:49\n", "Вы ввели слишком маленькое число.\n", "Ваша попытка:50\n", "Вы выиграли!\n" ] } ], "source": [ "while True:\n", " guess = int(input(\"Ваша попытка: \"))\n", " if guess == n:\n", " print(\"Вы выиграли!\")\n", " break\n", " elif guess > n:\n", " print(\"Вы ввели слишком большое число.\")\n", " else: \n", " print(\"Вы ввели слишком маленькое число.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В коде выше в `while` мы не написали никакого условия явно, вместо этого мы написали `while True`. Это выражение означает «до тех пор, пока мы не вышли из цикла». В нашем случае это равносильно «до тех пор, пока не столкнулись с `break`», то есть пока наш ответ не совпал с загаданным числом." ] } ], "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }