4-й час. Переменные и управление ими

 

4-й час

Переменные и управление ими

  В данной главе Вы познакомитесь с переменными и узнаете, каким образом их можно использовать. Мы научимся создавать такие умные программы на языке Python, что они сами будут анализировать переменные и принимать решения, что делать дальше. Например, мы научимся давать команду компьютеру выполнять одну и ту же операцию много раз до тех пор, пока значение определённой переменной не станет истинным или ложным. Пожалуй, это одна из тех задач, которую компьютеры выполняют чаще всего, и мы изучим, как это делается в Python. После овладения всеми этими средствами программирования мы применим наши знания для написания небольшой, но полезной программы.

Переменные

  Возможно, Вы ещё помните, что такое переменные. Все эти иксы и игреки из курса алгебры средней школы, те самые, что изводили Вас, когда Вы пытались безуспешно заснуть на уроке в классе. Может быть, кто-то до сих пор нервно вздрагивает при мысли о необходимости решить уравнение. Переменные входят в состав большинства математических формул. Формула предоставляет Вам в общем виде схему решения задачи. Но чтобы найти ответ, необходимо вместо переменных подставить реальные значения и выполнить соответствующие математические действия.

  Переменные в математических формулах и компьютерных программах служат одной и той же цели. Они олицетворяют собой всего лишь место, в которое можно поместить некоторое фактическое значение. Правда, в алгебре переменные являются вместилищем только числовых значений; тогда как в компьютерных программах переменные могут содержать информацию любого типа. Причем они могут хранить их все то время, пока работает ваша программа, или всего лишь несколько миллисекунд, если Вам этого достаточно. Переменные можно также использовать в качестве "бумаги для заметок", т.е. просто как место для записи промежуточного значения, чтобы оно не забылось, пока Вы будете работать над другой частью формулы или задачи. Если Вам легче представить переменные в виде шпаргалок, то так и поступайте.

  Переменные в Python могут быть названы любым понравившимся Вам именем, лишь бы только оно не совпадало с зарезервированным ключевым словом Python. Имена в Python всегда должны начинаться обязательно с буквы или символа подчёркивания (_). Допустимыми именами переменных являются i, zl и old, а вот примеры недопустимых имён — 123abc и if. В то же время следует учитывать, что некоторые слова лучше других подходят в качестве имён переменных, а в определённых контекстах некоторые имена значительно предпочтительнее других. Немного позже я подробнее разъясню смысл этих утверждений. Пока запомните такое общее положение, что лучше давать своим переменным такие названия, которые несут в себе определённое смысловое значение. Иногда лучше дать переменной длинное имя, если сложно подобрать осмысленную аббревиатуру.

Зарезервированные слова, называемые ключевыми, или служебными, — это слова, которые Python резервирует для собственных нужд, а посему никому непозволительно использовать их как-либо иначе, кроме способов, оговоренных в документации на Python. В перечень таких слов входят, например, имена инструкций if, for и многие другие. Полная таблица, в которой отображены все зарезервированные слова, приведена в конце этой главы.

  А теперь запустите интерпретатор, и мы попробуем на практике применить некоторые переменные (рис. 4.1).

  Обратите внимание, что когда Вы работаете с IDLE или Python в окне терминала, можно просто ввести имя переменной и нажать клавишу <Enter>, чтобы увидеть её значение. А если Вы используете Python в пакетном режиме для запуска и выполнения программ, у Вас такой фокус не пройдет. Для вывода переменной необходимо будет воспользоваться инструкцией print. Инструкция print может использоваться несколькими способами. Все они будут описаны немного позже. А сейчас просто запомните, что в диалоговом режиме (IDLE) инструкции print имя_переменной и просто имя переменной ведут себя одинаково.

