{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Программирование на Python\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Функция `range()` и цикл `for`\n", "\n", "В C# есть два варианта реализации цикла `for`:\n", "\n", "* конструкция с оператором `for`;\n", "* конструкция с оператором `foreach`.\n", "\n", "Пример первой конструкции ([отсюда](https://www.w3schools.com/cs/cs_for_loop.php)):\n", "\n", " for (int i = 0; i < 5; i++) \n", " {\n", " Console.WriteLine(i);\n", " }\n", " \n", " 0\n", " 1\n", " 2\n", " 3\n", " 4\n", " \n", "Пример второй конструкции:\n", "\n", " string[] cars = {\"Volvo\", \"BMW\", \"Ford\", \"Mazda\"};\n", " foreach (string i in cars) \n", " {\n", " Console.WriteLine(i);\n", " }\n", " \n", " Volvo\n", " BMW\n", " Ford\n", " Mazda\n", "\n", "В Python цикл `for` работает в логике второй конструкции с `foreach`: он выполняет набор операций для каждого элемента в некотором перечне. Первая конструкция в Python представлена циклом `while`. Для того чтобы решить задачу из первого примера – вывести на экран целые числа от 0 до 4 включительно – с помощью цикла `for`, нам вдобавок понадобится функция `range()`. \n", "\n", "Функция `range()` создаёт последовательности из целых чисел на некотором отрезке, правый конец отрезка исключается. У этой функции есть важная особенность – она создаёт не список из целых чисел, а именно неизменяемую последовательность, отдельный тип `range`. Эта функция производит все числа за один раз, в этом её минус (если чисел много, большие затраты памяти), но в сочетании с циклом `for` она работает гораздо быстрее, чем код с увеличением на 1 на каждой итерации цикла (если чисел не очень много)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "range(0, 5)" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "range(0, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Последовательность можно преобразовать в список, чтобы увидеть, что внутри (исходная последовательность от нас скрыта):" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 1, 2, 3, 4]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(0, 5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Соединим цикл `for` и функцию `range()` и выведем на экран все числа от 0 до 4:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n" ] } ], "source": [ "for i in range(0, 5):\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "По умолчанию функция `range()` создаёт последовательности с шагом 1. Но шаг можно изменить, добавив необязательный аргумент `step` – название можно опустить:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, 2, 4, 6, 8]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(0, 10, 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Шаг может быть отрицательным, тогда мы получим последовательность, отсортированную по убыванию. В таком случае сначала нужно указывать правый конец интервала, а потом – левый:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[10, 8, 6, 4]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(10, 2, -2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если сначала указать меньшее значение, то мы получим пустой список. Это происходит потому, что мы даём Python противоречивые указания – `range()` двигается всегда слева направо, а отрицательный шаг предполагает движение справа налево:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(range(2, 10, -2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь рассмотрим задачу из второго примера – вывод на экран элемента списка. Здесь всё просто:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Volvo\n", "BMW\n", "Ford\n", "Mazda\n" ] } ], "source": [ "cars = [\"Volvo\", \"BMW\", \"Ford\", \"Mazda\"]\n", "\n", "for car in cars:\n", " print(car)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Цикл `for` умеет двигаться не только по спискам и `range`, он работает с любыми последовательностями, например, со строками:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A\n", "B\n", "C\n", "D\n", "E\n" ] } ], "source": [ "for letter in \"abcde\":\n", " print(letter.upper())" ] } ], "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 }