Главная страница

Питон для нормальных. Учебник Москва Базальт спо макс пресс 2018


Скачать 2.54 Mb.
НазваниеУчебник Москва Базальт спо макс пресс 2018
АнкорПитон для нормальных
Дата05.10.2022
Размер2.54 Mb.
Формат файлаpdf
Имя файлаsysoeva_sysoev_piton_dlya_normalnyh_ch1.pdf
ТипУчебник
#715174
страница4 из 14
1   2   3   4   5   6   7   8   9   ...   14
редакторов сценариев и искусственного интеллекта, исчисляется сотнями. Мно- гие простые игры, браузерные игры и игры для мобильных устройств использу- ют модуль pygame, предоставляющий простой и удобный доступ к библиотекам трёхмерной графики OpenGL и управления звуком OpenAL.
1.5.6
Программирование математических и научных вычислений
Python представляет собою удачный компромисс между языком общего на- значения и математическими пакетами. Сам по себе «чистый» Python пригоден только для несложных вычислений.
Ключевая особенность Python — его расширяемость. Это, пожалуй, самый расширяемый язык из получивших широкое распространение. Как следствие этого, для Python не только написаны и приспособлены многочисленные биб- лиотеки алгоритмов на C и Fortran, но и имеются возможности использования других программных средств и пакетов, в частности, R и SciLab, а также гра- фопостроителей, например, Gnuplot и PLPlot.
Ключевыми модулями для превращения Python в математический пакет яв- ляются numpy, matplotlib и scipy. Кроме них популярностью пользуются sympy для символьных вычислений, ffnet для построения искусственных нейронных сетей, pyopencl/pycuda для вычисления на видеокартах и некоторые другие.
Возможности numpy и scipy покрывают практически все потребности в матема- тических алгоритмах.
Одним из важнейших преимуществ Python является то, что все известные его реализации, дополнительные специальные модули, в том числе numpy, scipy и matplotlib, а также большинство сред разработки распространяются свобод- но. Это означает возможность всегда иметь любимое средство разработки под рукою.
1.6
Первая программа. Среда разработки. Интерактивный и скриптовый режим. Примеры решения заданий
1.6.1
Установка Python
Установка Python на компьютер зависит от используемой операционной си- стемы. Существуют несколько основных подходов. Нужно понимать, что следу- ет различать базовую установку, включающую интерпретатор, среду разработки
IDLE, а также стандартную библиотеку, и установку дополнительных модулей,
которых для Python написано очень много.

28
Глава 1. Введение
Таблица 1.3. Способы установки Python
Базовая установка
Дополнительные модули
ОC
установщик с официального сайта https://python.org встроенный механизм pip,
любые
Linux,
Windows,
MacOS X
использование специальных сборок: WinPython, Pyzo,
Anakonda и др.
частично встроены, расши- рение затруднительно зависит от сборки установка штатными сред- ствами ОС
зависит от типа и версии ОС
Linux,
MacOS X
Все эти способы имеют свои преимущества и недостатки:
• При установке с официального сайта в Linux и MacOS X вам придётся столкнуться с тем, что у вас будут 2 частично пересекающихся интерпре- татора Python в системе. Дело в том, что эти две ОС частично используют
Python в своих целях и какой-то (часто не самый свежий) интерпретатор по- ставляется в комплекте. В результате, замена его свежим интерпретатором с официального сайта может частично нарушить работу ОС (конечно, это- го можно не допустить или поправить, но для новичка такой подход может стать фатальным). В Windows нет своего Python по умолчанию, поэтому установка базового функционала пройдёт штатно, но есть другая проблема:
многие полезные модули содержат код на других языках: в первую очередь это Fortran и C, а также могут зависеть от внешних библиотек, также напи- санных на других языках, например, библиотеки линейной алгебры Lapack или графической библиотеки QT. В Linux есть штатная возможность уста- новить все нужные компиляторы и библиотеки средствами самой ОС, в меньшей степени эта же возможность есть в Mac OSX, но Windows здесь не предоставляет почти ничего, всё придётся искать и ставить своими ру- ками.
• При использовании специализированных сборок вы получаете готовую и настроенную среду программирования со множеством установленных мо- дулей помимо стандартной библиотеки. Но если вы захотите что-то сверх того, что там есть, вам придётся сильно помучаться. Часть сборок, напри- мер WinPython, ориентированы на определённую ОС.
• Установка штатными средствами ОС (через менеджер пакетов, например
Synaptic в Debian/Ubuntu/AltLinux) — лучший выбор пользователя Linux,
так как все устанавливаемые таким образом модули будут работать штатно почти наверняка, все необходимые библиотеки и компиляторы будут авто- матически установлены и правильных версий. Редкие недостающие пакеты,
как правило, можно доставить через pip. Но в MacOS X такой способ слож- но рекомендовать, поскольку число шатано доступных пакетов невелико, а

1.6. Первая программа. Среда разработки
29
Рис. 1.3. Интерактивный режим среды разработки IDLE.
сами они часто очень древних версий. В Windows такой способ вовсе невоз- можен.
Суммируя выше сказанное, мы будем рекомендовать пользователям Linux пользоваться своим шатаным менеджером пакетов, а пользователям Windows —
использовать стандартную сборку WinPython, включающую модули для мате- матических и инженерных расчетов, построения графиков и многие другие, с сайта http://winpython.github.io/.
Помните, что Python и модули к нему — свободное программное обеспечение.
Вы можете выбирать способ установки и нужные вам модули наиболее удобным для вас способом и не думать ни о какой плате и лицензионных отчислениях.
1.6.2
Интерактивный режим и первая программа
После загрузки и установки Python открываем IDLE (среда разработки на языке Python, поставляемая вместе с дистрибутивом). Запускаем IDLE (изна- чально запускается в интерактивном режиме). Далее последует приглашение к вводу (
>>>
).
Теперь можно начинать писать первую программу. Традиционно, первой про- граммой у нас будет «Hello, world». Чтобы написать «Hello, world» на Python,
достаточно всего одной строки:
>>>
p r
i n
t
( ’ Hello , Ђ World ’)
Функция print выводит данные на экран.
Интерпретатор выполняет команды построчно: пишешь строку, нажимаешь

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

30
Глава 1. Введение
Рис. 1.4. Вывод надписи «Hello, world» в интерактивном режиме в среде разра- ботки IDLE.
шлось бы сначала написать код на исходном языке программирования, затем скомпилировать, и уже потом запустить исполняемый файл на выполнение.
Кстати, если интерпретатору Python дать команду import this (импортиро- вать «сам объект» в себя), то выведется так называемый «Дзен Python», иллю- стрирующий идеологию и особенности данного языка. Считается, что глубокое понимание этого дзена приходит тем, кто сможет освоить язык Python в полной мере и приобретет опыт практического программирования.
Хотя интерактивный режим будет вам ещё не раз полезен при написании и отладке программ и тестировании возможностей языка, всё же он не является основным. В большинстве случаев программист сохраняет код в файл, и запус- кать уже файл. Такой режим работы называется скриптовый. Файлы с кодом на
Python обычно имеют расширение py.
Для того, чтобы создать новое окно для написании скрипта, в интерактивном режиме IDLE выберите File → New File (или нажмите + N). В открыв- шемся окне попробуйте ввести следующий код:
name =
i n
p u
t
( ’Как вас зовут? ’)
p r
i n
t
( ’Привет, ’ , name )
Функция input считывает данные, введённые с клавиатуры, и записывает их в переменную name.
Первая строка печатает вопрос («Как вас зовут?»), ожидает, пока вы напе- чатаете что-нибудь и нажмёте и сохраняет введённое значение в пере- менной name.
Во второй строке используется функция print для вывода текста на экран, в данном случае для вывода "Привет, " и того, что хранится в переменной name.