Рис. 4.1. Примеры переменных

  На рис. 4.1 демонстрируется ещё одна важная концепция: присвоение значения переменной. Оператор присвоения (=) даёт команду взять значение, стоящее от оператора справа (правый операнд), и сохранить его в переменной, стоящей слева (левый операнд). Следует отличать данный оператор от похожего на него оператора равенства (==). Несмотря на внешнюю схожесть, назначение его совершенно иное, в чем Вы убедитесь в следующем разделе этой главы, когда мы займёмся рассмотрением инструкции if. Сейчас запомните, что один знак равенства означает присвоение значения, в то время как, два символа равенства выполняют сравнение левого и правого операндов.

  Строка googol=10**100L показывает нам, что в качестве правого операнда может выступать целое выражение. Выражение — это часть кода, выполняющая некоторую работу. В данном случае выражение 10**100L вычисляет значение 10100, а символ = помещает вычисленное значение в переменную под именем googol. С этого момента и до тех пор, пока Вы не выйдете из Python, переменная googol будет содержать именно это значение, если Вы его не поменяете. А Вы в любой момент можете сделать это. В уравнениях и вычислениях переменные используются точно так же, как и обычные числа. После того как Вы создали переменную (а в Python создание переменной происходит одновременно с присвоением ей какого-либо значения), эту переменную можно использовать так, как будто она является просто числом. Данное утверждение наглядно продемонстрировано на рис. 4.2.

Рис 4.2. Вычисления с использованием переменных

  *Прим. В. Шипкова: такое вольное обращение с переменными допускает далеко не каждый язык программирования. Даже последние реализации Бейсика настоятельно рекомендуют делать предварительные объявления типов переменных. В этом есть как сильные, так и слабые стороны.

  В следующем примере показано, что с помощью инструкции print можно выводить одновременно значения нескольких переменных, перечислив их через запятые, непосредственно числовые значения, называемые константами, и даже строки текста (рис. 4.3).

Рис. 4.3. Использование инструкции print 

  *Прим. В. Шипкова: внимательный читатель уже обратил внимание на тот факт, что символы с русской кодировкой вызвали ошибку программы. Я сразу подскажу как решить эту проблему (далее по тексту её решение не приводится): на самом деле Python очень дружелюбен к национальным кодировкам.

  Для использования в консоли, в начале файла указать:

# -*- coding: cp1251 -*-

 

  Для ДОС-кодировки:

# -*- coding: cp866 -*-

 

  Для использования в Windows (и в IDLE в том числе):

# -*- coding: utf8 -*-

  IDLE позволяет настроить эти параметры. Кроме всего прочего у каждой переменной (строковой) есть метод для перекодировки из одной кодовой таблицы в другую,пример:

 

a="Hello, World!"

b=a.encoding("utf8")

 

  В качестве кодировки может быть несколько десятков значений.

  Безусловно, переменные являются чрезвычайно важным средством в наборе инструментария программирования, но чтобы выполнять действительно полезные вещи, Вы нуждаётесь кое в чём ещё. Прежде всего, Вам необходимо знать, как сообщить компьютеру, что в какой-то момент времени необходимо выполнить опредёленное действие и в зависимости от результата выбрать дальнейшую последовательность действий. Принятие программой правильных решений — это тема оставшейся части данной главы. Чтобы программа работала так, как Вам нужно, следует разработать логику выполнения программы. Для управления логикой выполнения программы в Python используется несколько инструкций, осуществляющих ветвление программы. Мы начнём с наиболее важной и часто используемой инструкции if.

Инструкции if, elif и else

  Инструкция if является основным средством управления логикой выполнения программы. Синтаксис этой инструкции в Python очень прост:

if условие:

  выражения

  Компонент условие практически всегда содержит оператор сравнения. Таблица всех операторов сравнения Python приводится в конце этой главы в разделе "Практикум". Один из них — это оператор равенства (==). Обычно он используется для проверки того, что какая-то переменная равна некоторому значению, как показано в следующем примере:

