{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Управляющие структуры и функции\n", "\n", " \n", "**С.В. Лемешевский** (email: `sergey.lemeshevsky@gmail.com`), Институт математики НАН Беларуси\n", "\n", "Date: **Mar 18, 2020**\n", "\n", "\n", "\n", "\n", "\n", "\n", "Рассматриваться управляющие структуры языка Python: условные\n", "инструкции и циклы, инструкции обработки исключительных ситуаций.\n", "Кроме того рассматривается создание собственных функций, и здесь будет\n", "подробно рассматриваться чрезвычайно гибкий механизм работы с\n", "аргументами функций." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Управляющие структуры\n", "
\n", "\n", "В языке Python условное ветвление реализуется с помощью инструкции\n", "`if`, а циклическая обработка – с помощью инструкций `while` и `for\n", "... in`. В языке Python имеется также такая конструкция, как условное\n", "выражение – вариант инструкции `if`, аналог трехместного оператора\n", "(`?:`), имеющегося в C-подобных языках." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Условное ветвление\n", "\n", "\n", "Общий синтаксис инструкции условного ветвления в языке Python имеет\n", "следующий вид:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "if boolean_expression1:\n", " suite1\n", "elif boolean_expression2:\n", " suite2\n", "...\n", "elif boolean_expressionN:\n", " suiteN\n", "else:\n", " else_suite" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Инструкция может содержать ноль или более предложений\n", "`elif`. Заключительное предложение `else` также является\n", "необязательным. Если необходимо предусмотреть ветку для какого-то\n", "особого случая, который не требует никакой обработки, в качестве блока\n", "кода этой ветки можно использовать инструкцию `pass` (она ничего не\n", "делает и просто является инструкцией-заполнителем, используемой там,\n", "где должна находиться хотя бы одна инструкция).\n", "\n", "В некоторых случаях можно сократить инструкцию `if ... else` до\n", "единственного условного выражения. Ниже приводится синтаксис условных\n", "выражений:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "expression1 if boolean_expression else expression2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если логическое выражение `boolean_expression` возвращает значение\n", "`True`, результатом всего условного выражения будет результат\n", "выражения `expression1`, в противном случае – результат выражения\n", "`expression2`.\n", "\n", "\n", "> **Об использовании скобок.**\n", ">\n", "> Предположим, что нам необходимо записать в переменную `width` значение\n", "> 100 и прибавить к нему 10, если переменная margin имеет значение\n", "> `True`. Мы могли бы написать такое выражение:\n", ">" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "width = 100 + 10 if margin else 0\t# ОШИБКА!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> \n", "> Особенно неприятно, что эта строка программного кода работает\n", "> правильно, когда переменная `margin` имеет значение `True`, записывая\n", "> значение 110 в переменную width. Но когда переменная `margin` имеет\n", "> значение `False`, в переменную `width` вместо 100 будет записано\n", "> значение 0. Это происходит потому, что интерпретатор Python\n", "> воспринимает выражение 100 + 10 как часть `expression1` условного\n", "> выражения. Решить эту проблему можно с помощью круглых скобок:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "width = 100 + (10 if margin else 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> \n", "> Кроме того, круглые скобки делают программный код более понятным\n", "> для человека.\n", "\n", "\n", "\n", "\n", "\n", "Условные выражения могут использоваться для видоизменения сообщений,\n", "выводимых для пользователя. Например, при выводе числа обработанных\n", "файлов, вместо того чтобы печатать «0 файл(ов)», «1 файл(ов)» или\n", "что-то подобное, можно было бы использовать пару условных выражений:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "ename": "NameError", "evalue": "name 'count' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m