1.6. Первая программа. Среда разработки
31
Рис. 1.5. Скриптовый и интерактивный режим: в интерактивном режиме можно видеть результаты выполнения скрипта.
Теперь нажмём F5 (или выберем в меню IDLE Run → Run Module) и убедимся,
что написанное работает. Перед запуском IDLE предложит нам сохранить файл.
Сохраним туда, куда вам будет удобно, после чего программа запустится.
Для «сложения» строк можно также воспользоваться оператором
+
:
p r
i n
t
( ’Привет, ’ +
s t
r
( name ) + ’! ’ ).
1.6.3
Задания
Задание 1 (Ввод/вывод данных) Здесь собраны задачи по сути учебные,
но полезные. Их выполнение позволит вам «набить руку» и выработать необходимые навыки. Задания необходимо выполнить в интерактивном и скриптовом режимах. Выполнять следует все и по порядку.
Напишите программу:
1. последовательно запрашивающую ваши фамилию, имя, отчество и выводящую их одной строкой в последовательности: фамилия →
имя → отчество;
2. последовательно запрашивающую ваши фамилию, имя, отчество и выводящую их одной строкой в последовательности: имя → отче- ство → фамилия;
3. преобразующую простую русскую фамилию в мужском роде в жен- ский род (Петров → Петрова; Путин → Путина);
4. последовательно введите число, месяц, год рождения; выведите да- ту своего рождения через точки (01.01.2000), слэши (01/01/2000),
пробелы (01 01 2000), тире (01-01-2000).

Глава 2
Основные типы данных
В Python имеется множество встроенных типов данных. Все типы делятся на простые и составные. Переменные
1
простых типов состоят из единственного зна- чения, к ним относятся числа (всего 3 типа: целые, действительные и комплекс- ные) и логические переменные. Переменные составных типов состоят из набора значений и, в свою очередь, делятся на неизменяемые, для которых нельзя из- менять значения элементов, добавлять или изымать элементы, и изменяемые,
для которых всё это можно делать. К неизменяемым типам относятся строки и кортежи, к изменяемым — списки, словари и множества.
Чтобы получить корректно работающую программу, важно понимать, к ка- кому типу относится переменная. В Python тип переменной не объявляется, а автоматически определяется при присвоении ей значения.
2.1
Числа. Арифметические операции с числами. Модуль math
Числа в Python делятся на:
• целые,
• действительные (с плавающей точкой размером в 64 бита),
• комплексные (с плавающей точкой размером в 128 бит).
1
Строго говоря, «переменных» в классическом смысле в Python нет, а есть имена, связан- ные с некоторыми объектами в памяти. Но использование термина «переменная» удобно и принято в программировании. Под переменными мы будем понимать именно сами объекты.
Называть переменными имена неудобно, так как на протяжении работы программы одно и то же имя может быть сопоставлено разным объектам, поэтому получилось бы, что переменные имеют переменный тип или не имеют его вовсе, что создаёт путаницу, так как типы активно используются в Python. Для краткости, однако, мы будем иногда употреблять выражения типа
«переменная a», подразумевая объект, имеющий в данный момент имя a, в тех случаях, когда это не создаёт путаницы.

2.1. Числа. Арифметические операции с числами. Модуль math
33
Python поддерживает динамическую типизацию, то есть тип переменной определяется только во время исполнения. Переменная может быть переопре- делена, при этом её тип изменится:
>>> a =2
>>> a
2
>>> a =2.0
>>> a
2.0
>>> a =2+3 j
>>> a
(2+3 j )
Инструкция a = 2 создаёт числовой объект-переменную с целочисленным значением 2 и присваивает ему имя a. Далее инструкция a = 2.0 создаёт новый числовой объект с действительным значением 2.0 и присваивает уже ему имя a.
А объект со значением 2 удаляется из памяти автоматически сборщиком мусо- ра (англ. garbage collector, специальный процесс, периодически освобождающий память, удаляя объекты, которые уже не будут востребованы приложениями),
т. к. была потеряна последняя ссылка на этот объект. Затем инструкция a=2+3j создаёт числовой объект с комплексным значением и всё с тем же именем, а объект с действительным значением удаляется.
В интерактивном режиме есть возможность быстро вызвать предыдущую ко- манду сочетанием + p. Поэтому легко можно поправить a=2 на a=2.0.
При операциях с числами существует общее правило: результат будет того же типа, что и операнды, если операнды разных типов, то результат будет при- ведён к наиболее общему из всех имеющихся. Порядок общности естественный:
целые
→ действительные → комплексные. Следующий пример иллюстрирует это правило:
>>> a =2
>>> b =2+3 j
>>> a + b
(4+3 j )
Так же полезно запомнить, что для проверки типа любого значения и любой переменной можно использовать функцию type():
>>> a =5
>>> b =17.1
>>> c =4+2 j
>>>
t y
p e
( a );
t y
p e
( b );
t y
p e
( c )
<
l a
s s
’ int ’ >
<
l a
s s
’ float ’ >
<
l a
s s
’ complex ’ >

34
Глава 2. Основные типы данных
Приведённая программа имеет особенность: в четвёртой строке записано сра- зу 3 оператора. Так можно делать, но при этом для разделения операторов нужно использовать «;» (после последнего она не обязательна). Пробелы в большинстве случаев необязательны.
Можно явно преобразовывать значение любого типа с помощью соответству- ющих функций int(), float() или complex():
>>> a =5
>>>
i n
t
( a )
5
>>>
f l
o a
t
( a )
5.0
>>>
o m
p l
e x
( a )
(5+0 j )
Важно помнить, что комплексное число нельзя преобразовать с помощью функ- ций int() и float() к целому или действительному. Функция int() отбрасывает дробную часть числа, а не округляет его:
>>> a =4.3
>>>
i n
t
( a )
4
>>> b = -4.3
>>>
i n
t
( b )
-4
А теперь про подводные камни и отличие третьего Python от второго при ра- боте в скриптовом (текстовом) режиме. Напишем в текстовом режиме в Python
3.x простую программу, которая должна складывать два введённых числа и вы- водить результат на экран:
a =
i n
p u
t
( ’Введите первое число: ’)
b =
i n
p u
t
( ’Введите второе число: ’)
p r
i n
t
( a + b )
Ход работы программы:
Введите первое число: 10
Введите второе число: 4 104
Получили совсем не то, что ожидали. Python версий 2.x поддерживал авто- матическое определение типа переменной при вводе с клавиатуры. Однако это часто вызывало различные ошибки или сложности. Поэтому при проектирова- нии версии 3.0 было решено отказаться от автоматического определения типа и всегда считывать данные как строку. Поэтому, если мы хотим действительно сложить два числа, программу придется переписать:

2.1. Числа. Арифметические операции с числами. Модуль math
35
a =
i n
t
(
i n
p u
t
( ’Введите первое число: ’ ))
b =
i n
t
(
i n
p u
t
( ’Введите второе число: ’ ))
p r
i n
t
( a + b )
Вывод программы:
Введите первое число: 10
Введите второе число: 4 14
Python поддерживает все основные арифметические операторы (см. табл. 2.1).
Таблица 2.1. Арифметические операции с числами и встроен- ные функции c одним и двумя аргументами x + y
Сложение — сумма x и y (
2 + 3 = 5
)
x - y
Вычитание — разность x и y (
5 - 2 = 3
)
x * y
Умножение — произведение x и y (
2 * 3 = 6
)
x / y
Деление x на y:
4 / 1.6 = 2.5
,
10 / 5 = 2.0
, результат всегда типа float x // y
Деление x на y нацело:
11 // 4 = 2
,
11.8 // 4 = 2.0
, результат целый, только если оба аргумента целые x % y
Остаток от деления:
11 % 4 = 3
,
11.8 % 4 = 3.8000000000000007
(присутствует ошибка, связанная с неточностью представления данных в компьютере)
x ** y
Возведение x в степень y: (2 ** 3 = 8)
abs(x)
Модуль числа x round(x)
Округление (round(11.3) = 11)
round(x, n)
Округляет число x до n знаков после запятой: round(12.34567,
3) = 12.346
pow(x, y)
полный аналог записи x ** y divmod(x, y)
выдаёт два числа: частное и остаток, обращаться следует так:
q, r = divmod(x, y)
Отметим, что операции сложения, вычитания, умножения и возведения в сте- пень выдают ответ типа int только если оба аргмента целые, типа float, если один из аргументов действительный, а другой — целый или действительный, и типа complex, если хотя бы один аргумент комплексный. Операция возведения в степень также может выдать комплексный результат при возведении отрица- тельных чисел в степень кроме случая, когда эта степень целая и нечётная. То есть, эти опраторы в Python подчиняются общеупотребительным правилам пре- образования типов.