if i == 1:

  выражения

  На русский язык приведенную выше проверку можно перевести примерно так: "Если переменная i равняется значению 1, то необходимо выполнить блок выражений". Блок выражений может содержать любое число строк со всеми возможными операторами и инструкциями, в том числе и другие инструкции if. В других языках программирования допускается, чтобы компонент условие был представлен целым выражением, что позволяло бы в строке с инструкцией if одновременно выполнять вычисление, присвоение и проверку результатов. Но Гуидо посчитал предоставление таких возможностей нецелесообразным. Например, если позволить программистам использовать в одной строке с инструкцией if оператор присвоения, то это приведёт к тому, что станут допустимыми выражения следующего типа:

if i = 1:

  выражения

  В результате переменной i присваивается значение 1, а затем выполняется проверка истинности переменной. Понятно, что результат проверки всегда будет истинным, так как переменная i всегда будет равна значению 1. В этом примере программист скорее всего просто случайно вместо оператора равенства (==) ввёл оператор присвоения (=), что является довольно распространенной ошибкой. При программировании на языке С часто тратится много времени на поиск ошибок подобного типа. Гуидо решил, что время, потраченное на отладку программы, лучше бы было посвятить программированию, поэтому в Python в строке за инструкцией if переменные можно только проверять, но не изменять.

  Блок выражений, следующих за инструкцией if, должен иметь отступ. В большинстве других языков программирования отступ является необязательным и служит лишь для улучшения читабельности кода. В Python отступ является составной частью языка и используется вместо специальных символов, которые в других языках устанавливают начало и конец блока. В языке Pascal, например, используется пара ключевых слов begin и end, поэтому для него конструкция с инструкцией if выглядит следующим образом:

if b<0 begin

  result:=result+pi;

end;

  Символ < обозначает меньше чем, тогда как символ > обозначает больше чем. Тот же самый код в языке С выглядел бы примерно так:

if(b<0)

{

  result=result+pi;

}

или вот так:

if (b < 0) result = result + pi;

  Обязательный отступ в Python — одна из наиболее спорных особенностей языка. По этому вопросу программисты разделились на два фронта. Одни горячо поддерживают это нововведение, другие ненавидят его. Поклонников языка Python, которых обязательное наличие отступа совершенно не трогает, меньше всего (я знал только одного — технического редактора американского издания этой книги). Но факт остаётся фактом, жаркие дискуссии о достоинствах и недостатках языка Python, которые иногда походят на военные баталии, чаще всего ведутся вокруг использования отступов как составной части языка. Лично я нахожу это решение интересным и полезным, так как Python тем самым прививает программистам навыки составления удобочитаемых кодов. Кстати, также считает и Гуидо, поэтому он пообещал, что во всех последующих версиях Python обязательное использование отступов сохранится. Поэтому если Вы хотите овладеть программированием на Python, то с этой его особенностью Вам придётся смириться, нравится она Вам или нет.

Когда я ещё только изучал основы программирования, в комментариях к программам и в телеконференциях часто встречался термин iff. В течение длительного времени это сбивало меня с толку, потому что я не мог понять, частью какого языка программирования была эта инструкция. Но однажды я натолкнулся на комментарий в одной программе, который гласил: "iff. это if и ничего кроме if.

  Полный синтаксис инструкции if предоставляет больше возможностей по управлению логикой выполнения программы:

if условие:

  выражения

elif условие:

  выражения

elif условие:

  выражения

else:

  выражения

  Блоки выражений могут быть любой длины и включать любые допустимые инструкции Python. Сейчас мы посмотрим, как все это работает, поэкспериментировав с этими инструкциями в IDLE. Помните григорианское и юлианское правило определения високосного года, о кагором мы говорили в предыдущей главе? Запускайте IDLE. На рис. 4.4 показан полный вариант конструкции с инструкцией if. Данная программа используется для определения високосных годов в григорианском календаре.

Рис. 4.4. Инструкция if и григорианский календарь

Обратите внимание, как редактор IDLE указывает завершение работы из кода блока программы. Для блока автоматически задается отступ, который хорошо виден на рис. 4.4. Нажатие клавиши <Enter> после пустой строки блока означает, что работа над блоком закончена. Редактор IDLE автоматически отменит отступ текущего блока и вернет курсор к началу строки (как на рис. 4.4) или к отступу предыдущего блока. Интерпретатор будет вести себя аналогично при работе в режиме командной строки, хотя отступы будут выглядеть несколько иначе.

  Для юлианского календаря Вам нужно будет проверять только условие делимости на 4. В юлианском календаре 1900 год был бы високосным.

  В условии инструкции if допускается выполнять несколько проверок. Для этого используются специальные логические операторы and, or и not. Если в одну инструкцию if поместить две проверки условий, объединённые оператором and, то if возвратит true (истинно) только в том случае, если будут истинными оба условия. Если первая проверка возвратит значение false (ложно), то вторая проверка выполняться уже не будет. При использовании оператора or истинной может быть любая из проверок. Если первая проверка возвращает true, то вторая проверка проводиться не будет, поскольку в ней уже нет смысла. На рис. 4.5 показано объединение двух условий в инструкции if.

Рис. 4.5. Объединение двух условий с помощью оператора and

  В приведенном примере сначала проверяется условие делимости на 400, и эта проверка возвращает значение false. Поэтому проверка делимости на 100 уже не выполняется.

Инструкция for и функция range()

  Хотя if — чрезвычайно полезная инструкция, с её помощью можно решить далеко не все проблемы с управлением логикой выполнения программы. Например, она бесполезна в тех случаях, когда нужно выполнить какой-нибудь программный блок много раз. В Python имеется инструкция for, которая идеально подходит для решения этой задачи. С её помощью можно повторить выполнение блока требуемое число раз, хотя отсчёт циклов происходит несколько иначе, чем в других языках программирования. В других языках для программирования числа циклов используются специальные переменные, определяющие условия начала и завершения цикла. Определение этих условий может быть связано со сложными вычислениями. Инструкция for языка Python работает проще. Ей предоставляется список значений, которые поочередно присваиваются целевой переменной, используемой в блоке выражений, следующем за инструкцией for. Вот синтаксис применения этой инструкции:

for целевая_перененвая in список:

  выражения

else:

  выражения "выполняются только в том случае,

  если цикл не бал прервав инструкцией break"

  Блок выражений, следующий за инструкцией for, называется телом цикла. В теле инструкции for можно использовать инструкцию прерывания break, которая делает именно то, что следует из её названия, — прерывает выполнение цикла. Выражения, следующие за else, выполняются только в том случае, если цикл не был прерван инструкцией break. Как правило, выполнение этой части кода случается крайне редко. Как знамение Божье, выполнение данных выражений должно сигнализировать о совпадении неких уникальных событий. Более подробно мы изучим инструкцию break в следующем разделе, когда перейдем к рассмотрению конструкций с инструкцией while. А пока взгляните на рис. 4.6, где показан пример применения инструкции for.

Рис. 4.6. Инструкция for

  Как показано в примерах на рис. 4.6, компонент список действительно является списком некоторых значений, представленных с использованием следующих трёх допустимых синтаксисов: 1,2,3,4, (1,2,3,4,5) и ["а",2,3,4,"е"]. Инструкция for поочерёдно на каждой итерации присваивает переменной i значения из списков и выполняет выражения тела цикла. Вы можете убедиться, что всё именно так и происходит, поскольку в нашем примере тело цикла содержит единственную инструкцию print i, которая выводит на экран текущее значение переменной i. Обратите внимание, что совершенно необязательно, чтобы в списке были только числа. Инструкция for одинаково хорошо справляется также с символами и целыми строками, выступающими элементами списка.