36
Глава 2. Основные типы данных
Оператор деления традиционно является «проблемным»: результат его рабо- ты в разных языках программирования определяется разными правилами. Для
Python версии 3.x деление «/» всегда действительного типа. В Python версии
2.x деление подчинялось другому правилу: если оба операнда целые — результат будет целый, иначе — действительный. Приведём небольшую программу–пример для иллюстрации работы операторов «/», «//» и «%» на Python 3.4.3:
>>> a = 5; b = 98
>>> c1 = b / a ; c2 = b // a ; c3 = b % a
>>> c1 ; c2 ; c3 19.6 19 3
Таблица 2.2. Встроенные функции c последовательностями или произвольным числом аргументов max(a, b,...)
Максимальное число из двух или более: max([2, 6, 3]) = 6
min(a, b,...)
Минимальное число из двух или более: min([2, 6, 3]) = 2
max(seq)
Максимальный элемент последовательности: max([2,6,3]) =6
min(seq)
Минимальный элемент последовательности: min([2, 6, 3])=2
sum(seq)
Сумма элементов последовательности, например, кортежа sum((2, 6, 3)) = 11
или списка sum([2, 6, 3]) = 11
sorted(seq)
Отсортированный список: sorted([3, 2, 5, 1, 4]) = [1,
2, 3, 4, 5]
То, что описанные функции являются встроенными, означает, что они доступ- ны без всяких дополнительных действий. Однако встроенных функций немного,
гораздо больше функций находится в стандартной библиотеке — наборе моду- лей, поставляемых всегда вместе с интерпретатором Python. Функции для ра- боты с числами находятся в модулях math для целых и действительных чисел и cmath для комплексных. Сделано это потому, что комплексные числа нужны гораздо реже целых и действительных, а Python часто используется в качестве языка сценариев и в других приложениях, где память нужно экономить. Самые употребительные функции модуля math описаны в таблице 2.3.
Загрузка модулей в Python осуществляется с помощью оператора import.
Самый простой способ его использования — загрузить всё содержимое модуля глобально:
f r
o m
math i
m p
o r
t
*
t = sin ( pi /6)

2.1. Числа. Арифметические операции с числами. Модуль math
37
Таблица 2.3. Наиболее употребительные функции и константы модуля math trunc(X)
Усечение значения Х до целого sqrt(X)
Квадратный корень из X
exp(X)
Экспонента числа Х
log(X)
, log2(X), log10(X)
Натуральный, двоичный и десятичный логариф- мы X
log(X, n)
Логарифм X по основанию n sin(X)
, cos(X), tan(X)
Синус, косинус и тангенс X, X указывается в ра- дианах asin(X)
, acos(X), atan(X)
Арксинус, арккосинус и арктангенс X
atan2(X, Y)
арктангенс отношения
X
Y
с учётом квадранта degrees(X)
Конвертирует радианы в градусы radians(X)
Конвертирует градусы в радианы sinh(X)
, cosh(X), tanh(X)
Гиперболические синус, косинус и тангенс X
asinh(X)
, acosh(X), atanh(X) Обратный гиперболический синус, косинус и тангенс X
hypot(X, Y)
Гипотенуза треугольника с катетами X и Y
factorial(X)
Факториал числа Х
gamma(X)
Гамма-функция Х
pi
Выдаётся число π
e
Выдаётся число e v = log ( e )
p r
i n
t
(t , v )
Первую строчку можно прочитать дословно: из модуля math импортируем всё
(«*» означает всё). Такая запись позволяет в теле программы просто обращаться к функциям, лежащим в math, без сложной записи: math.sin.
Но такой способ подойдёт только для первых двух-трёх занятий, на которых будет использоваться один модуль math. При подключении двух, трёх и более мо- дулей может возникнуть такая ситуация, когда в разных модулях лежат функции с одинаковыми названиями (например, open), но делают они разные действия,
да и аргументы вызываются в разном порядке. В такой ситуации, да и просто академически правильнее, писать следующим образом:
i m
p o
r t
math t = math . sin ( math . pi /6)
v = math . log ( math . e )
p r
i n
t
(t , v )