Термин итерация означает повторное выполнение чего-либо много раз. Таким образом, этот термин подходит для описания выполнения одного цикла программы, хотя в этом случае ещё иногда говорят о шаге цикла. Забивание молотком гвоздя в стену также можно назвать повторяющимся циклическим процессом. При этом каждый удар молотка будет итерацией. При успешном завершении всех циклов удара молотка Вы получите полезный результат — забитый в стену гвоздь. При неуспешном выполнении — побитые пальцы.

  Очевидный недостаток показанного выше синтаксиса использования инструкции for — это необходимость вводить в программу список всех возможных значений целевой переменной, который может оказаться слишком длинным. Эту проблему можно решить с помощью функции range(). Функция range() — это ещё одна встроенная функция языка Python. (Термин встроенная означает, что Python всегда знает о ней, поэтому нет необходимости как-либо определять её в программе перед использованием.) Данная функция генерирует упорядоченные списки чисел. Можно использовать её четырьмя способами. Первый, и самый простой, показан в первой строке на рис. 4.7.

Рис. 4.7. Функция range()

  Первый вариант — range (10) — всего лишь указывает функции составить список, содержащий цифры от 0 до 9. Её единственный аргумент — это не размер списка, а последнее число списка, тогда как начальное значение всегда равно нулю. Как и в языке С, числовые последовательности начинаются с нуля, а заканчиваются (при положительном приращении) числом, которое на единицу меньше граничного значения. Например, если граничное значение равно 10, выход из цикла произойдет после 9. Интересно, что произойдет, если подставить отрицательное число? А что случится, если попытаться выполнить range(0)? Попробуйте сделать это сами.

  Вторая форма, также показанная на рис. 4.7, — range(-5,10). Функция должна составить список, который, как и в прежнем случае, заканчивается значением, на единицу меньше граничного (т.е. 9), но начинающийся с -5. Вот так можно получить список, который будет начинаться с отрицательного числа.

  Третий вариант— range(-5,20,2) — показывает, что в общем случае существуют три допустимых аргумента этой функции: необязательный аргумент начала, обязательный аргумент окончания и вспомогательный параметр — шаг. Как видите, при использовании этой формы записи список начинается с —5, приращение для каждого следующего элемента составляет 2, а заканчивается список значением 19.

  Наконец, четвёртый вариант демонстрирует, что range () не всегда должна следовать в положительном направлении. Если начальное значение больше конечного, а шаг отрицательный, то функция range() создаёт последовательность уменьшающихся значений.

  В программах на языке Python часто используется комбинация функций и инструкций for, range() и if- На рис. 4.8 показан пример такой конструкции.

Рис. 4.8. Конструкция с инструкциями for, if и функцией range()

Инструкция while

  Инструкция while, также относится к числу тех, которые сообщают Python, что определённое действие необходимо выполнить несколько раз. Но в отличие от инструкции for она имеет другую синтаксическую конструкцию. Ее синтаксис показан на рис. 4.9.

Рис. 4.9. Инструкция while с проверкой условия

  Конечно, посчитать от 0 до 9 можно было и с помощью инструкции for. Но инструкцию while можно использовать не только для счёта. Ее назначение — отслеживать присутствие в списке особого элемента или выполнение какого-либо события. На рис. 4.10 показана первая из этих двух ситуаций.

  Обратите внимание, что в этом примере показана ложная проверка условия while 1, всегда возвращающего true. Это означает, что до тех пор, пока Вы как программист не вмешаетесь в работу программы, инструкция while 1 будет выполняться вечно. Этот случай называется бесконечным циклом. Бесконечный цикл, который действительно выполнятся вечно, — это одна из ошибок программирования. Но тот же бесконечный цикл может оказаться весьма полезным и эффективным решением в том случае, если Вы предусмотрите условие его прерывания. В условии инструкции while, как и в случае с инструкцией if, мы не можем присваивать значения переменным. На рис. 4.11 показана попытка присвоить значение переменной i в условии инструкции while, что завершилось показом сообщения об ошибке. Следовательно, заботу об изменении значения переменной i мы должны взять на себя. Именно поэтому в коде появилась строка i = i - 1. И в заключение рассмотрим способ выхода из бесконечного цикла. Как правило, для этого используется комбинация инструкций if и break, в которой проверяется соответствие целевой переменной опредёленному значению и в случае обнаружения тождества прерывается цикл while.

Рис. 4.10. Бесконечный цикл с инструкцией while

  *Прим. В. Шипкова: на самом деле на рисунке вверху не изображён бесконечный цикл - на нём изображён НЕПРАВИЛЬНЫЙ цикл. Бесконечный цикл будет выглядеть так:

a=20

while a>=15:

  print "Das ist kaput!"

a=a-10

  В указанном примере цикл while будет выполняться до тех пор, пока а больше или равно 15. Но в связи с тем, что значение а меняется только за пределами цикла - такой цикл будет действительно "вечным". Учитывая тот факт, что нет условия выхода из этого цикла - этот цикл является ошибкой программиста.

Рис. 4.11. Ошибка, связанная с попыткой присвоить значение в условии инструкции while

  *Прим. В. Шипкова: а вот на этом рисунке как раз должен быть рисунок 4.10. %-)

  Полный синтаксис инструкции while, как и в случае с инструкцией for, содержит ещё блок else:

while условие:

  выражения

else:

  выражения "выполняются только в том случае,

  если цикл не бал прервав инструкцией break"

  Опять-таки, блок инструкций за инструкцией else выполняется только при "естественном" завершении цикла while.

  Другой вариант бесконечного цикла с инструкцией while, который будет выполняться до тех пор, пока не произойдет некоторое событие, представлен на рис. 4.12.

  Действительно, данный пример выглядит несколько надуманно, но в следующем разделе мы найдем способ сделать данный код более естественным.

Рис. 4.12. ещё один пример бесконечного цикла с инструкциями while и if

  *Прим. В. Шипкова: как видно, всё-таки этот цикл закончился без экстренных мер - этот цикл не является бесконечным.

Инструкции break, continue и pass

  Как Вы уже видели раньше, инструкция break используется для выхода из цикла, заданного инструкцией for или while. В других ситуациях Вы можете посчитать более целесообразным не выходить из цикла полностью, а продолжить его выполнение начиная с первой строки тела цикла. Именно это выполняет инструкция continue. Когда в программе в теле какого-либо цикла встречается данная инструкция, выполнение программы немедленно переходит к самому первому выражению в теле цикла for или while, игнорируя все оставшиеся выражения в блоке. Таким образом, с помощью комбинации инструкций continue и if можно добиться того, чтобы перед завершением цикла программа выполняла специальный набор выражений, как показано на рис. 4.13. (Этот пример является модификацией предыдущего кода, выполнение которого показано на рис. 4.12. В данном случае результат выглядит более естественным.)

Рис. 4.13. Конструкция с инструкциями while, break и continue

  Единственное различие между этим примером и предыдущим состоит в том, что благодаря использованию инструкции continue к последнему значению переменной у не прибавляется значение 100. Окончательный результат в этом случае будет равен нулю, тогда как в предыдущем примере цикл завершался со значением переменной у, равным 100.

  В Python есть ещё одна важная инструкция: pass, которая, правда, не очень часто применяется в циклах for и while. В основном она используется в опредёлениях классов, которые мы рассмотрим в части II этой книги. Инструкция pass применяется для указания Python, что в этом месте он ничего не должен делать. Такие инструкции в литературе называют no-op (от no operation — бездействие.) Может показаться весьма странным, что компьютеры нуждаются в подобной специальной инструкции, поскольку они только тем и занимаются, что выполняют то, что им явно укажут сделать (по крайней мере, так считают большинство людей). Но на заре создания компьютерных игр инструкции no-op часто использовались для создания игрового таймера. Принцип их использования заключался в том, что хотя по данной команде не выполняется никакая работа, но для её обработки компьютер все равно затрачивает опредёленное время. Поэтому, чтобы некоторое событие произошло вовремя, программисты обычно использовали циклы for, которые ничего не делали в течение заданного количества циклов. Таким образом, просто обеспечивалась требуемая задержка в выполнении программы, что позволяло управлять последовательностью событий в реальном времени. Инструкции бездействия типа pass уже не играют столь важной роли, как это было раньше, но иногда они все же смогут оказаться полезными. На рис. 4.14 показан пример использования инструкции pass совместно с инструкцией if. Если удалить строку с инструкцией pass, то код также будет выглядеть логичным:

if test:

else:

  do something

  Но в этом случае Python покажет сообщение об ошибке (если- хотите, проверьте). Представленный выше синтаксис является недопустимым в Python. Правильным будет написать так, как показано на рис. 4.14.

Рис. 4.14. Конструкция с инструкциями if и pass

Завершённая программа

  Как и было обещано, ниже приведён листинг завершённой программы, в которой используются средства программирования, рассмотренные в данной главе.

Листинг 4.1. Завершённая программа с использованием средств управления логикой выполнения

#! с:\python\python. ехе

# верхнюю строку совсем не обязательно указывать

import sys

import string

 

if len(sys.argv)<2:

  print "Usage: leap.py year, year, year."

  sys.exit(0)

 

for i in sys.argvj[:]:

try:

  у=string.atoi(i)

except:

  print i,"is not a year."

continue

  leap="no"

  if у%400==0:

    leap="yes"

  elif у*100==0:

    leap="no"

  elif у%4==0:

    leap="yes"

  else:

    leap="no"

 

  print y, "leap:", leap, "in the Gregorian calendar"

 

if у%4==0:

  leap="yes"

else:

  leap="no"

 

print y, "leap:", leap, "in the Julian calendar"

 

print "Calculated leapness for", len { sys.argv ) - 1, "years"

  Вы можете набрать эту программу в текстовом редакторе и сохранить в файле под названием leap.py. Запустите её на выполнение, введя в командной строке DOS или оболочки UNIX python leap.py 1900 1904 2000. Затем попытайтесь ввести данные, не являющиеся годом, например abcde. Посмотрите, как отреагирует программа на попытку обмануть её. Немного позже Вы познакомитесь с этой странной записью [1:], а также с функцией len() и другими операторами и инструкциями, которых прежде ещё не встречали.

Резюме

  В ходе рассмотрения переменных в Python Вы узнали, что некоторые слова в этом языке зарезервированы для специальных целей. В табл. 4.1 приводится список всех ключевых слов языка Python.

Таблица 4.1. Ключевые слова в Python

and

elif

global

or

assert

else

if

pass

break

except

import

print

class

exec

in

raise

continue

finally

is

return

def

for

lambda

try

del

from

not

while

  Примите к сведению, что в Python допускается использовать названия функций в качестве имён переменных. Другими словами, вполне возможно использовать int в качестве имени переменной, хотя это слово является названием встроенной функции int(). Но так поступать не стоит. На рис. 4.15 показано, что может произойти, если непродуманно поступать подобным образом.

Рис. 4.15. В Python не всё разрешено, что не запрещено

  Имена функций в Python являются всего лишь переменными особого типа и не защищены от неправильного употребления.

  В этой главе Вы также научились создавать конструкции с инструкцией if. В условии инструкции if используются операторы сравнения, полный список которых приведён в табл 4.2.

Таблица 4.2. Операторы сравнения в Python

a<b

Истинно, если а меньше b

а <= b

Истинно, если а меньше или равно b

а>b

Истинно, если а больше b

а >= b

Истинно, если а больше или равно b

а==b

Истинно, если а равно b

а != b

Истинно, если а не равно b

a is b

Истинно, если а тождественна b

a is not b

Истинно, если а не тождественна b

a<b<c

Истинно, если а меньше b и b меньше с. (Возможна аналогичная комбинация с оператором>)

a and b

Если а равно 0 или None, использовать а, иначе использовать b

not a

Истинно, если а равно 0 или None (специальное значение non-value — нет значения)

a or b