38
Глава 2. Основные типы данных
Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним с помощью ключевого слова as:
i m
p o
r t
m a t p l o t l i b . pyplot as plt plt . plot ( x )
2.2
Строки
Строки в Python — упорядоченные последовательности символов, используе- мые для хранения и представления текстовой информации, поэтому с помощью строк можно работать со всем, что может быть представлено в текстовой форме.
При этом отдельного символьного типа в Python нет, символ — это строка длины
1. Более того, символы как элементы строки тоже являются строками.
Работа со строками в Python очень удобна. Существует несколько вариантов написания строк:
>>> S1 = ’ Alice Ђ said : Ђ " Hi , Ђ Anne !" ’
>>> S2 = " Anne Ђ a n s w e r e d : Ђ ’Hi , Ђ Alice ’"
Строки в апострофах и в кавычках (иногда говорят «одинарных» и «двойных»
кавычках) — это одно и то же. Причина наличия двух вариантов в том, чтобы позволить вставлять в литералы строк символы кавычек или апострофов.
Строки можно писать в тройных кавычках или апострофах. Главное досто- инство строк в тройных кавычках в том, что их можно использовать для записи многострочных блоков текста:
>>> S = ’’’Это длинная строка’’’
>>> S
’Это\ nдлинная\ nстрока’
>>>
p r
i n
t
( S )
Это длинная строка
Внутри такой строки возможно присутствие кавычек и апострофов, главное, что- бы не было трёх кавычек подряд. Символ ’\n’ означает перевод строки на одну вниз (кнопка ) и разделяет строки текстовых файлов. Заметим, что в
Windows принято использовать 2 разделительных символа подряд: ’\r\n’, а в
Mac OS X — только ’\r’, но почти все современные редакторы (за исключе- нием «Блокнота» Windows) без труда справляются с файлами, записанными с использованием «чужих» разделителей.
Все строки в Python являются юникодом, то есть разрешено использование любых символов национальных алфавитов, которые вы сможете набрать (и даже

2.2. Строки
39
многих, для которых нет соответствующих клавиш на клавиатуре). При этом ис- пользуется внутреннее представление UTF32, то есть все символы имеют длину
4 байта, что экономит процессорное время, а запись в файл и чтение из файла происходят в кодировке UTF8, что обеспечивает совместимость со старою коди- ровкою ASCII и уменьшает потребление памяти.
Здесь уместно упомянуть о том, как в Python при написании кода программы делать комментарии. Однострочные комментарии начинаются со знака решетки
«#», многострочные — начинаются и заканчиваются тремя двойными кавычками
«
"""
».
Числа могут быть преобразованы в строки с помощью функции str(). На- пример, str(123) даст строку ’123’. Если строка является последовательностью знаков-цифр, то она может быть преобразована в целое число в помощью функ- ции int(): int(’123’) даст в результате число 123, а в вещественное с помощью функции float(): float(’12.34’) даст в результате число 12.34. Для любого символа можно узнать его номер (код символа) с помощью функции ord(), на- пример, ord(’s’) даст результат 115. И наоборот, получить символ по числовому коду можно с помощью функции chr(), например chr(100) даст результат ’d’.
2.2.1
Базовые операции над строками
Существуют несколько различных подходов к операциям над строками.
• «Арифметические операции». Для строк подобно числам определены опе- раторы сложения + и умножения ∗. В результате сложения содержимое двух строк записывается подряд в новую строку, например:
>>> S1 = ’ Py ’
>>> S2 = ’ thon ’
>>> S3 = S1 + S2
>>>
p r
i n
t
( S3 )
Python
Можно складывать несколько строк подряд.
Умножение определено для строки и целого положительного числа, в ре- зультате получается новая строка, повторяющая исходную столько раз, ка- ково было значение числа (возьмём строку S3 из прошлого примера):
>>> S3 * 4
’ P y t h o n P y t h o n P y t h o n P y t h o n ’
>>> 2 * S3
’ P y t h o n P y t h o n ’
• Функция len() вычислят длину строки, результат имеет целочисленный тип. Например, len(’Python’) выдаст 6.

40
Глава 2. Основные типы данных
• Доступ по индексу. Можно обратиться к любому элементу (символу) стро- ки по его номеру, нумерация начинается с 0 (первый элемент строки S
имеет номер 0, последний — len(S)-1. Разрешается использовать отрица- тельные индексы, в этом случае нумерация происходит с конца, что можно также интерпретировать как правило: к отрицательным индексам всегда добавляется длина строки, например последний элемент строки чаще всего обозначают как -1):
>>> S = ’ Python ’
>>> S [0]
’P ’
>>> S [ -1]
’n ’
Обращение к символу с несуществующим номером порождает ошибку:
«IndexError: string index out of range».
При использовании индексов необходимо помнить, что строки в Python от- носятся к категории неизменяемых последовательностей: нельзя поменять значение того или иного символа, а можно лишь создать новую строку.
>>> S = ’Ура’
>>> S [1] = ’х’
T r a c e b a c k ( most recent call last ):
File " < p y s h e l l #68 > " , line 1 ,
i n
< module >
S [1] = ’х’
T y p e E r r o r : ’ str ’
o b
j e
t does n
o t
s u p p o r t item a s s i g n m e n t
>>> S = S [0]+ ’x’+ S [2]
>>> S
’Уxа’
• Срезы позволяют скопировать или использовать в выражениях часть стро- ки. Оператор извлечения среза из строки выглядит так: S[n1:n2]. n1 —
это индекс начала среза, а n2 — его окончания, причем символ с номером n2
в срез уже не входит! Если указан отрицательный индекс, это значит,
что любой индекс -n аналогичен записи len(s)-n. Если отсутствует пер- вый индекс, то срез берётся от начала до второго индекса; при отсутствии второго индекса срез берётся от первого индекса до конца строки:
>>> Day = ’ morning , Ђ afternoon , Ђ evening ’
>>> Day [0:7]
’ morning ’
>>> Day [9: -9]
’ a f t e r n o o n ’
>>> Day [ -7:]
’ evening ’

2.2. Строки
41
Можно извлекать символы не подряд, а через определённое количество. В
таком случае оператор индексирования выглядит так: [n1:n2:n3]; n3 — это шаг, через который осуществляется выбор элементов:
>>> flag = ’Красный Голубой Белый’
>>> flag [::8]
’КГБ’
Обратите внимание, что в срезе строки s могут быть пропущены и первый,
и второй индексы одновременно: вместо них подставляются 0 и len(s) со- ответственно.
• Оператор in позволяет узнать, принадлежит ли подстрока в строке. Опе- ратор возвращает логическое значение: True, если элемент в составе строки встречается и False, если нет:
>>> S = ’ Python ’
>>> SubS = ’ th ’
>>> SubS
i n
S
True
• Функции min и max применимы также и к строкам: max(s) определяет и выводит (возвращает) символ с наименьшим кодом — номером в кодовой таблице. Например:
>>> S = ’ Python ’
>>>
m i
n
( S )
’P ’
Возвращает символ с наибольшим значением (кодом). Например:
>>> S = ’ Python ’
>>>
m a
x
( S )
’y ’
2.2.2
Методы строк
Кроме операторов, функций и срезов значительное количество операций над строками доступно в виде методов. Основное различие методов и функций —
синтаксическое; так, большинство методов ранее являлись функциями стандарт- ного модуля string, в котором теперь остались почти только различные кон- станты. Обратите внимание, как записываются методы объекта:
объект.метод()
,
например, S.isdigit(). Методы — это по сути функции, у которых в качестве первого аргумента выступает сам объект, метод которого вызвается. Например,
вызов метода S.isdigit() выдаст логическое значение: True, если все символы строки S и False иначе.

42
Глава 2. Основные типы данных
Таблица 2.4. Базовые операции над строками
Операция
Описание
S1 + S2
Объединение двух или более строк в новую строку.
S * n
Умножение строки на целое число n — многократное повторение строки.
len(S)
Функция, вычисляющая длину строки S.
S[n]
Доступ по индексу (номеру) к любому символу строки.
S[n1:n2:n3]
Срез — новая строка, являющаяся частью исходной и содержа- щая символы с номерами от n1 включительно до n2 невключи- тельно, если n3 присутствует (может не быть), то берутся не все символы, а с шагом n3.
S2 in S1
Логический оператор, проверяющий, является ли строка S2 ча- стью строки S1.
min(S)
Функция, вычисляющая символ строки S с наименьшим кодом.
max(S)
Функция, вычисляющая символ строки S с наибольшим кодом.
Бывают методы, как описанный выше, не требующие вовсе никаких аргумен- тов, бывают с одни аргументом, например метод S1.endswith(S2) требует 1 ар- гумент — строку — и проверяет, заканчивается ли строка S1 строкою S2. Бывают методы с двумя аргументами, например S1.replace(S2, S3), который заменяет в исходной строке S1 содержащуюся в ней подстроку S2 новою подстрокою S3 и выдаёт новую строку, при этом S1 остаётся неизменною. Более полную инфор- мацию о строковых методах можно получить, введя в интерактивном режиме команду help(str).
2.3
Условия и логические операции
2.3.1
Логический (булевский) тип. Операторы сравнения.
Логические операторы
Логический (булевский) тип может принимать одно из двух значений True
(истина) или False (ложь). В языке Python булевский тип данных обозначается как bool, для приведения других типов данных к булевскому существует функ- ция bool(), работающая по следующим соглашениям:
• строки: пустая строка — ложь, непустая строка — истина.
• числа: нулевое число — ложь, ненулевое число (в том числе и меньшее единицы) — истина.

2.3. Условия и логические операции
43
• функции — всегда истина.
Для работы с алгеброй логики в Python кроме логического типа данных предусмотрены операторы сравнения:
• «>» больше,
• «<» меньше,
• «==» равно (одиночное «=» зарезервировано за оператором присваива- ния),
• «! =» не равно,
• «>=» больше или равно,
• «<=» меньше или равно.
Вот простенькая программа, вычисляющая различные логические выражения:
x = 12 - 5
h1 = x == 4
h2 = x == 7
h3 = x != 7
h4 = x != 4
h5 = x > 5
h6 = x < 5
p r
i n
t
( h1 , h2 , h3 , h4 , h5 , h6 )
Её вывод:
False True False True True False
Как видим, сравнивать особенно по равенству/неравенству можно всё, что угод- но, включая типы данных. Обратите внимание, что оператор присваивания имеет самый низкий приоритет, поэтому расстановка скобок вокруг логических опера- торов и операторов сравнения не требуется.
Из логических переменных и выражений можно строить более сложные (со- ставные) логические выражения с помощью логических операторов: not (отри- цание, логическое НЕ), or (логическое ИЛИ) и and (логическое И):
• x and y — логическое «И» (умножение). Принимает значение True (исти- на), только когда x = True и y = True. Принимает значение False (ложь),
если хотя бы одна из переменных равна False, или обе переменные False.
• x or y — логическое «ИЛИ» (сложение). Принимает значение True (исти- на), если хотя бы одна из переменных равна True, или обе переменные True.
Принимает значение False (ложь), если x == y == False.

44
Глава 2. Основные типы данных
A
not A
True
False
False
True
A
B
A and B
A or B
True
True
True
True
True
False
False
True
False
True
False
True
False
False
False
False
Таблица 2.5. Таблицы истинности логических функций для логического типа.
• not x — логическое «НЕ» (отрицание). Принимает значение True (истина),
если x == False. Принимает значение False (ложь), если x == True.
Правила работы логических операторов можно также задать с помощью таблиц истинности, в которых указывается истинность составного выражения, в зави- симости от значений исходных простых выражений.
Следует отметить, что логические операции в Python определены для объ- ектов любых типов, но результаты таких операций для операторов and и or не всегда легко понятны (оператор not работает достаточно просто, он приводит ар- гумент к логическому значению по описанным в начале этого раздела правилам и выдаёт всегда только логическое значение). Вот пример:
>>> [1 , 2]
a n
d
[1]
a n
d
13 13
>>> [1 , 2]
a n
d
[1]
o r
13
[1]
Здесь все три объекта: [1, 2], [1] и 13 будут интерпретироваться как истина,
поскольку списки не пустые, а число не равно нулю. Но в первом случае в резуль- тате вычисления выражения получится число, а во втором — один из списков.
Поэтому мы рекомендуем программистам не использовать логические операторы в выражениях с нелогическими объектами, либо преобразовывать эти объекты к логическому типу напрямую с помощью функции bool():
>>>
b o
o l
([1 , 2])
a n
d b
o o
l
([1])
o r
b o
o l
(13)
True
>>>
b o
o l
([1 , 2])
a n
d b
o o
l
([1])
a n
d b
o o
l
(13)
True
Логические операторы and и or в Python используются существенно реже,
чем во многих других популярных языках программирования, например Java,
C/C++ или Pascal/Delphi, потому что в Python можно делать любые двойное,
тройные и т. д. сравнения, например, a < x < b эквивалентно (x > a) and (x <
b)
Рассмотрим пример, в котором используются логические операторы и функ- ции.

2.3. Условия и логические операции
45
Пример задачи 1 Трое друзей, болельщиков автогонок «Формула–1»,
спорили о результатах предстоящего этапа гонок.
— Вот увидишь, Шумахер не придет первым, — сказал Джон. — Пер- вым будет Хилл.
— Да нет же, победителем будет, как всегда, Шумахер, — воскликнул
Ник. — А об Алези и говорить нечего, ему не быть первым.
Питер, к которому обратился Ник, возмутился: — Хиллу не видать первого места, а вот Алези пилотирует самую мощную машину.
По завершении этапа гонок оказалось, что предположения двух друзей подтвердились, а предположения одного из трёх неверны. Кто выиграл этап гонки?
Решение задачи 1 Введем обозначения для логических высказываний: S — по- бедит Шумахер; H — победит Хилл; A — победит Алези.
Реплика Ника «Алези пилотирует самую мощную машину» не содержит ни- какого утверждения о месте, которое займёт этот гонщик, поэтому в дальнейших рассуждениях не учитывается.
Зафиксируем высказывания каждого из друзей:
• Джон: v1 = not S and H;
• Ник: v2 = S and not A;
• Питер: v3 = not H.
Учитывая то, что предположения двух друзей подтвердились, а предположения одного из трёх неверны, запишем логическую функцию:
f = v1
a n
d v2
a n
d n
o t
v3
o r
v1
a n
d n
o t
v2
a n
d v3 \
o r
n o
t v1
a n
d v2
a n
d v3
В алгебре логики существует возможность доказательства утверждения методом перебора. Утверждение истинно, если при подстановке любых значений перемен- ных оно превращается в верное тождество. Этот метод перебора не слишком тру- доемок, поскольку переменные могут принимать только значения False и True.
Логическая функция от n аргументов может быть задана таблицей, в которой перечислены все возможные наборы из False и True длины n и для каждого из них рассчитано значение функции. Пусть эту таблицу нам автоматически составит программа на Python:
f o
r
S
i n
( False , True ):
f o
r
H
i n
( False , True ):
f o
r
A
i n
( False , True ):
v1 =
n o
t
S
a n
d
H
v2 = S
a n
d n
o t
A
v3 =
n o
t
H

46
Глава 2. Основные типы данных f = v1
a n
d v2
a n
d n
o t
v3
o r
\
v1
a n
d n
o t
v2
a n
d v3
o r
\
n o
t v1
a n
d v2
a n
d v3
p r
i n
t
(S , H , A , f )
Здесь использован оператор цикла for, подробнее изложенный в следующей гла- ве. Оператор \ позволяет перенести часть кода на следующую строчку, число начальных пробелов в которой неважно.
Вывод программы:
False False False False
False False True False
False True False False
False True True False
True False False True
True False True False
True True False False
True True True False
Из таблицы видно, что заданное утверждение истинно (True в четвёртом столбце) только при S==True, H==False, A==False. Значит ответ на задачу: побе- дил Шумахер.
Обратите внимание на отступы, Python к ним чрезвычайно чувствителен. Де- ло в том, что в Python фактически нет операторных скобок типа begin/end (как в Pascal) или «{}» (как в Cи-подобных языках), их роль выполняют отступы
(роль открывающейся скобки в некотором смысле выполняет «:»). Если после- дующая строчка сдвинута по отношению к предыдущей вправо — значит, то, что на ней написано, представляет собою блок (часть кода, которая сгруппирована и воспринимается как единое целое). Принято и очень рекомендуется делать по
4 пробела на каждый уровень вложенности. При работе в IDLE и Geany редак- тор сам поставит нужный отступ, если вы не забудете «:» в конце предыдущей строки, клавиша позволит вернуться на один уровень назад.
Форматирование — очень важный момент при программировании на Python.
Если вы поставите хотя бы один лишний пробел в начале строки, программа во- обще не запустится, выдав Indentation Error — ошибку расстановки отступов,
указав на первую строку, где с точки зрения интерпретатора возникла ошибка.
2.3.2
Условный оператор if
Поведение реальных программ должно зависеть от входных данных. Напри- мер, в рассмотренной ранее задаче о преобразовании мужской формы фамилии в женскую добавление символа «а» вовсе не единственный вариант: если мужская форма заканчивается на «ой», «ый» или «ий», нужно это окончание отбросить и добавить соответственно «ая» или «яя». Чтобы программа могла осуществить такой выбор, она должна уметь проверять условия, для чего во всех языках программирования есть условный оператор.

2.3. Условия и логические операции
47
В Python простейшая форма условного оператора имеет вид
2
:
i f
<логическое выражение >:
<действия, выполняемые, когда логическое выражение принимает значение True >
В такой форме действия после двоеточия выполняются, если логическое вы- ражение истинно. Если же оно ложно, программа ничего не делает и переходит к оператору, следующему за if. Когда нужно выполнить различные действия,
если условие истинно и если оно ложно, используется следующая более полная форма:
i f
<логическое выражение >:
<действия, выполняемые, когда логическое выражение принимает значение True >
e l
s e
:
<действия, выполняемые, когда логическое выражение принимает значение False >
Наконец, если нужно последовательно проверить несколько условий, исполь- зуется форма с дополнительным оператором elif (сокращение от else if):
i f
<логическое выражение >:
<действия, выполняемые, если логическое выражение принимает значение True >
e l
i f
<второе логическое выражение >:
<действия, выполняемые, если второе логическое выражение принимает значение True >
e l
i f
<третье логическое выражение >:
<действия, выполняемые, если третье логическое выражение принимает значение True >
e l
s e
:
<действия, выполняемые, если ни одно из логических выражений не принимает значение True >
Дополнительных условий и связанных с ними блоков elif может быть сколь- ко угодно, но важно отметить, что в такой сложной конструкции будет выполнен всегда только один блок кода. Другими словами, как только некоторое условие оказалось истинным, соответствующий блок кода выполняется, и дальнейшие условия не проверяются.
Обратите внимание, что после двоеточия в конструкциях типа if, else, elif всегда идёт блок, выделенный отступом вправо. Большинство редакторов кода,
в том числе и IDLE, делают этот отступ автоматически. То, что выделено отсту- пами, и есть тело оператора, а то, что до двоеточия, называется заголовком.
2
Вообще говоря, выражение может быть вовсе не логическим, в этом случае оно будет приведено к логическому типу по ранее приведённым правилам.

48
Глава 2. Основные типы данных
Приведём простой пример. Следующая простая программа проверяет, делит- ся ли первое введённое число на второе нацело:
a =
i n
t
(
i n
p u
t
( ’Введите первое число: ’ ))
b =
i n
t
(
i n
p u
t
( ’Введите второе число: ’ ))
i f
a % b == 0:
p r
i n
t
( " Yes " )
e l
s e
:
p r
i n
t
( " No " )
2.4
Списки
Любой язык программирования обязан поддерживать составные типы дан- ных, где одна переменная может содержать как контейнер несколько — в лучшем случае произвольно много — единиц информации. Для этой цели в Python суще- ствуют несколько типов данных, самым базовым из которых является список.
Списки в языке программирования Python, как и строки, являются упорядо- ченными последовательностями значений. Однако, в отличие от строк, списки состоят не из символов, а из различных объектов (значений, данных), и заклю- чаются не в кавычки, а в квадратные скобки [ ]. Объекты отделяются друг от друга с помощью запятой.
Списки могут состоять из различных объектов: чисел, строк и даже других списков. В последнем случае, списки называют вложенными. Вот некоторые при- меры списков:
[159 , 152 , 140 , 128 , 113]
#
список целых чисел
[15.9 , 15.2 , 14.0 , 128. , 11.3]
#
список вещественных чисел
[ ’Даша’ , ’Катя’ , ’Ксюша’]
#
список строк
[ ’Саратов’ , ’Астраханская’ , 104 , 18]
#
смешанный список
[[1 , 0 , 0] , [0 , 1 , 0] , [0 , 0 , 1]]
#
список списков
Как и над строками, над списками можно выполнять операции соединения и повторения:
>>> [6 , ’октябрь’ , 2015]+[16 , ’декабрь’ , 2015]
[6 , ’октябрь’ , 2015 , 16 , ’декабрь’ , 2015]
>>> [2 , 3 , 4]*2
[2 , 3 , 4 , 2 , 3 , 4]
По аналогии с символами (элементами) строки можно получать доступ к эле- ментам списка по их индексам, складывать их, извлекать срезы, измерять длину списка, узнавать тип данных:
>>> list1 = [ ’P ’ , ’y ’ , ’ th ’ , ’o ’ , ’n ’ , 3.4]
>>>
l e
n
( list1 )
6

2.4. Списки
49
>>> list1 [0] + list1 [1]
’ Py ’
>>> list1 [0]
’P ’
>>> list1 [0:5]
[ ’P ’ , ’y ’ , ’ th ’ , ’o ’ , ’n ’]
>>> list1 [5:]
[3.4]
>>>
t y
p e
( list1 )
<
l a
s s
’ list ’ >
Обратите внимание, что нумерация элементов всегда начинается с нуля, поэтому нулевой элемент это ’P’.
В отличие от строк, списки — это изменяемые последовательности. Если пред- ставить строку как объект в памяти, то когда над ней выполняются операции конкатенации и повторения, то эта строка не меняется, а в результате операции создаётся другая строка в другом месте памяти. В строку нельзя добавить но- вый символ или удалить существующий, не создав при этом новой строки. Со списком дело обстоит иначе. При выполнении операций новые списки могут не создаваться, а будет изменяться непосредственно оригинал. Из списков можно удалять элементы, добавлять новые. При этом следует помнить, многое зависит от того, как вы распоряжаетесь переменными.
Символ в строке изменить нельзя, элемент списка — можно:
>>> mystr = ’ Python ’
>>> mylist = [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> mystr [1] = ’i ’
T r a c e b a c k ( most recent call last ):
File " < pyshell #2 > " , line 1 ,
i n
< module >
mystr [1] = ’i ’
T y p e E r r o r : ’ str ’
o b
j e
t does n
o t
support item a s s i g n m e n t
>>> mylist [1] = ’i ’
>>> mylist
[ ’P ’ , ’i ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
В списке можно заменить целый срез:
>>> mylist [:3] = [ ’Y ’ , ’e ’ , ’s ’]
>>> mylist
[ ’Y ’ , ’e ’ , ’s ’ , ’h ’ , ’o ’ , ’n ’]
Для списка можно создавать его копию:
>>> list1 = [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> list2 = list1 . copy () #Создание копии списка
>>> list2 [1] = ’i ’
>>> list2 , list1
([ ’P ’ , ’i ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’] , [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’ ])

50
Глава 2. Основные типы данных
Список list2 изменился, а список list1 — нет.
Для списка можно создать вторую ссылку на список. Внимание! При созда- нии второй ссылки данные не копируются, просто эти данные теперь имеют два имени, поэтому изменение list1 будет приводить к изменению list2:
>>> list2 = list1 #Создание второй ссылки, а не копии
>>> list2 [1] = ’i ’
>>> list2 , list1
([ ’P ’ , ’i ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’] , [ ’P ’ , ’i ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’ ])
Изменились оба списка. Для создания копии предусмотрен более простой син- таксис, нежели использование стандартного метода copy: достаточно взять срез списка от начала и до конца: list3 = list1[:] эквивалентно тому, что мы на- писали бы list3 = list1.copy().
Таблица 2.6. Методы списка
Метод
Описание
L.append(x)
Добавление элемента со значением x в конец списка L:
>>> L = [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> L . append ( ’3 ’)
>>> L
[ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’ , ’3 ’]
L.extend(T)
Добавление списка или кортежа T в конец списка L. Похоже на объединение списков, но создание нового списка не происходит:
>>> L = [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> T = [ ’3 ’ , ’. ’ , ’4 ’]
>>> L . extend ( T )
>>> L
[ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’ , ’3 ’ , ’. ’ , ’4 ’]
>>> L = [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> L . append ( T )
>>> L
[ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’ , [ ’3 ’ , ’. ’ , ’4 ’ ]]
L.insert(i,x)
Вставка элемента со значением х на позицию i в списке L:
>>> L = [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> L . insert (3 , ’! ’)
>>> L
[ ’P ’ , ’y ’ , ’t ’ , ’! ’ , ’h ’ , ’o ’ , ’n ’]

2.4. Списки
51
L.pop(i)
Извлечение элемента с номером i из списка L, элемент удаля- ется и выдаётся в качестве результата:
>>> L = [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> x = L . pop (0)
>>> L
[ ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> x
’P ’
Если использовать L.pop() без аргумента, то будет извлекать- ся последний элемент.
L.remove(x)
Удаление элемента со значением x из списка L:
>>> L = [ ’P ’ , ’y ’ , ’t ’ , ’! ’ , ’h ’ , ’o ’ , ’n ’]
>>> L . remove ( ’! ’)
>>> L
[ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
Если в списке содержится несколько одинаковых элементов,
удаляется тот, который имеет наименьший номер.
L.count(x)
Определение количества элементов, равных x, в списке L:
>>> L = [8 , 1 , 5 , -7 , 4 , 9 , -2 , 6 , 2 , 5]
>>> L . count (5)
2
L.index(x)
Определение первой слева позиции элемента со значением x в списке L:
>>> L = [8 , 1 , 5 , -7 , 4 , 9 , -2 , 6 , 2 , 5]
>>> L . index (5)
2
L.reverse()
Переворачивание списка наоборот:
>>> L = [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9]
>>> L . reverse ()
>>> L
[9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0]

52
Глава 2. Основные типы данных
L.sort()
Сортировка списка по возрастанию (в алфавитном порядке):
>>> L = [10 , 5 , 2 , 8 , 1 , 12]
>>> L . sort ()
>>> L
[1 , 2 , 5 , 8 , 10 , 12]
К спискам применимы некоторые стандартные функции, например, знако- мая нам len, к которой обращаться нужно следующим образом: len(mylist).
Функция sum подсчитывает сумму элементов списка, если все они числового ти- па. Функция range позволяет сформировать диапазон значений целых чисел.
В самом общем случае range принимает 3 аргумента: начало диапазона, конец
(всегда берётся не включительно) и шаг. Обратите внимание, что в Python 3.x эта функция не выдаёт список, а производит специальный объект-диапазон. По- этому, чтобы получить список чисел, нужно обязательно явно преобразовать ре- зультат с помощью функции list. Есть ещё функция sorted(), которая возвра- щает новый список, отсортированный по убыванию. Функции min и max находят максимальный и минимальный элементы списка. Вот небольшая программа с использованием этих функций:
>>> A =
l i
s t
(
r a
n g
e
(0 , 10 , 1))
>>> A
[0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9]
>>>
s u
m
( A )
45
>>>
m i
n
( A )
0
>>>
m a
x
( A )
9
В данном примере объект A формируется с помощью итератора range, а потом явно преобразуется к типу list.
К спискам, как и к строкам, применим оператор in, позволяющий узнать,
принадлежит ли элемент списку. Напомним, что оператор возвращает логиче- ское значение: True, если элемент в списке содержится и False, если нет. Вот программа, использующая этот оператор:
>>> mylist1 = [ ’P ’ , ’y ’ , ’t ’ , ’h ’ , ’o ’ , ’n ’]
>>> mylist2 = [6 , 10 , 2015]
>>> ’y ’
i n
mylist1
True
>>> 30
i n
mylist2
False
>>> mylist2 . append ([ ’Программирование’ , 11.30])

2.5. Кортежи
53
>>> mylist2
[6 , 10 , 2015 , [ ’Программирование’ , 11.3]]
>>> mylist2 [ -1]
[ ’Программирование’ , 11.3]
Во второй список специально был добавлен ещё один список, чтобы показать,
что списки могут быть вложенными. Также в последней приведённой программе была использована возможность индексировать списки с конца: минус первый элемент списка — это его последний элемент. Таким образом, mylist2[-1] — это обращение к последнему (первому с конца) элементу списка, являющемуся тоже списком.
2.5
Кортежи
Список так же может быть неизменяемым, как и строка, в этом случае он называется кортеж (tuple). Кортеж использует меньше памяти, чем список. При задании кортежа вместо квадратных скобок используются круглые (хотя можно и совсем без скобок). Кортеж не допускает изменений, в него нельзя добавить новый элемент, удалить или заменить существующие элементы, но он может содержать изменяемые объекты, например, списки:
>>> ll = []
>>> A = (1 , 2 , 3 , ll )
>>> A
(1 , 2 , 3 , [])
>>> A [1] = 4
T r a c e b a c k ( most recent call last ):
File " < pyshell #22 > " , line 1 ,
i n
< module >
A [1] = 4
T y p e E r r o r : ’ tuple ’
o b
j e
t does n
o t
support item a s s i g n m e n t
>>> A [3]. append (3)
>>>
p r
i n
t
(A , ll )
(1 , 2 , 3 , [3]) [3]
Видно, что прямая замена элемента кортежа недопустима — вызывает TypeError,
так как тип tuple не поддерживает изменеине элементов, но если использовать втроенный метод append у списка, являющегося элементом кортежа, этот список можно изменить.
Функция tuple() берет в качестве аргумента строку или список и превращает его в кортеж, а функция list() переводит кортеж в список:
>>> B =
l i
s t
( A )
>>> B
[1 , 2 , 3]
>>> C =
t u
p l
e
( B )
>>> C

54
Глава 2. Основные типы данных
(1 , 2 , 3)
Основное различие между кортежами и списками состоит в том, что кортежи не могут быть изменены. На практике это означает, что у них нет методов, кото- рые бы позволили их изменить: append(), extend(), insert(), remove(), pop().
Но можно взять срез от кортежа, так как при этом создастся новый кортеж.
Кортежи в некоторых случаях быстрее, чем списки. Но такие оптимизации в каждом конкретном случае требуют дополнительных исследований. Кортежи делают код безопаснее в том случае, если у вас есть «защищенные от записи»
данные, которые не должны изменяться. Некоторые кортежи могут использо- ваться в качестве элементов множества и ключей словаря (конкретно, кортежи,
содержащие неизменяемые значения, например, строки, числа и другие корте- жи). Словари будут рассмотрены в следующем разделе. Списки никогда не мо- гут использоваться в качестве ключей словаря, потому что списки — изменяемые объекты.
В Python можно использовать кортежи, чтобы присваивать значение несколь- ким переменным сразу:
>>> v = ( ’f ’ , 5 , True )
>>> (x , y , z ) = v
>>> x
’f ’
>>> y
5
>>> z
True
>>>
Это не единственный способ использования. Предположим, что вы хоти- те присвоить имена диапазону значений. Вы можете использовать встроенную функцию range() для быстрого присвоения сразу нескольких последовательных значений.
>>> ( MONDAY , TUESDAY , WEDNESDAY , THURSDAY ,
FRIDAY , SATURDAY , SUNDAY ) =
r a
n g
e
(1 , 8)
>>> MONDAY
1
>>> SUNDAY
7
>>>
Заметим, что при вводе длинных списков, кортежей и словарей как в интерак- тивном, так и в скриптовом режиме можно перейти на следующую строчку после любой запятой, разделяющей элементы. Это позволяет в большинстве случаев избежать использования символа переноса строки «\».

2.6. Словари
55 2.6
Словари
Одним из сложных типов данных наряду со строками и списками в язы- ке программирования Python являются словари. Словарь — это изменяемый
(как список) неупорядоченный (в отличие от строк и списков) набор пар
’ключ:значение’
. Словари оказываются очень удобными объектами для хра- нения данных и, по сути, являются своеобразной заменой базе данных.
Чтобы представление о словаре стало более понятным, можно провести ана- логию с обычным словарём, например, англо-русским. На каждое английское слово в таком словаре есть русское слово перевод: cat — кошка, dog — собака,
bird — птица и т.д. Если англо-русский словарь описывать с помощью Python,
то английские слова будут ключами, а русские — их значениями:
>>> animal = { ’ cat ’: ’кошка’ , ’ dog ’: ’пёс’ , ’ bird ’: ’птица’ ,
’ mouse ’: ’мышь’}
>>> animal
{ ’ mouse ’: ’мышь’ , ’ cat ’: ’кошка’ , ’ dog ’: ’пёс’ , ’ bird ’: ’птица’}
>>>
t y
p e
( animal )
<
l a
s s
’ dict ’ >
Обратите внимание на фигурные скобки, именно с их помощью определяется словарь. Такой тип данных в Python называется dict. Если создать словарь в интерпретаторе Python (как и было сделано), то после нажатия можно наблюдать, что последовательность вывода пар
’ключ:значение’
не совпадёт с тем, как было введено. Дело в том, что в словаре абсолютно не важен порядок пар, и интерпретатор выводит их в случайном порядке. Тогда как же получить доступ к определённому элементу, если индексация невозможна в принципе? В
словаре доступ к значениям осуществляется по ключам, которые заключаются в квадратные скобки (по аналогии с индексами строк и списков):
>>> animal ={ ’ cat ’: ’кошка’ , ’ dog ’: ’пёс’ , ’ bird ’: ’птица’ , ’ mouse ’: ’мышь’}
>>> animal [ ’ cat ’]
’кошка’
Словари, как и списки, являются изменяемым типом данных: можно изме- нять, добавлять и удалять элементы — пары ’ключ:значение’. Изначально сло- варь можно создать пустым, например, dic = {} и лишь потом заполнить его элементами.
Добавление и изменение имеет одинаковый синтаксис: словарь[ключ] =
значение
. Ключ может быть, как уже существующим (тогда происходит измене- ние значения), так и новым (происходит добавление элемента словаря). Удаление элемента словаря осуществляется с помощью функции del(dic[key]) или мето- да pop(key):
>>> dic = { ’ cat ’: ’кошка’ , ’ dog ’: ’пёс’ , ’ bird ’: ’птица’ , ’ mouse ’: ’мышь’}
>>> dic [ ’ cat ’] = ’кот’
>>> dic
{ ’ mouse ’: ’мышь’ , ’ cat ’: ’кот’ , ’ dog ’: ’пёс’ , ’ bird ’: ’птица’}

56
Глава 2. Основные типы данных
>>> dic [ ’ fox ’] = ’лиса’
>>> dic
{ ’ fox ’: ’лиса’ , ’ mouse ’: ’мышь’ , ’ cat ’: ’кот’ , ’ dog ’: ’пёс’ ,
’ bird ’: ’птица’}
>>>
d e
l
( dic [ ’ mouse ’ ])
>>> dic
{ ’ fox ’: ’лиса’ , ’ cat ’: ’кот’ , ’ dog ’: ’пёс’ , ’ bird ’: ’птица’}
>>> dic . pop ( ’ fox ’)
’лиса’
>>> dic
{ ’ bird ’: ’птица’ , ’ cat ’: ’кот’ , ’ dog ’: ’пёс’}
Тип данных ключей и значений словарей не обязательно должен быть стро- ковым:
>>> D i c P r o g = {1: ’ Pascal ’ , 2: ’ Python ’ , 3: ’C ’ , 4: ’ Java ’}
Словари — это широко используемый тип данных языка Python. Для ра- боты с ними существует ряд встроенных методов и функций. Метод keys() для словаря возвращает последовательность всех используемых ключей в произволь- ном порядке. Для определения наличия определенного ключа раньше был метод has_key()
, но в версии 3.0 вместо него есть знакомый нам оператор in:
>>> D i c P r o g . keys ()
d i c t _ k e y s ([1 , 2 , 3 , 4])
>>> 1
i n
D i c P r o g
True
>>> ’ Pascal ’
i n
D i c P r o g
False
2.7
Примеры решения задач
Пример задачи 2 (Арифметические операции) Напишите программу
(необходимые данные вводятся с клавиатуры) для вычисления всех трёх сторон прямоугольного треугольника, если даны один из острых углов и площадь.
Решение задачи 2 Обозначим катеты прямоугольного треугольника a и b, а гипотенузу — c. Площадь треугольника обозначим S, один из острых углов —
α. Воспользуемся формулой площади прямоугольного треугольника S =
ab
2
и формулой тангенса tg α =
a c
. Отсюда можно получить выражение для одного из катетов: a =
q
2S
tg α
. Теперь легко вычислить оставшийся катет и гипотенузу:
b =
2S
a и c =

a
2
+ b
2
f r
o m
math i
m p
o r
t
*
S =
i n
t
(
i n
p u
t
( ’Площадь трегольника = ’ ))
alpha =
i n
t
(
i n
p u
t
( ’Острый угол (в градусах) = ’ ))

2.7. Примеры решения задач
57
a = sqrt (2* S / tan ( radians ( alpha )))
b = 2* S / a c = ( a **2+ b * * 2 ) * * ( 1 / 2 )
p r
i n
t
(a , b , c )
Вывод программы:
Площадь трегольника = 8
Острый угол (в градусах) = 45 4.0 4.0 5 . 6 5 6 8 5 4 2 4 9 4 9 2 3 8 1
Пример задачи 3 (Строки) Свяжите любую переменную со строкой:
«У Лукоморья дуб зелёный. . . ». Выведите все символы этой строки в обратном порядке.
Решение задачи 3 Листинг программы:
S = ’У Лукоморья дуб зелёный...’
p r
i n
t
( S [ -1:: -1])
Вывод программы:
...йынёлез буд яьромокуЛ У
Пример задачи 4 (Простое условие) Ответить на вопрос, истинно ли условие: x
3
+ y
3 6
9. Значения переменных x и y вводятся с клавиатуры.
Решение задачи 4 Листинг программы:
x =
f l
o a
t
(
i n
p u
t
( ’x Ђ = Ђ ’ ))
y =
f l
o a
t
(
i n
p u
t
( ’y Ђ = Ђ ’ ))
p r
i n
t
( x **3 + y **3 <= 9)
Вывод программы:
x = 1
y = 3
False
Пример задачи 5 (Сложное условие) Записать условие (составить ло- гическое выражение), которое является истинным, когда число X чётное и меньше 100.
Решение задачи 5 Листинг программы:
X =
f l
o a
t
(
i n
p u
t
( ’x Ђ = Ђ ’ ))
p r
i n
t
(( X % 2 == 0)
a n
d
( X < 100))

58
Глава 2. Основные типы данных
Вывод программы:
>>>
x = 50
True
>>> = = = = = = = = = = = = = = = = = RESTART = = = = = = = = = = = = = = = = = = =
>>>
x = 3
False
>>> = = = = = = = = = = = = = = = = = RESTART = = = = = = = = = = = = = = = = = = =
>>>
x = 102
False
Пример задачи 6 (Условный оператор) Приведём пример множествен- ного ветвления с использованием elif, где разберём перебор вариантов.
Задача такая: пользователь вводит количество денег в рублях, в мага- зине можно купить хлеб за 20 руб. и сыр за 100 руб. Если хватает на то и другое, покупаем всё, если только на сыр или только на хлеб, берём что-то одно, если не хватает ни на что — уходим.
Решение задачи 6 Листинг программы:
a =
i n
t
(
i n
p u
t
( " Input Ђ amount Ђ of Ђ money : Ђ " ))
i f
a >= 120:
p r
i n
t
( " Bread Ђ and Ђ cheese " )
e l
i f
a >= 100:
p r
i n
t
( " Cheese Ђ only " )
e l
i f
a >= 20:
p r
i n
t
( " Bread Ђ only " )
e l
s e
:
p r
i n
t
( " Nothing Ђ :( " )
Как видим, проверять все условия в каждом случае, например, для хлеба усло- вие, что денег меньше 100, нет смысла: если первое условие выполняется, то проверка прочих никогда не происходит, иначе управление передаётся на следу- ющий elif и так далее, если не выполнилось ни одно из условий, выполняются операторы в блоке else, если таковой присутствует.
Пример задачи 7 (Списки) Создайте список в диапазоне (0, 100) с ша- гом 1. Свяжите его с переменной. Извлеките из него срез с 20 по 30
элемент включительно.
Решение задачи 7 Листинг программы:

2.8. Задания
59
A =
l i
s t
((0 , 100 , 1))
p r
i n
t
( A [ 2 0 : 3 1 ] )
Вывод программы:
[20 , 21 , 22 , 23 , 24 , 25 , 26 , 27 , 28 , 29 , 30]
Пример задачи 8 (Кортежи) Создайте кортеж в диапазоне (0, 20) с шагом 1. Свяжите его с переменной. Выведите эту переменную на экран.
Решение задачи 8 Листинг программы:
A =
t u
p l
e
(
r a
n g
e
(0 , 20 , 1))
p r
i n
t
( A )
Вывод программы:
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
Пример задачи 9 (Словари) Создайте словарь, который будет содер- жать значения параметров функции y = A cos(ωt + f ). А затем по ключу запросите значения каждого из них.
Решение задачи 9 Листинг программы p
r i
n t
( ’y Ђ = Ђ A Ђ cos ( wt + f ) ’)
P a r a m e t e r s = { ’A ’ :10 , ’w ’ :1 , ’f ’ :0}
Key =
s t
r
(
i n
p u
t
( ’Какой параметр? ’ ))
p r
i n
t
( P a r a m e t e r s [ Key ])
Вывод программы:
y = A cos ( wt + f )
Какой параметр? A
10 2.8
Задания
Задание 2 Выполнять три задания в зависимости от номера в списке.
Чтобы узнать номера ваших заданий, необходимо решить задачку: тре- буется сделать задания № m, № m + 5, № m + 10, где m = (n − 1)%5 + 1, n
— порядковый номер студента в списке группы по алфавиту.
Используя арифметические операторы (+, −, ∗, /, //, %), напишите програм- му (необходимая информация запрашивается у пользователя с клавиатуры).
1. Составьте арифметическое выражение и вычислите n-е чётное число (пер- вым считается 2, вторым 4 и т.д.).

60
Глава 2. Основные типы данных
2. Составьте арифметическое выражение и вычислите n-е нечётное число
(первое — 1, второе — 3 и т.д.).

1   2   3   4   5   6   7   8   9   ...   14


написать администратору сайта