Если а равно 0 или None, использовать b, иначе использовать а

  Термин тождественная или не тождественная, использованный в предыдущей таблице, означает, что переменные содержат (не содержат) ту же самую информацию. Например, выражение a is b возвратит true, если переменным и а и b присвоить значение hello или обеим этим переменным присвоить значение 1.

  В этой главе Вы также познакомились с основными инструкциями управления логикой выполнения программы: for, while, break, continue и pass. ещё Вы узнали о функции range(), которая часто используется с инструкцией for. И в заключение мы создали работоспособную программу, в которой использовали средства программирования, рассмотренные на этом занятии.

Практикум

Вопросы и ответы

 Сколько всего существует инструкций управления логикой выполнения программы?

  Немного, всего только шесть вместе с инструкцией goto, которая, к превеликому счастью, отсутствует в Python. Но в действительности их вполне достаточно для выполнения всех возможных задач.

Для чего нужны эти знаки двоеточия в конце строк?

  Двоеточия используются для явного обозначения окончания выражений с инструкциями, такими как if и др. Хотя вполне приемлемо использовать в коде программы инструкцию if, например, в следующем виде:

if а<b<с: print a, b, с

else: print с, b, a

  В этом случае использование двоеточия является единственным способом отделить собственно инструкцию if от сопутствующего ей блока выражений. Но с моей точки зрения, стиль, который я использовал до сих пор (и буду использовать в дальнейшем), более удобен для понимания, хотя, безусловно, это дело вкуса.

  Очевидно, что использование имени функции в качестве имени переменной трудно назвать хорошей практикой программирования, поскольку это чревато ошибками в программах на языке Python.

  Существуют ли языки, которые были бы настолько сообразительны, чтобы отличать имена встроенных функций от одноимённых переменных? (Например, позволяли бы использовать int или range в качестве имени переменной.)

  Трудно сказать, следует ли такую возможность отнести к сообразительности или к недостатку языка. В любом случае такое использование имён никогда не станет хорошим стилем программирования.

  Чем так плоха инструкция goto? Разве способность продолжать выполнение программы с любой строки не расширила бы возможности программиста?

  Проблема с инструкцией goto большей частью состоит не в возможности переходить к выполнению любой строки программы, а в том, чтобы отследить, откуда Вы пришли и как Вы сюда попали, что чревато большой путаницей.

Контрольные вопросы

  1. Что такое переменные?

    а) Иксы и игреки.

    б) Числа, которые беспорядочно изменяются, когда Вы за ними не следите.

    в) Имена, символизирующие конкретные значения, которые можно изменять.

    г) Звезды с изменяющейся яркостью свечения.

  2. Каким термином называют блок выражений, следующий за инструкциями if, for и while?

    а) Тело.

    б) Фрагмент.

    в) Фрагмент тела.

    г) Массив.

  3. Что означает выражение а>b<с?

    а) Это недопустимая комбинация операторов, которая в Python не имеет никакого смысла.

    б) Объединить значения переменных а и с и поместить результат в переменную b.

    в) Сравнить указанные три значения и, если b меньше остальных двух, возвратить true.

    г) Вывести на печать переменную b только в случае, если а и с больше её.

Ответы

  1. в. Переменные — это имена, символизирующие конкретные значения, которые можно изменять.

  2. а. Правильный термин для обозначения блока выражений, следующего за инструкциями if, for и while, — тело. Выражения, относящиеся к одному блоку, выделены в коде одинаковым отступом.

  3. в. Данное выражение сравнивает значения переменных и, если переменная b меньшей двух остальных, возвращает значение true. Более того, Вы не ограничены только двумя операторами сравнения. Вы можете записать строку if a<b<c<d< ...и продолжать цепочку сравнения сколь угодно долга

Примеры и задания

  Попытайтесь заново составить программу вычисления високосного года, представленную в листинге 4.1, чтобы в ней использовалась инструкция while вместо for. Попытайтесь, по мере сил, усовершенствовать код программы.

  Найдите в Internet ссылки на самые первые компьютеры и посмотрите, имеется ли какая-нибудь информация о языках программирования для них. Посмотрите также, какие инструкции управления логикой выполнения программ имелись в этих первых языках программирования