Python Course
Python Course
2012-2016
Оглавление
2 Основные операторы 7
2.1 Îïåðàòîð ïðèñâàèâàíèÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Ôóíêöèÿ print . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Ôîðìàòèðîâàííûé âûâîä . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4 Ôóíêöèÿ ââîäà: input() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5 Óñëîâíûé îïåðàòîð . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6 Îïåðàòîð öèêëà while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.7 Îïåðàòîðû break è continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.8 Êîììåíòàðèè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5 Кортежи 26
5.1 Ñâîéñòâà êîðòåæåé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.2 Çíà÷åíèÿ êîðòåæåé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.3 Îïåðàöèè ñ êîðòåæàìè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.4 Ïðèìåíåíèå êîðòåæåé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
6 Словари 28
6.1 Ñîçäàíèå ñëîâàðÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.2 Ïîëó÷åíèå çíà÷åíèé ñëîâàðÿ, èçìåíåíèå ñëîâàðÿ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.3 Ñëèÿíèå ñëîâàðåé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7 Множества 31
7.1 Ñîçäàíèå ìíîæåñòâà è ëîãè÷åñêèå îïåðàöèè ñ íèìè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.1.1 Îïåðàöèè íàä ìíîæåñòâàìè, íå ïðèâîäÿùèå ê èõ èçìåíåíèþ . . . . . . . . . . . . . . . . . . . . . . 32
7.1.2 Èçìåíåíèå ìíîæåñòâ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
9 Работа с файлами 41
9.1 Ðåæèìû ðàáîòû ñ ôàéëàìè. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
9.2 ×òåíèå èç ôàéëà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
9.3 Çàïèñü â ôàéë . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
10 Динамическая типизация 43
10.1 Ïåðåìåííûå, îáúåêòû è ññûëêè . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.2 Àâòîìàòè÷åñêàÿ ñáîðêà ìóñîðà . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
10.3 Ðàçäåëÿåìûå ññûëêè, èçìåíÿåìûå è íåèçìåíÿåìûå òèïû . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Ýòîò òåêñò çàäóìûâàëñÿ êàê êðàòêèé ñïðàâî÷íèê ïî ÿçûêó Python, ñíàáæ¼ííûé áîëüøèì êîëè÷åñòâîì ïðèìåðîâ.
Íåñìîòðÿ íà ÿâíîå óêàçàíèå òîãî, ÷òî èíòåðïðåòàòîð Python âûäà¼ò â êà÷åñòâå îòâåòà, èìååò ñìûñë âûïîëíÿòü óêà-
çàííûå ôðàãìåíòû êîäà â èíòåðïðåòàòîðå. Âî-ïåðâûõ, âû ïîïðîáóåòå ïðîâåðèòü ñîáñòâåííûå ãèïîòåçû, êîòîðûå íå
íàøëè îòðàæåíèÿ â òåêñòå, âî-âòîðûõ îòûùåòå îïå÷àòêè.
Ýòîò ñïðàâî÷íèê íå ïðåäíàçíà÷åí äëÿ çíàêîìñòâà ñ ïðîãðàììèðîâàíèåì "ñ íóëÿ". Ñêîðåå ìîæåò ïîìî÷ü çàïèñàòü
íà ÿçûêå Python óæå ïîíÿòíûå êîíñòðóêöèè è ïîçíàêîìèòü ñ îñíîâíûìè îòëè÷èÿìè îò Ïàñêàëÿ èëè Ñè.
Îáî âñåõ îïå÷àòêàõ, îøèáêàõ, íåóäà÷íûõ ïðèìåðàõ è íåëîãè÷íîé ïîñëåäîâàòåëüíîñòè èçëîæåíèÿ ñîîáùàéòå ïî
àäðåñó: [email protected]
∙ Âûñîêîóðîâíåâûå è íèçêîóðîâíåâûå
Òåêñò ïðîãðàììû íà ÿçûêå Ïèòîí íå ïîõîæ íà ìàøèííûé êîä, ïðîãðàììà íå îïåðèðóåò íåïîñðåäñòâåííî ñîäåð-
æèìûì ðåãèñòðîâ ïðîöåññîðà. Åãî ñëóæåáíûå ñëîâà ýòî ñëîâà àíãëèéñêîãî ÿçûêà; ÿçûê, ñ ïîìîùüþ êîòîðîãî
çàïèñûâàþòñÿ âûðàæåíèÿ ïî÷òè ïîëíîñòüþ ñîâïàäàåò ñ ïðèíÿòûì â ìàòåìàòèêå àëãåáðàè÷åñêèì ÿçûêîì.
∙ Îáùåãî íàçíà÷åíèÿ è ñïåöèàëèçèðîâàííûå
Íà Ïèòîíå ìîæíî íàïèñàòü ãðàôè÷åñêèé ðåäàêòîð, âåáñàéò, ïðîãðàììó, îáðàáàòûâàþùóþ ðåçóëüòàòû îïûòîâ,
èãðó â êðåñòèêè-íîëèêè è ìíîãîå äðóãîå.
∙ Èíòåðïðåòèðóåìûå è êîìïèëèðóåìûå
Ïðîãðàììó íà Ïèòîíå âûïîëíÿåò ïðîãðàììà-èíòåðïðåòàòîð. Ïî÷òè äëÿ êàæäîé îïåðàöèîííîé ñèñòåìû è àðõè-
òåêòóðû ïðîöåññîðà ñóùåñòâóåò ñâîé èíòåðïðåòàòîð, òàê ÷òî òåêñò ïðîãðàììû íå òðåáóåòñÿ ìîäèôèöèðîâàòü.
Ïðàâäà, èç-çà íåîáõîäèìîñòè îáðàáîòêè èíòåïðåòàòîðîì ïðîãðàììà íà Ïèòîíå ðàáîòàåò ìåäëåíåå, ÷åì àíàëîãè÷-
íàÿ ïðîãðàììà íà êîìïèëèðóåìîì ÿçûêå (Ñ++, Ïàñêàëü).
Îïðåäåëåíèå ÿçûêà âêëþ÷àåò â ñåáÿ ñèíòàêñè÷åñêèå è ñåìàíòè÷åñêèå ïðàâèëà. Ïåðâûå îïèñûâàþò ñòðóêòóðó, âòî-
ðûå ñìûñë.
∙ Ñèíòàêñèñ îïðåäåëÿåò ðàçðåø¼ííûå êîíñòðóêöèè ÿçûêà
1x = 6 # имя переменной не может начинаться с цифры
Аткрой акно! # нет таких слов в русском языке
∙ Ñàìûå ñëîæíûå îøèáêè âîçíèêàþò, êîãäà ïðîãðàììà íàïèñàíà âåðíî â ïðåäûäóùèõ äâóõ ñìûñëàõ, íî íà íåêî-
òîðûõ âõîäíûõ äàííûõ íå çàêàí÷èâàåò ðàáîòó èëè âûäà¼ò íåïðàâèëüíûé îòâåò.
def power (a , n ):
res = 1
i = 1
while i < n :
res = res * a
return res
 ýòîì ïðèìåðå öèêë while íèêîãäà íå çàêîí÷èò ðàáîòó, åñëè ïåðåäàííîå çíà÷åíèå ïàðàìåòðà n áîëüøå 1.
Äëÿ åñòåñòâåííîãî ÿçûêà ïðèìåðîì ìîæåò ïîñëóæèòü ñî÷èíåíèå íà çàäàííóþ òåìó, çàñëóæèâøåå ïîìåòêó "Òåìà
íå ðàñêðûòà".
Условия реализации основной образовательной программы среднего (полного) общего образования
должны обеспечивать для участников образовательного процесса возможность:. . . формирования у обучающихся. . . ,
готовности к защите Отечества, службе в Вооружённых Силах Российской Федерации.
(Выдержка из Федерального Государственного Образовательного Стандарта Общего Образования)
∙ ×èñëà
– Äëÿ õðàíåíèÿ öåëûõ ÷èñåë Python â îòëè÷èå îò áîëüøèíñòâà ÿçûêîâ (C++, Ïàñêàëü) èñïîëüçóåò âñþ äî-
ñòóïíóþ ïàìÿòü. Ôàêòè÷åñêè, ðàáîòà ñ äëèííûìè öåëûìè ÷èñëàìè ðåàëèçîâàíà â ñòàíäàðòå ÿçûêà.
– Âåùåñòâåííûå ÷èñëà ðåàëèçîâàíû íà îñíîâå ÷èñåë ñ ïëàâàþùåé òî÷êîé äâîéíîé òî÷íîñòè double (64 áèòà).
1 áèò íà çíàê, 11 áèò íà ïîêàçàòåëü ýêñïîíåíòû è 52 áèòà íà çíà÷àùóþ ÷àñòü (ìàíòèññó).
Ïðèìåðû: 3.0, -123.345, .76543, 23.490e23.
∙ Ëîãè÷åñêèå: True, False. Ëîãè÷åñêèé òèï íà ñàìîì äåëå ÿâëÿåòñÿ ëèøü ïîäòèïîì öåëîãî, çíà÷åíèå False ñîîò-
âåòñòâóåò íóëþ, True ëþáîìó íåíóëåâîìó öåëîìó ÷èñëó.
∙ Óïîðÿäî÷åííûå ïîñëåäîâàòåëüíîñòè
– строки: ïîñëåäîâàòåëüíîñòü ëèòåðàëîâ (ñèìâîëîâ). Ñòðîêîâûå çíà÷åíèÿ äîëæíû áûòü çàêëþ÷åíû â îäè-
íàðíûå è äâîéíûå êàâû÷êè. Ïðèìåðû: ’a’, ’abc’, ’234g 3654___’, ”don’t”.
– списки: ïîñëåäîâàòåëüíîñòü ïðîèçâîëüíûõ ýëåìåíòîâ, ðàçäåëÿåìûõ çàïÿòûìè è âçÿòàÿ â êâàäðàòíûå ñêîá-
êè. Ïóñòîé ñïèñîê []. Ïðèìåðû: [1, 2, 3], [’Name’, ’Surname’, Age].
– кортежи: ïîñëåäîâàòåëüíîñòü ïðîèçâîëüíûõ ýëåìåíòîâ, ðàçäåëÿåìûõ çàïÿòûìè, êîòîðàÿ ìîæåò áûòü âçÿòà
â êðóãëûå ñêîáêè. Ïóñòîé êîðòåæ îáÿçàòåëüíî äîëæåí áûòü âçÿò â ñêîáêè: (), êîðòåæ èç îäíîãî ýëåìåíòà
îáÿçàòåëüíî äîëæåí ñîäåðæàòü çàïÿòóþ ïîñëå åäèíñòâåííîãî ýëåìåíòà: (4,). Ïðèìåðû: (2, 3), (’abc’,
345)
1.3 Идентификаторы
Èäåíòèôèêàòîðîì â Ïèòîíå íàçûâàåòñÿ ïîñëåäîâàòåëüíîñòü çàãëàâíûõ ëàòèíñêèõ áóêâ, ñòðî÷íûõ ëàòèíñêèõ áóêâ,
çíàêîâ ïîä÷¼ðêèâàíèÿ è öèôð, íà÷èíàþùàÿñÿ íå ñ öèôðû è îòëè÷íàÿ îò ñëóæåáíîãî ñëîâà.
Служебные слова
False class finally is return
None continue for lambda try
True def from nonlocal while
and del global not with
as elif if or yield
assert else import pass
break except in raise
∙ Логические операции
– áèíàðíàÿ îïåðàöèÿ ëîãè÷åñêîå "È"(and): ðåçóëüòàò âûïîëíåíèÿ ðàâåí True òîãäà è òîëüêî òîãäà, êîãäà îáà
îïåðàíäà ðàâíû True, â ïðîòèâíîì ñëó÷àå ðåçóëüòàò âûïîëíåíèÿ ðàâåí False.
– áèíàðíàÿ îïåðàöèÿ ëîãè÷åñêîå "ÈËÈ"(or): ðåçóëüòàò âûïîëíåíèÿ ðàâåí True òîãäà è òîëüêî òîãäà, êîãäà
õîòÿ áû îäèí îïåðàíä ðàâåí True, â ïðîòèâíîì ñëó÷àå ðåçóëüòàò âûïîëíåíèÿ ðàâåí False.
– óíàðíàÿ îïåðàöèÿ ëîãè÷åñêîå "ÍÅ"(not): ðåçóëüòàò âûïîëíåíèÿ ðàâåí True, åñëè îïåðàíä ðàâåí False, â
ïðîòèâíîì ñëó÷àå ðåçóëüòàò âûïîëíåíèÿ ðàâåí True.
Числовые выражения â Ïèòîíå êîíñòðóèðóþòñÿ ïðè ïîìîùè ÷èñëîâûõ çíà÷åíèé, èäåíòèôèêàòîðîâ, çíàêîâ
îïåðàöèé è êðóãëûõ ñêîáîê â ïðèíÿòîì â àëãåáðå ïîðÿäêå.
Ïðèìåðû:
Îïåðàöèÿ Îïèñàíèå
() ñêîáêè
** âîçâåäåíèå â ñòåïåíü
+x, -x, ∼x óíàðíûé ïëþñ, óíàðíûé ìèíóñ, áèòîâîå ÍÅ
*, /, % óìíîæåíèå, äåëåíèå, îñòàòîê îò äåëåíèÿ
+, - ñëîæåíèå, âû÷èòàíèå
≪, ≫ áèòîâûå ñäâèãè
& áèòîâîå È
ˆ áèòîâîå èñêëþ÷àþùåå ÈËÈ
| áèòîâîå ÈËÈ
in, not in, is, is not, <, <=, >,>=,<>, !=,== ïðîâåðêà íà ïðèíàäëåæíîñòü, íà èäåíòè÷íîñòü, ñðàâíåíèÿ
not ëîãè÷åñêîå ÍÅ
and ëîãè÷åñêîå È
or ëîãè÷åñêîå ÈËÈ
Cîîòâåòñòâóþùèé ðàçäåë äîêóìåíòàöèè: http://docs.python.org/2/reference/expressions.html
Âñå îïåðàöèè, èìåþùèå îäèíàêîâûé ïðèîðèòåò âûïîëíÿþòñÿ ñëåâà íàïðàâî. Èñêëþ÷åíèÿìè ÿâëÿþòñÿ ñðàâíåíèÿ
(ñì. öåïî÷êè ñðàâíåíèé âûøå) è îïåðàöèÿ âîçâåäåíèÿ â ñòåïåíü, êîòîðàÿ âûïîëíÿåòñÿ ñïðàâà íàëåâî. Òàêèì îáðàçîì
2**3**2 ïîíèìàåòñÿ êàê 2**(3**2).
Замечания
∙ Ïðîâåðêà íà ðàâåíñòâî äëÿ âåùåñòâåííîãî òèïà íå èìååò ñìûñëà.
Äåëî â òîì, ÷òî â îòëè÷èå îò öåëûõ ÷èñåë, äëÿ êîòîðûõ ñóùåñòâóåò (è åäèíñòâåííîå) ðàçëîæåíèå ïî ñòåïåíÿì
1
äâîéêè, íå äëÿ âñåõ äåñÿòè÷íûõ äðîáåé ñóùåñòâóåò ïðåäñòàâëåíèå â âèäå êîíå÷íîé ñóììû äðîáåé âèäà 𝑛 .
2
1
Íàïðèìåð, = 0.00(100)
7
Âûíóæäåííîå
√ √ îòáðàñûâàíèå ñòàðøèõ ðàçðÿäîâ (îêðóãëåíèå) ïðèâîäèò, íàïðèìåð, ê òàêèì ðåçóëüòàòàì (ñðàâíå-
íèå 2 · 2 è 2):
import math
a = math . sqrt (2)
print ( a * a == 2)
# результат выполнения
False
Êàê Python îïðåäåëÿåò òèï ÷èñëîâîãî âûðàæåíèÿ, åñëè â òàêîì âûðàæåíèè ìîãóò âñòðåòèòüñÿ çíà÷åíèÿ è ïåðå-
ìåííûå ðàçíûõ òèïîâ? Ýòî ìîæåò áûòü ñäåëàíî äâóìÿ ðàçíûìè ñïîñîáàìè èëè àâòîìàòè÷åñêè (òàêîé ñïîñîá
íàçûâàåòñÿ íåÿâíûì ïðèâåäåíèåì òèïà), èëè ïóò¼ì ÿâíîãî óêàçàíèÿ òèïà, êîòîðûé äîëæåí èìåòü ðåçóëüòàò
âû÷èñëåíèÿ âûðàæåíèÿ.
∙ Неявное приведение
Òèï ÷èñëîâîãî âûðàæåíèÿ îïðåäåëÿåòñÿ òèïîì íàèáîëåå "ñëîæíîãî"èç âõîäÿùèõ çíà÷åíèé è ïåðåìåííûõ. ×èñ-
ëîâûå òèïû óïîðÿäî÷åíû ïî ñëîæíîñòè òàê: öåëûé < âåùåñòâåííûé.
Ïðèìåðû:
– âûðàæåíèÿ öåëîãî òèïà: öåëûå îïåðàíäû è îïåðàöèè, ðåçóëüòàò êîòîðûõ öåëîå ÷èñëî
1 // 3, 2 * 30, 5 // (5 % 3)
– âûðàæåíèÿ âåùåñòâåííîãî òèïà: ñîäåðæàò ïî êðàéíåé ìåðå îäèí âåùåñòâåííûé îïåðàíä èëè îïåðàöèþ,
ðåçóëüòàò êîòîðîé âåùåñòâåííîå ÷èñëî:
1 / 5, 45 % 23 + 0.5, 3 + 6 - 6 / 3
∙ Явное приведение
Äëÿ ÿâíîãî ïðèâåäåíèÿ âûðàæåíèÿ ê íóæíîìó òèïó íåîáõîäèìî èñïîëüçîâàòü âñòðîåííûå ôóíêöèè int(),
float(). Êàæäàÿ çàâèñèò îò îäíîãî àðãóìåíòà è ïåðåâîäèò åãî â öåëûé è âåùåñòâåííûé òèï ñîîòâåòñòâåííî.
Ïðèìåðû êîððåêòíûõ âûçîâîâ: int(2 / 2), float(7 // 4)
Ïðèìåðû íåêîððåêòíûõ âûçîâîâ: float(-2 ** 2000)
Глава 2
Êîìàíäû +=, -=, *=, //=, /=, %= ÿâëÿþòñÿ ñîêðàù¼ííîé ôîðìîé çàïèñè ñëåäóþùèõ êîìàíä:
x = 7
x += 2 # увеличение значения переменной x на 2: x = x + 2
x -= 2 # уменьшение значения переменной x на 2: x = x - 2
x *= 2 # увеличение значения переменной x в 2 раза : x = x * 2
x //= 2 # уменьшение значения переменной x в 2 раза : x = x // 2
x /= 2 # вещественное деление
x %= 2 # получение остатка от деления x на 2: x = x % 2
Îïåðàòîð ïðèñâàèâàíèÿ âûïîëíÿåò äâà äåéñòâèÿ: ñíà÷àëà âû÷èñëÿåò çíà÷åíèå âûðàæåíèÿ, ñòîÿùåãî â ïðàâîé ÷à-
ñòè, çàòåì ñâÿçûâàåò èìÿ ïåðåìåííîé, ñòîÿùåé â ëåâîé ÷àñòè ñ âû÷èñëåííûì çíà÷åíèåì. Òèï ïåðåìåííîé, ñòîÿùåé â
ëåâîé ÷àñòè îïðåäåëÿåòñÿ òèïîì âû÷èñëåííîãî çíà÷åíèÿ.
Äî òîãî, êàê èìÿ ïåðåìåííîé áûëî ñâÿçàíî ñ êàêèì-òî çíà÷åíèåì, å¼ íåëüçÿ èñïîëüçîâàòü â ïðàâîé ÷àñòè îïåðàòîðà
ïðèñâàèâàíèÿ:
a = b + 3 # невозможно вычислить значение выражения b + 3 , т . к . неизвестно чему равно b
t += 7 # так нельзя , это то же самое , что и t = t + 7 , невозможно вычислить t + 7
a = 13
a *= 3 # переменная a теперь имеет значение 39
Òèï ïåðåìåííîé îïðåäåëÿåòñÿ â ìîìåíò ïðèñâàèâàíèÿ åé çíà÷åíèÿ è ÿâëÿåòñÿ òàêèì îáðàçîì äèíàìè÷åñêèì (ò.å.
ïåðåìåííàÿ ìîæåò ìåíÿòü ñâîé òèï ïî õîäó âûïîëíåíèÿ ïðîãðàììû). Ïîäðîáíåå î äèíàìè÷åñêîé òèïèçàöèè ñì. Ãëàâó
10.
x = 3 # значение переменной x равно 3 ( целый тип )
x = 5 + x # значение переменной x равно значению выражения 5 + x
# переменная x теперь имеет значение 8 ( целый тип )
x = x * 2.2 # значение переменной x равно значению выражения x * 2.2
# переменная x теперь имеет значение 17.6 ( вещественный тип )
b = 2
b = b / 3 # значение переменной b равно 0.66 ( вещественный тип )
x = 2.6
# сейчас переменная x имеет вещественный тип , её значение равно 2.6
x = ( x > 3) and ( x * x < 100)
# значение выражения в правой части оператора присваивания ,
# а значит и переменная x имеют логический тип и равны False
ГЛАВА 2. ОСНОВНЫЕ ОПЕРАТОРЫ 8
Îïåðàòîð ïðèñâàèâàíèÿ èìååò íåñêîëüêî ðàñøèðåíèé. Îäíî èç íèõ ñëåäóþùåå: ëåâàÿ ÷àñòü îïåðàòîðà ìîæåò ñîäåð-
æàòü íåñêîëüêî èì¼í ïåðåìåííûõ, ðàçäåë¼ííûõ çàïÿòîé. Ïðàâàÿ ÷àñòü îïåðàòîðà â òàêîì ñëó÷àå äîëæíà ñîäåðæàòü
ñòîëüêî æå âûðàæåíèé, òàêæå ðàçäåë¼ííûõ çàïÿòîé. Âûðàæåíèÿ â ïðàâîé ÷àñòè âû÷èñëÿþòñÿ, çàòåì ïîëó÷èâøèåñÿ
çíà÷åíèÿ ïðèñâàèâàþòñÿ ïåðå÷èñëåííûì â ëåâîé ÷àñòè ïåðåìåííûì, ñëåâà íàïðàâî.
# a присваивается значение целого типа (4)
# b присваивается значение строкового типа ( ’ abc ’)
a , b = 4 , ’ abc ’
# а так можно записать обмен значениями для двух переменных
a, b = b, a
 ïîäîáíîì îïåðàòîðå ïðèñâàèâàíèÿ âàæíî ïîíèìàòü ïîñëåäîâàòåëüíîñòü âû÷èñëåíèÿ âûðàæåíèé â ïðàâîé ÷àñòè
è ïðèñâàèâàíèé: присваивание3, присваивание4 = вычисление1, вычисление2
Îïåðàòîð print âûâîäèò íà ýêðàí âû÷èñëåííûå çíà÷åíèÿ óêàçàííûõ âûðàæåíèé, çàòåì ñèìâîë îêîí÷àíèÿ ñòðîêè.
print (34 / 4)
print (34 % 4)
# результат выполнения :
8.5
2
Åñëè íàäî âûâåñòè çíà÷åíèÿ íåñêîëüêèõ âûðàæåíèé â îäíîé ñòðîêå, èõ ñëåäóåò ïåðå÷èñëèòü ÷åðåç çàïÿòóþ.
print (34 // 4 , 34 % 4)
# результат выполнения :
8 2
Ïî óìîë÷àíèþ ôóíêöèÿ print ïåðåâîäèò êóðñîð â íà÷àëî ñëåäóþùåé ñòðîêè. Ýòî ïðîèñõîäèò ïîòîìó ÷òî ó ôóíê-
öèè print åñòü íåîáÿçàòåëüíûé ïàðàìåòð end, ðàâíûé ïî óìîë÷àíèþ ñèìâîëó ïåðåíîñà ñòðîêè. Ôóíêöèè print ïåðå-
äàòü çíà÷åíèå ýòîãî ïàðàìåòðà ÿâíî:
print ( ’ quotient : ’ ,34 / 4 , end = ’ ’)
print ( ’ ,␣ remainder : ’ ,34 % 4)
# результат выполнения :
quotient :8 , remainder :2
Ïðè âûâîäå íåñêîëüêèõ çíà÷åíèé ôóíêöèÿ print ðàçäåëÿåò èõ îäíèì ïðîáåëîì. Óïðàâëÿåò ýòèì íåîáÿçàòåëüíûé
ïàðàìåòð sep. Ïî óìîë÷àíèþ åãî çíà÷åíèå ðàâíî ñòðîêå èç îäíîãî ïðîáåëà. Íàïðèìåð:
a = 4
print ( ’ Square ␣ of ’ , a , ’ is ’ , a * a , ’. ’) # результат : Square of 4 is 16 .
×òîáû èçáàâèòüñÿ îò íåíóæíîãî ïðîáåëà ïåðåä òî÷êîé, ìîæíî ïîñòóïèòü òàê:
a = 4
print ( ’ Square ␣ of ␣ ’ , a , ’␣ is ␣ ’ , a * a , ’. ’ , sep = ’␣ ’) # результат : Square of 4 is 16.
Åñëè ïðîãðàììà íåòðåáîâàòåëüíà ê ôîðìàòó âûâîäèìûõ çíà÷åíèé (íàïðèìåð íóæíî âûâåñòè íåñêîëüêî ÷èñåë èëè
èíûõ çíà÷åíèé, ðàçäåë¼ííûõ ïðîáåëîì), ðàçóìíî ïîëüçîâàòüñÿ ñòàíäàðòíîé ôóíêöèåé print, ïåðå÷èñëÿÿ çíà÷åíèÿ
÷åðåç çàïÿòóþ. Íî ÷àñòî ðåçóëüòàò ðàáîòû ïðîãðàììû òðåáóåòñÿ âûâîäèòü â ñòðîãî îïðåäåë¼ííîì ôîðìàòå, ïðè÷¼ì
ïàðàìåòðîâ sep è end ìîæåò áûòü íåäîñòàòî÷íî. Íàïðèìåð ïðè âûâîäå âåùåñòâåííûõ ÷èñåë íåîáõîäèìî òî÷íî óêàçàòü
êîëè÷åñòâî ñèìâîëîâ, îòâîäèìûõ ïîä äðîáíóþ ÷àñòü. Äëÿ ýòèõ (è äëÿ ìíîãèõ äðóãèõ) öåëåé ñëóæèò ò.í. ôîðìàòèðî-
âàííûé âûâîä.
Äëÿ çàäàíèÿ âûâîäèìûì íà ýêðàí äàííûì òðåáóåìîãî ôîðìàòà ìîæíî èñïîëüçîâàòü ôóíêöèþ print â ñî÷åòàíèè
ñ ìåòîäîì str.format():
print(<строка форматирования>.format(<перечень форматируемых выражений>))
Ñòðîêà ôîðìàòèðîâàíèÿ ñîäåðæèò òåêñò è ñïåöèôèêàöèè ôîðìàòà, âçÿòûå â ôèãóðíûå ñêîáêè { }. Ñïåöèôèêàöèÿ
ôîðìàòà ìîæåò áûòü ïóñòîé, ñîäåðæàòü íîìåð âûðàæåíèÿ èç ñïèñêà ôîðìàòèðóåìûõ âûðàæåíèé (êîòîðûå íóìåðó-
þòñÿ, íà÷èíàÿ ñ íóëÿ) èëè íîìåð âûðàæåíèÿ ñî ñïåöèôèêàöèåé ôîðìàòà. Âåñü òåêñò, íàõîäÿùèéñÿ âíå ýòèõ ñêîáîê,
âûâîäèòñÿ áåç èçìåíåíèé. Ïðèâåä¼ì íåñêîëüêî ïðèìåðîâ ñ ðåçóëüòàòàìè âûâîäà:
ГЛАВА 2. ОСНОВНЫЕ ОПЕРАТОРЫ 9
a = 3
b = 4
print ( ’ {0}{1}{2} ’. format (a , b , a * b ))
3412 # между спецификациями формата отсутствуют пробелы
print ( ’ {0} ␣ {1} ␣ {2} ’. format (a , b , a * b ))
3 4 12
print ( ’ {}{}{}{} ’. format (a , b , b / a ))
# ошибка : количество спефикаций формата превышает количество форматируемых выражений
print ( ’a ={0} , ␣ b ={1} ␣ a ␣ % ␣ b ␣ = ␣ {3} , ␣ a ␣ // ␣ b ␣ = ␣ {2} ’. format (a , b , a // b , a % b ))
a = 3 , b = 4 , a % b = 3 , a // b = 0
# можно явно указать соответствие спецификаций выражениям
Íåñêîëüêî ñëîâ î ñïåöèôèêàöèÿõ ôîðìàòà äëÿ âûâîäà ÷èñåë.
x = 11 / 7
print ( ’ {0:5.3 f } ␣ {1:5.3 f } ␣ {2:10.5 f } ’. format (x , x * x , x * x * x ))
# на первые два значения отводится 5 знаков на всё значение и 3 знака на дробную часть
# на последнее значение отводится 10 знаков на всё и 5 знаков на дробную часть
1.571 2.469 3.88047
import math
a = math . sqrt (2)
b = math . sqrt (3)
print ( ’a ␣ = ␣ {0:5.6 f } , ␣ b ␣ = ␣ {1:5.6 f } ’. format (a , b ))
# обратите внимание на пробелы , окружающие знаки равенства
a = 1.414214 , b = 1.732051
ГЛАВА 2. ОСНОВНЫЕ ОПЕРАТОРЫ 10
# таблица умножения
for i in range (1 , 11):
for j in range (1 , 11):
print ( ’ {0:4 d } ’. format ( i * j ) , end = ’ ’)
print ()
# результат выполнения :
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
Ïîäðîáíåå ïðî ôîðìàòèðîâàííûé âûâîä è âñå åãî ïàðàìåòðû ìîæíî ïðî÷èòàòü â ñîîòâåòñòâóþùåì ðàçäåëå äîêó-
ìåíòàöèè:
http://docs.python.org/3/library/string.html#format-specification-mini-language
Ôóíêöèÿ input âûâîäèò íà ýêðàí ñòðîêó <s>, çàòåì ñ÷èòûâàåò ââåä¼ííóþ ïîëüçîâàòåëåì ñòðîêó è ñâÿçûâàåò
<имя> c ýòèì ñòðîêîâûì çíà÷åíèåì. Ïðèìåðû èñïîëüçîâàíèÿ:
d = 4
s = input ( ’ number : ’)
print ( d * s )
print ( d * int ( s ))
print ( d / float ( s ))
ãäå <óñëîâèå> âûðàæåíèå, èìåþùåå çíà÷åíèå ëîãè÷åñêîãî òèïà èëè íåÿâíûì îáðàçîì ïðèâîäèìîå ê íåìó
<ñîñòàâíîé îïåðàòîð> îäèí èëè íåñêîëüêî îïåðàòîðîâ ÿçûêà Ïèòîí, íàçûâàåìûå òåëîì óñëîâíîãî îïåðàòîðà
Êàê èíòåðïðåòàòîð Python ïîíèìàåò, ãäå çàêàí÷èâàåòñÿ òåëî óñëîâíîãî îïåðàòîðà? Âñå ñòðî÷êè, ñîäåðæàùèå îïå-
ðàòîðû òåëà íà÷èíàþòñÿ ñ îòñòóïà, êîòîðûé îáû÷íî ñîñòàâëÿåò 4 ïðîáåëà. Ïðè ýòîì îòñòóï ñ÷èòàåòñÿ îòíîñèòåëüíî
ñòàðòîâîé ïîçèöèè çàãîëîâêà óñëîâíîãî îïåðàòîðà (ñîäåðæàùåãî ñëóæåáíîå ñëîâî if). Ýòî æå ïðàâèëî ðàñïðîñòðàíÿ-
åòñÿ íà âëîæåííûå êîíñòðóêöèè:
if < условие >:
.... < оператор >
...
.... < оператор >
.... if < условие >:
........ < оператор >
...
........ < оператор >
.... < оператор > # продолжается выполнение первого условного оператора
...
.... < оператор >
Ïðîâåðêà óñëîâèÿ äåëàåòñÿ îäèí ðàç, ïåðåä âûïîëíåíèåì òåëà óñëîâíîãî îïåðàòîðà. Òàê, â ïðèìåðå:
n = 2
if n < 4:
n = n * 2
n = n * 2
print ( n )
ïðîãðàììà âûâåäåò 8 (ò.å. âûïîëíÿòñÿ âñå îïåðàòîðû, ñîñòàâëÿþùèå òåëî îïåðàòîðà if).
Óñëîâíûé îïåðàòîð ïîçâîëÿåò èçáåæàòü âûïîëíåíèÿ ÷àñòåé ïðîãðàììû â çàâèñèìîñòè îò èñòèííîñòè êàêîãî-òî
ëîãè÷åñêîãî âûðàæåíèÿ. Òàêèì îáðàçîì, âðåìÿ âûïîëíåíèÿ ïðîãðàììû, ñîñòàâëåííîé èç èçâåñòíûõ íàì îïåðàòîðîâ
ââîäà-âûâîäà è óñëîâíîãî îñòà¼òñÿ ïîñòîÿííûì âíå çàâèñèìîñòè îò îáú¼ìà âõîäíûõ äàííûõ. Êàæäûé îïåðàòîð âû-
ïîëíèòñÿ íå áîëåå îäíîãî ðàçà.
else :
print ( " Sorry , ␣ that ␣ you ’ re ␣ giving ␣ up ! " )
break
else :
print ( ’ Congratulation ! ’)
Âòîðîé ñïîñîá îïåðàòîð continue. Åãî îòëè÷èå îò îïåðàòîðà break â òîì, ÷òî, çàêàí÷èâàÿ âûïîëíåíèå òåêóùåé
èòåðàöèè, îí íå çàâåðøàåò âûïîëíåíèå ñàìîãî öèêëà, à ïåðåõîäèò ê ïðîâåðêå åãî óñëîâèÿ. Çàòåì, â çàâèñèìîñòè îò
ðåçóëüòàòà ïðîâåðêè, ïåðåõîäèò ê âûïîëíåíèþ ñëåäóþùåé èòåðàöèè.
x = -50
while x < 50:
if x == 0:
continue
print (1 / x )
2.8 Комментарии
Êîììåíòàðèÿìè â Python íàçûâàþòñÿ ñòðîêè èëè ÷àñòè ñòðîê ïðîãðàììû, íà÷èíàþùèåñÿ ñ ñèìâîëà '#'. Òàêèå ñòðîêè
íå âîñïðèíèìàþòñÿ èíòåðïðåòàòîðîì Python, êàê êîìàíäû, à èãíîðèðóþòñÿ. Êîììåíòàðèè èñïîëüçóþòñÿ äëÿ îïèñàíèÿ
íà åñòåñòâåííîì ÿçûêå íåòðèâèàëüíûõ (íåî÷åâèäíûõ) ÷àñòåé ïðîãðàììû.
Åù¼ îäèí ñïîñîá ïîâûñèòü ÷èòàåìîñòü ïðîãðàììû äàâàòü ïåðåìåííûì èìåíà, îòðàæàþùèå ñìûñë (à èíîãäà è
òèï) ýòèõ ïåðåìåííûõ. Íå âñåãäà ðàçóìíî äàâàòü всем
ïåðåìåííûì äëèííûå, ≪ãîâîðÿùèå≫ íàçâàíèÿ. Íî â ëþáîì ñëó-
÷àå ñòîèò êîìáèíèðîâàòü îáà ýòè ìåòîäà (êîììåíòàðèè è èìåíà ïåðåìåííûõ), ÷òîáû ïðîãðàììà îñòàâàëàñü ïîíÿòíîé
âíå çàâèñèìîñòè îò âðåìåíè, ïðîøåäøåãî ñ ìîìåíòà å¼ íàïèñàíèÿ.
Ïðèìåð:
k = 2
n = int ( input ())
while n > 2:
while ( n % k ) == 0: # пока можем делить на k
print (k , end = ’␣ ’) # выписываем
n = n // k # и делим
k = k + 1
Глава 3
Ñòðîêîâîå çíà÷åíèå çàïèñûâàåòñÿ êàê ïîñëåäîâàòåëüíîñòü ñèìâîëîâ, çàêëþ÷¼ííàÿ â îäèíàðíûå èëè äâîéíûå êàâû÷êè:
a = ’ abcde ’
s = " (926) ␣ 123 -45 -67 "
f = ’’
Äàëåå â òåêñòå âñå ñòðîêîâûå çíà÷åíèÿ áóäóò áðàòüñÿ â êàâû÷êè. Ôðàçà переменная a имеет значение ’qwerty’
áóäåò îçíà÷àòü, ÷òî ñòðîêà a ñîñòîèò èç ñèìâîëîâ, ñòîÿùèõ ìåæäó êàâû÷êàìè. Äëÿ îòäåëüíûõ ñèìâîëîâ â Python íåò
ñïåöèàëüíîãî òèïà, êàê â äðóãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ. Ñèìâîë â Python ñòðîêà äëèíû 1.
 ïàìÿòè êîìïüþòåðà ñèìâîëû (è ñòðîêè èç íèõ ñîñòàâëåííûå) õðàíÿòñÿ êàê ÷èñëà (ñòðîêè êàê ïîñëåäî-
âàòåëüíîñòè ÷èñåë). Âçàèìîîäíîçíà÷íîå ñîîòâåòñòâèå ìåæäó ñèìâîëàìè è ÷èñëàìè äà¼òñÿ òàáëèöåé, êîòîðàÿ
íàçûâàåòñÿ ASCII ( American Standard Code for Information Interchange
).
 òàáëèöå 256 ïàð, èñòîðè÷åñêè æå èñïîëüçóåòñÿ òîëüêî ïåðâàÿ ïîëîâèíà, ñîäåðæàùàÿ îñíîâíûå ñèìâîëû: áóêâû
ëàòèíñêîãî àëôàâèòà (ñòðî÷íûå è ïðîïèñíûå), öèôðû, çíàêè ïðåïèíàíèÿ è íåêîòîðûå äðóãèå. Êðîìå ïåðå÷èñ-
ëåííûõ ñóùåñòâóþò ò.í. óïðàâëÿþùèå ñèìâîëû ñ íîìåðàìè, ìåíüøèìè 32, êîòîðûå íå îòîáðàæàþòñÿ íà ýêðàíå.
Ôóíêöèÿ, êîòîðàÿ ïî íîìåðó â òàáëèöå âîçâðàùàåò ñèìâîë, íàçûâàåòñÿ chr(), îáðàòíàÿ åé ord(). Âîò íåêî-
òîðûå ïðèìåðû èõ èñïîëüçîâàíèÿ:
ГЛАВА 3. СТРОКИ, ОПЕРАТОР ЦИКЛА FOR 16
Ñðàâíåíèå ñòðîê, ñîñòîÿùèõ èç îäíîãî ñèìâîëà ñâîäèòñÿ ê ñðàâíåíèþ öåëûõ ÷èñåë êîäîâ ýòèõ ñèìâîëîâ,
âîçâðàùàåìûõ ôóíêöèåé ord(). Ñðàâíåíèå ñòðîê, ñîñòîÿùèõ èç á îëüøåãî êîëè÷åñòâà ñèìâîëîâ îïðåäåëÿåòñÿ
ëåêñèêîãðàôè÷åñêèì ïîðÿäêîì (êàê â ñëîâàðå). Ôîðìàëüíî, ëåêñèêîãðàôè÷åñêèé ïîðÿäîê äëÿ ñòðîê îäèíàêîâîé
äëèíû a è b îïðåäåëÿåòñÿ ñëåäóþùèì îáðàçîì:
Äëÿ îïðåäåëåíèÿ ëåêñèêîãðàôè÷åñêîãî ïîðÿäêà ñòðîê ðàçíîé äëèíû íàäî â êîíåö êîðîòêîé ñòðîêè ìûñëåííî
äîïèñàòü ñèìâîëû ñ êîäîì, ìåíüøèì êîäà ëþáîãî âîçìîæíîãî ñèìâîëà, çàòåì ïðèìåíèòü ñòàíäàðòíîå ïðàâèëî.
print ( ’a ’ > ’c ’) # программа выведет False
print ( ’1 ’ < ’z ’) # программа выведет True
print ( ’ ab ’ < ’a ’) # программа выведет False
print ( ’ cba ’ > ’ abc ’) # программа выведет True
print ( ’ 123 ’ < ’␣ ’) # программа выведет False
print ( ’ name ’ > ’ ’) # программа выведет True ( пустая строка меньше любой непустой )
# функция возвращает True , если переданная строка состоит из одного символа - цифры
# и False в противном случае
def isdigit ( s ):
if len ( s ) > 1:
return False
else :
return ’0 ’ <= s <= ’9 ’
Îïåðàöèÿ ñëîæåíèÿ, îïðåäåë¼ííàÿ äëÿ ÷èñëîâûõ òèïîâ, ìîæåò èñïîëüçîâàòüñÿ è ñî çíà÷åíèÿìè ñòðîêîâîãî òèïà.
Ðåçóëüòàòîì ñëîæåíèÿ ÿâëÿåòñÿ íîâàÿ ñòðîêà, äëèíà êîòîðîé ðàâíà ñóììå äëèí ñëàãàåìûõ ñòðîê è ñîñòàâëåííàÿ
èç èõ ñèìâîëîâ ñ ñîõðàíåíèåì ïîðÿäêà ñëåäîâàíèÿ. Òàêàÿ ñòðîêîâàÿ îïåðàöèÿ íàçûâàåòñÿ конкатенацией
.
name = ’ Petya ’
sname = ’ Petrov ’
fname = name + ’␣ ’ + sname # значение переменной fname равно ’ Petya Petrov ’
print ( len ( name ) , len ( sname ) , len ( fname )) # будут напечатаны числа 5 , 6 и 12
ãäå <переменая1> è îäíà èç ïåðåìåííûõ â ïðàâîé ÷àñòè îïåðàòîðà ïðèñâàèâàíèÿ ïåðåìåííûå ñòðîêîâîãî òèïà,
à âòîðàÿ ïåðåìåííàÿ â ïðàâîé ÷àñòè îïåðàòîðà ïðèñâàèâàíèÿ öåëîãî òèïà.
x = ’a + b + ’
s = x * 2 # значение переменной s равно ’a + b + a + b + ’
s = 3 * x # значение переменной s равно ’a + b + a + b + a + b + ’
ГЛАВА 3. СТРОКИ, ОПЕРАТОР ЦИКЛА FOR 17
∙ Сечения строк
 Python èìååòñÿ óäîáíîå ñðåäñòâî ïîëó÷åíèÿ ÷àñòåé óïîðÿäî÷åííûõ ïîñëåäîâàòåëüíîñòåé, â ÷àñòíîñòè ñòðîê:
срезы (или сечения)
. Ñèíòàêñèñ îïåðàöèè:
s[n: m: k]
ãäå s èìÿ ïåðåìåííîé ñòðîêîâîãî òèïà, n, m, k âûðàæåíèÿ öåëîãî òèïà (𝑘 ̸= 0).
𝑚−𝑛
Çíà÷åíèå óêàçàííîãî âûðàæåíèÿ ñîñòàâëÿåòñÿ èç ñèìâîëîâ ñ èíäåêñàìè ðàâíûìè 𝑥 = 𝑛 + 𝑖 * 𝑘 , ãäå 0 6 𝑖 < ,
𝑘
ïðè÷¼ì â òîì æå ïîðÿäêå, ÷òî è â ñòðîêå s.
Åñëè âíóòðè êâàäðàòíûõ ñêîáîê ñòîèò îäíî äâîåòî÷èå, òî ñ÷èòàåòñÿ, ÷òî ýòî äâîåòî÷èå ìåæäó ïåðâûì è âòîðûì
ïàðàìåòðàìè (n è m).  ýòîì ñëó÷àå ñå÷åíèå ñòðîêè ïîäïîñëåäîâàòåëüíîñòü èñõîäíîé ñòðîêè íà÷èíàÿ ñ ñèìâîëà
ñ èíäåêñîì n è çàêàí÷èâàÿ ñèìâîëîì ñ èíäåêñîì m-1.
∘ Åñëè íå óêàçàí ïåðâûé ïàðàìåòð (íà÷àëî ïîäñòðîêè), òî åãî çíà÷åíèå ïîëàãàåòñÿ ðàâíûì 0
∘ Åñëè íå óêàçàí âòîðîé ïàðàìåòð (êîíåö ïîäñòðîêè), òî îí ïîëàãàåòñÿ ðàâíûì len(s)
∘ Åñëè íå óêàçàí òðåòèé ïàðàìåòð (øàã), òî îí ïîëàãàåòñÿ ðàâíûì 1.
Ïðèìåðû:
s = ’ abcdefghijklmnopqrstuvwxyz ’
s2 = ’_ ’
i = 10
print ( s [:]) # ’ abcdefghijklmnopqrstuvwxyz ’
print ( s [20:]) # ’ uvwxyz ’
print ( s [:10]) # ’ abcdefghij ’
print ( s [::2]) # ’ acegikmoqsuwy ’
print ( s [10:13:3]) # ’k ’
print ( s [:: -1]) # zyxwvutsrqponmlkjihgfedcba
print ( s [:: -2]) # zxvtrpnljhfdb
print ( s [5:5]) # ’’
print ( s [: i ] + chr ( ord ( s [ i ]) - 32) + s [ i +1:]) # ’ abcdefghijKlmnopqrstuvwxyz ’
s = s [: i ] + s2 + s [ i +1:] # изменить символ в строке можно только
# заново " собрав " новую строку
print ( s ) # ’ abcdefghij_lmnopqrstuvwxyz ’
 ïðåäïîñëåäíåì ïðèìåðå èñïîëüçóåòñÿ òîò ôàêò, ÷òî â ASCII-òàáëèöå íà÷àëî áëîêà ïðîïèñíûõ ëàòèíñêèõ áóêâ è
íà÷àëî áëîêà ñòðî÷íûõ ëàòèíñêèõ áóêâ ðàçäåëÿåò 32 ñèìâîëà (ïðîïèñíûå èäóò ðàíüøå). Òàê ÷òî äëÿ ïîëó÷åíèÿ
èç ëþáîé ïðîïèñíîé áóêâû ëþáîé ñòðî÷íîé è íàîáîðîò äîñòàòî÷íî âû÷åñòü (èëè ïðèáàâèòü) ê êîäó ñèìâîëà
÷èñëî 32.
ГЛАВА 3. СТРОКИ, ОПЕРАТОР ЦИКЛА FOR 18
Ïî àíàëîãèè ñî ñòðîêîé, êàê ïîñëåäîâàòåëüíîñòüþ ñèìâîëîâ, ÷ü¼ çíà÷åíèå çàäàâàëîñü ïåðå÷èñëåíèåì ýòèõ ñèìâîëîâ,
çíà÷åíèå ñïèñêà òîæå ìîæíî çàäàòü ïåðå÷èñëåíèåì åãî ýëåìåíòîâ. Îòäåëüíûå ýëåìåíòû ñïèñêà ðàçäåëÿþòñÿ çàïÿòîé,
à âåñü ñïèñîê çàêëþ÷àåòñÿ â êâàäðàòíûå ñêîáêè:
a = [1 , 2 , 3 , 4]
b = [2.71828 , 3.14159 , -1]
c = [ ’ Vera ’ , ’ Nadezhda ’ , ’ Lyubov ’]
d = [ True , False ]
f = [1 , True , 2.333 , ’ abcdefgh ’]
Ñïèñêè ìîæíî ñ÷èòàòü îáîáùåíèåì ñòðîê â òîì ñìûñëå, ÷òî ñïèñêè ýòî òîæå óïîðÿäî÷åííûå ïîñëåäîâàòåëüíîñòè,
íî çíà÷åíèÿ ñïèñêà ìîãóò áûòü ïðîèçâîëüíîãî òèïà. Áîëüøèíñòâî îïåðàöèé, îïèñàííûõ âûøå äëÿ ñòðîê, ïîëíîñòüþ
ïåðåíîñÿòñÿ íà ñïèñêè:
∙ èíäåêñèðîâàíèå
g = [1 , 2 , 3 , ’ February ’ , [6 , 7 , 8]]
print ( g [1]) # программа выведет целое число 2
print ( g [ len ( g ) - 1]) # программа выведет список [6 , 7 , 8]
print ( g [ -2]) # программа выведет строку ’ February ’
∙ îïåðàöèÿ in
g = [1 , 2 , 3 , 4]
print (1 in g ) # программа выведет True
print ([1] in g ) # программа выведет False ,
# т . к . список g не содержит ни одного элемента типа список
print ([1 , 2] in g ) # программа выведет False , аналогично предыдущему примеру
ГЛАВА 4. СПИСКИ, ФУНКЦИЯ RANGE, ОПЕРАТОР ЦИКЛА FOR (ПРОДОЛЖЕНИЕ) 20
∙ ñå÷åíèÿ (ñðåçû)
t = [4 , 6 , 8 , -1 , 4 , 5 , 9 , 12 , -7 , 0 , -3]
print ( t [:4]) # [4 , 6 , 8 , -1]
print ( t [8:]) # [ -7 , 0 , -3]
print ( t [3:5]) # [ -1 , 4]
print ( t [:: -2]) # [ -3 , -7 , 9 , 4 , 8 , 4]
Âàæíîå îòëè÷èå ñïèñêîâ îò ñòðîê çàêëþ÷àåòñÿ â òîì, ÷òî ñïèñêè ìîæíî èçìåíÿòü êàê åãî îòäåëüíûå ýëåìåíòû,
òàê è ïåðå÷åíü ñàìèõ ýëåìåíòîâ (äîáàâëÿòü, óäàëÿòü ýëåìåíòû èç ïîñëåäîâàòåëüíîñòè è ò.ï.). Íèæå óêàçàíû íåêîòîðûå
òàêèå îïåðàöèè:
∙ èçìåíåíèå ýëåìåíòà ñïèñêà ñ çàäàííûì èíäåêñîì:
g = [1 , 2 , 3 , 4]
g [1] = 6
print ( g ) # программа выведет [1 , 6 , 3 , 4]
Âàæíî ïîíèìàòü ðàçíèöó ìåæäó èçìåíåíèåì ñðåçà è èçìåíåíèåì îòäåëüíîãî çíà÷åíèÿ ñïèñêà.  ïåðâîì ñëó÷àå
èçìåíÿåòñÿ íåêîòîðîå ìíîæåñòâî ýëåìåíòîâ ñïèñêà (âîçìîæíî, ñîñòîÿùåå èç îäíîãî ýëåìåíòà) è â ïðàâîé ÷àñòè
îïåðàòîðà ïðèñâàèâàíèÿ ìîæåò áûòü òîëüêî ïîñëåäîâàòåëüíîñòü ýëåìåíòîâ (ò.å. èëè ñðåç êàêîãî-òî ñïèñêà èëè
âåñü ñïèñîê).  ïðèâåä¼ííûõ íèæå ïðèìåðàõ (â êîììåíòàðèè ê êàæäîé ñòðîêå êîäà) óêàçàíî çíà÷åíèå ñïèñêà t
ïîñëå î÷åðåäíîé îïåðàöèè ïðèñâàèâàíèÿ:
t = [1 , 2 , 3 , 4]
r = [5 , 6 , 7 , 8]
t [1:3] = r [1:3] # [1 , 6 , 7 , 4]
t [:2] = r [2:] # [7 , 8 , 7 , 4]
t [:2] = r [3] # ошибка : попытка присвоить срезу списка t ОДНО значение ,
# а не последовательность значений
t [1:2] = r [3] # ошибка : в левой части оператора присваивания по - прежнему срез
# хоть и состоящий из одного элемента
q = t [0] + r [:2] # ошибка : пытаясь создать новый список q ,
# состоящий из нулевого элемента списка t и двух первых элементов
# списка r применяем операцию конкатенации
# к числу ( t [0]) и списку ( r [:2])
t [2:3] = r [3:] # [7 , 8 , 8 , 4]
t [1]= 99 # [7 , 99 , 8 , 4]
t [2] = [9 , 6 , 7] # [7 , 99 , [9 , 6 , 7] , 4]
t.append(elem)
Ïðèìåð:
# программа считывает последовательность чисел указанной длины
# и сохраняет элементы в списке
k = input ( ’k : ’)
t = []
i = 0
while i < k :
t = input ( ’ element ␣ ’ + str ( i ) + ’: ’)
t . append ( t )
i = i + 1
print ( t )
Ðàçíèöà ìåæäó êîíêàòåíàöèåé è äîáàâëåíèåì ýëåìåíòà ñëåäóþùàÿ: â ïåðâîì ñëó÷àå ýòî ñîçäàíèå íîâîãî çíà÷åíèÿ
è ïðèñâàèâàíèå ýòîãî íîâîãî çíà÷åíèÿ ïåðåìåííîé, âî âòîðîì ñëó÷àå ýòî изменение
òåêóùåãî çíà÷åíèÿ. Òàê
÷òî êîíêàòåíàöèÿ îïðåäåëåíà è äëÿ ñòðîê è äëÿ ñïèñêîâ, à äîáàâëåíèå ýëåìåíòà òîëüêî äëÿ ñïèñêîâ.
ГЛАВА 4. СПИСКИ, ФУНКЦИЯ RANGE, ОПЕРАТОР ЦИКЛА FOR (ПРОДОЛЖЕНИЕ) 21
<t>.pop()
Îïåðàöèÿ pop() èìååò âîçâðàùàåìîå çíà÷åíèå ýëåìåíò, êîòîðûé áûë óäàë¼í. Ïðèìåð èñïîëüçîâàíèÿ:
# удаление всех нулевых значений из конца списка
t = [3 , 4 , 5 , 0 , 3 , 2 , 0 , 0 , 0]
k = len ( t ) - 1
while k >= 0 and t [ k ] == 0:
t . pop ()
k -= 1
print ( t )
Ïîñëåäíèå äâå îïåðàöèè íåñêîëüêî îòëè÷àþòñÿ ñïîñîáîì çàïèñè îò èçó÷åííûõ äî ñèõ ïîð îïåðàöèé è ôóíêöèé.
Òàêèå îïåðàöèè íàçûâàþòñÿ ìåòîäàìè ýòî ôóíêöèè, ïðèìåíèìûå ê çíà÷åíèÿì îïðåäåë¼ííîãî òèïà.  ÷àñòíîñòè,
append() è pop() ìåòîäû, ïðèìåíèìûå ê ñïèñêàì.  îáùåì ñëó÷àå ñèíòàêñèñ âûçîâà ìåòîäà òàêîâ:
<переменная>.<имя метода>(<перечень аргументов>)
Ìîæíî ñ÷èòàòü, ÷òî ìåòîä ýòî ôóíêöèÿ, êóäà íåÿâíî ïåðåäà¼òñÿ â êà÷åñòâå àðãóìåíòà <переменная>. Òàêàÿ
ôóíêöèÿ ìîæåò èçìåíÿòü çíà÷åíèå ýòîé ïåðåìåííîé è ìîæåò âîçâðàùàòü çíà÷åíèå (êàê, íàïðèìåð, ìåòîä pop()) èëè
íå âîçâðàùàòü, à òîëüêî èçìåíÿòü ïåðåäàâàåìûé àðãóìåíò (êàê ìåòîä append()). Åù¼ íåñêîëüêî ïðèìåðîâ, èëëþñòðè-
ðóþùèõ èñïîëüçîâàíèå append() è pop():
t = [1 , 3 , 4 , 5 , 6 , 7]
t . append (99)
print ( t ) # программа выведет [1 , 3 , 4 , 5 , 6 , 7 , 99]
print ( t . pop ()) # программа выведет 99
print ( t . pop ()) # программа выведет 7
print ( t ) # программа выведет [1 , 3 , 4 , 5 , 6]
 ãëàâå 8 áóäóò ïåðå÷èñëåíû îñíîâíûå ôóíêöèè è ìåòîäû, âñòðîåííûå â ÿçûê Python.
Ñëåäóþùèé ôðàãìåíò ïðîãðàììû èëëþñòðèðóåò íàèáîëåå ñëîæíóþ äëÿ íîâè÷êîâ îñîáåííîñòü ÿçûêà Python:
a = [1 , 2 , 3]
print ( a ) # программа выведет [1 , 2 , 3]
b = a
a [0] = 99
print ( b ) # программа выведет [99 , 2 , 3] , хотя изменяли список a
Ïîäðîáíåå îá ýòîé îñîáåííîñòè èçìåíÿåìûõ îáúåêòîâ (è ñïèñêîâ â ÷àñòíîñòè) íàïèñàíî â Ãëàâå 10. Êðîìå òî-
ãî, ïîäðîáíîå èçëîæåíèå ñîäåðæèòñÿ â [1], ãëàâà "Èíòåðëþäèÿ î äèíàìè÷åñêîé òèïèçàöèè ïàðàãðàôû Ðàçäåëÿåìûå
”
ññûëêè“ è â ïàðàãðàôå 10.3 "Ðàçäåëÿåìûå ññûëêè è èçìåíÿåìûå îáúåêòû".
Çäåñü ëèøü ïðèâåä¼ì äâà ñïîñîáà ñäåëàòü êîïèþ ñïèñêà òàêèì îáðàçîì, ÷òîá èçìåíåíèÿ îäíîãî íå ïðèâîäèëè ê
èçìåíåíèþ äðóãîãî.
a = [1 , 2 , 3]
print ( a ) # программа выведет [1 , 2 , 3]
x = a [:] # копия x создана срезом , содержащим ВСЕ элементы списка a
y = list ( a ) # копия y создана встроенной функцией list ()
a [0] = 99 # изменение " оригинала "
print ( x ) # программа выведет [1 , 2 , 3]
print ( y ) # программа выведет [1 , 2 , 3]
range([start,] stop[,step])
Ïàðàìåòðû start, stop, step öåëûå ÷èñëà (𝑠𝑡𝑒𝑝 ̸= 0).
Ðåçóëüòàò âûïîëíåíèÿ ôóíêöèè range ïðè ïîëîæèòåëüíîì (îòðèöàòåëüíîì) çíà÷åíèè ïàðàìåòðà step ïîñëåäî-
âàòåëüíîñòü öåëûõ ÷èñåë, ýëåìåíòîâ àðèôìåòè÷åñêîé ïðîãðåññèè {𝑎𝑛 } ñ íà÷àëüíûì ýëåìåíòîì, ðàâíûì ÷èñëó start,
ñ ðàçíîñòüþ step è òàêèõ, ÷òî 𝑠𝑡𝑎𝑟𝑡 6 𝑎𝑖 < 𝑠𝑡𝑜𝑝 (𝑠𝑡𝑜𝑝 6 𝑎𝑖 < 𝑠𝑡𝑎𝑟𝑡).
ГЛАВА 4. СПИСКИ, ФУНКЦИЯ RANGE, ОПЕРАТОР ЦИКЛА FOR (ПРОДОЛЖЕНИЕ) 22
Åñëè óêàçàíû òîëüêî äâà ïàðàìåòðà, òî ñ÷èòàåòñÿ, ÷òî ïåðâûé ýòî start, à âòîðîé stop, ïàðàìåòð step ðàâåí
1.
Åñëè óêàçàí îäèí ïàðàìåòð, ñ÷èòàåòñÿ, ÷òî ýòî ïàðàìåòð stop, à ïàðàìåòðû start è step ïî óìîë÷àíèþ ïðèíèìà-
þòñÿ ðàâíûìè 0 è 1 ñîîòâåòñòâåííî.
Ïðèìåðû:
range (10) # последовательность --- [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9]
range (10 , 2) # последовательность --- [] # т . к . предполагается , что
# указаны параметры start =10 , stop =2 , step =1
range (2 , 5) # последовательность --- [2 , 3 , 4]
range (3 , 20 , 2) # последовательность --- [3 , 5 , 7 , 9 , 11 , 13 , 15 , 17 , 19]
range ( -5 , -2) # последовательность --- [ -5 , -4 , -3]
range (1) # последовательность --- [0]
range (3 , 4 , 2) # результат --- [3]
range ( -1 , -1 , -7) # последовательность --- [ -1]
range (10 , 7 , -4) # последовательность --- []
range (0 , 20 , 20) # последовательность --- [0]
range (10 , 10 , 10) # последовательность --- []
range (13 , -4) # последовательность --- []
Ïðèìåðû èñïîëüçîâàíèÿ:
# вывод всех целых чисел от a до b включительно
a = int ( input ())
b = int ( input ())
for i in range (a , b +1):
print (i , end = ’␣ ’)
t = []
for i in range ( int ( input ( ’k : ’ ))):
t . append ( int ( input ( ’ element ␣ ’+ str ( i )+ ’: ’ ))) # ввод элементов списка
s += t [ i ]
print ( s )
Ôóíêöèÿ random() âîçâðàùàåò ñëó÷àéíîå âåùåñòâåííîå ÷èñëî íà ïîëóèíòåðâàëå [0.0, 1.0). Ôóíêöèÿ random() íå ÿâëÿ-
åòñÿ ñòàíäàðòíîé ôóíêöèåé ÿçûêà Python, äëÿ å¼ èñïîëüçîâàíèÿ íåîáõîäèìî ïîäêëþ÷èòü îäíîèì¼ííûé ìîäóëü random
è ðàçðåøèòü èñïîëüçîâàíèå ñîîòâåòñòâóþùåé ôóíêöèè èç íåãî. Äåëàåòñÿ ýòî òàêîé ñòðî÷êîé:
from random import random
Ýòó ñòðî÷êó ëó÷øå ïîìåñòèòü â ïåðâîé ñòðî÷êå ôàéëà, ñîäåðæàùåãî ïðîãðàììó. Íèæå ïðèâîäèòñÿ íåñêîëüêî
ïðèìåðîâ èñïîëüçîâàíèÿ ôóíêöèè random():
from random import random
t = []
# создаём список из 10 случайных вещественных чисел в полуинтервале [0.0 , 1.0)
for i in range (10):
t . append ( random ())
Êàê, èñïîëüçóÿ ñïèñêè, ïðåäñòàâèòü, íàïðèìåð, øàõìàòíóþ äîñêó èëè ïîëå äëÿ èãðû â êðåñòèêè-íîëèêè?
Êàê ìû ïîìíèì, ýëåìåíòàìè ñïèñêà ìîãóò áûòü ñàìè ñïèñêè. Òàêèå ñïèñêè íàçûâàþòñÿ âëîæåííûìè.
Íèæå óêàçàí âàðèàíò èíòåðïðåòàöèè ïîëÿ äëÿ èãðû â êðåñòèêè-íîëèêè, ãäå ïóñòîå ïîëå îáîçíà÷åíî íóë¼ì, êðåñòèê
÷èñëîì 1, à íîëèê ÷èñëîì −1. Êðåñòèêè íà÷èíàëè. Êòî âûèãðàë è íà êàêîì õîäó?
field = [[1 , 0 -1] , [ -1 , 1 , -1] , [0 , 0 , 1]]
Êàêèì îáðàçîì îáðàùàòüñÿ ê ýëåìåíòàì âëîæåííûõ ñïèñêîâ?
field = [[1 , 0 -1] , [ -1 , 1 , -1] , [0 , 0 , 1]]
print ( field [1]) # элемент списка field с индексом 1 это список [ -1 , 1 , 1]
print ( field [1][0]) # а элемент с индексом 0 списка [ -1 , 1 , 1] это число -1
Òàêèì îáðàçîì, åñëè ïðåäñòàâèòü, ÷òî âëîæåííûé ñïèñîê âûïèñûâàåòñÿ ïîñòðî÷íî, òî ïðè îáðàùåíèè ê êîíêðåò-
íîìó ýëåìåíòó ñíà÷àëà óêàçûâàåòñÿ èíäåêñ ñòðîêè, à çàòåì èíäåêñ ñòîëáöà.
Íèæå ïðèâîäÿòñÿ ïðèìåðû ñîçäàíèÿ òàêèõ ñïèñêîâ è èõ îáðàáîòêè.
Îáðàòèòå âíèìàíèå, ÷òî â ýòîì ôðàãìåíòå ñîâåðøåííî íåâàæíî ñêîëüêî ñòðîê è ñòîëáöîâ ñîäåðæèòñÿ âî ââî-
äèìîé òàáëèöå. Áîëåå òîãî, êîððåêòíî ñ÷èòàåòñÿ íàáîð ñ ðàçíûì êîëè÷åñòâîì ÷èñåë â ðàçíûõ ñòðîêàõ òàáëèöû,
íàïðèìåð òàêîé:
1 2 3
5
3 4 5 66 -9
-5 -6
Îáðàòèòå âíèìàíèå, ÷òî â îïðåäåëåíèè ñïèñêà x ó÷àñòâóåò t[:], ò.å. êîïèÿ ñïèñêà t, à íå ñàì ñïèñîê t. Ïîäðîáíåå
î êîïèðîâàíèè ñïèñêîâ ñì. Ãëàâó 10.
0 0 0 0 0 1 1 0 0 0
0 0 0 0 0 1 1 1 0 0
0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 0 1 1
x [0][0] = 1
for i in range (1 , n ):
x [i -1][ i ] , x [ i ][ i ] , x [ i ][ i -1] = 1 , 1 , 1
Кортежи
Êîðòåæè (tuple), êàê è ñïèñêè óïîðÿäî÷åííûå ïîñëåäîâàòåëüíîñòè ýëåìåíòîâ ïðîèçâîëüíîé ïðèðîäû. Ðàçíèöà
ëèøü â òîì, ýòè ïîñëåäîâàòåëüíîñòè неизменяемые
. Ýòî îçíà÷àåò, ÷òî ìû íå óìååì äîáàâëÿòü ýëåìåíòû â êîðòåæ,
óäàëÿòü èõ îòòóäà è èçìåíÿòü ýòè ýëåìåíòû. Âïðî÷åì, ïîñëåäíåå (èçìåíåíèå ýëåìåíòîâ) òðåáóåò óòî÷íåíèÿ, êîòîðîå
áóäåò äàíî íèæå.
∙ êîðòåæè íåèçìåíÿåìûå ïîñëåäîâàòåëüíîñòè, ò.å. ïîñëå ñîçäàíèÿ êîðòåæà íåëüçÿ äîáàâëÿòü è óäàëÿòü åãî
ýëåìåíòû, à òàêæå èçìåíÿòü èõ;
Çíà÷åíèÿ êîðòåæåé çàäàþòñÿ ïðè ïîìîùè ïåðå÷èñëåíèÿ ÷åðåç çàïÿòóþ åãî ýëåìåíòîâ, âçÿòûõ â êðóãëûå ñêîáêè.
a = () # пустой кортеж
b = (2 , 4) # кортеж из двух элементов
c = (2 , ’ spam ’ , -1.678)# элементы кортежа могут быть разных типов
d = ( ’ abc ’) # ! кортеж , состоящий из одного элемента , задаётся не так ,
# здесь в правой части оператора присваивания
# на самом деле стоит ОДНА строка ’ abc ’, взятая в скобки
e = ( ’ abc ’ ,) # а так правильно
# обязательна запятая после единственного элемента
f = ((3 , 4) , [5 , ’ abc ’ ]) # вложенный кортеж - его элементами могут быть любые значения
print ( f [1] , f [0][1]) # [5 , ’ abc ’] 4
Òðåáîâàíèå äëÿ êîðòåæà èç îäíîãî ýëåìåíòà ñîäåðæàòü çàïÿòóþ âîçíèêàåò îòòîãî, ÷òî êðóãëûå ñêîáêè (â îòëè÷èå
îò, íàïðèìåð, êâàäðàòíûõ èëè ôèãóðíûõ) íàäåëåíû â ñèíòàêñèñå ÿçûêà Python ñìûñëîì, íå ñâÿçàííûì ñ êîðòåæàìè
îíè îïðåäåëÿþò ïîðÿäîê âûïîëíåíèÿ îïåðàöèé â âûðàæåíèÿõ. Ïîýòîìó âûðàæåíèå, âçÿòîå â êðóãëûå ñêîáêè,
âîñïðèíèìàåòñÿ êàê "âûðàæåíèå, âçÿòîå â êðóãëûå ñêîáêè à íå êàê ïîñëåäîâàòåëüíîñòü èç îäíîãî ýëåìåíòà.
Ñîçäàíèå êîðòåæà èç ïîñëåäîâàòåëüíîñòè ñòðîêè èëè ñïèñêà:
g = tuple ( ’ abcd ’) # результат выполнения : ( ’ a ’, ’b ’, ’c ’, ’d ’)
g = tuple ( ’ abc123 ’) # результат выполнения : ( ’ a ’,’b ’,’c ’ , ’1 ’ , ’2 ’ , ’3 ’)
g = tuple ([3 , 4 , ’ abc ’ ]) # результат выполнения : (3 , 4 , ’ abc ’)
∙ Êîíêàòåíàöèÿ
с = (1 , 2) + (3 , 4) # создание нового кортежа : с = (1 , 2 , 3 , 4)
∙ Èíäåêñèðîâàíèå è ñðåçû
d = (1 , 3 , 5 , 7 , 9)
t = ( d [0] , d [2:4]) # t = (1 , (5 , 7))
Íî ýëåìåíòû êîðòåæåé, êîòîðûå ñàìè ÿâëÿþòñÿ èçìåíÿåìûìè îáúåêòàìè (íàïðèìåð, ñïèñêàìè), èçìåíÿòü ìîæíî:
d = (1 , 3 , [5 , 7])
d [2] = [1 , 2] # Ошибка ! нельзя заменять элемент кортежа другим элементом
d [2] = [5 , 7] # и даже так нельзя : списки хоть и содержат одинаковые элементы ,
# но представляют собой разные объекты ( разные области памяти )
d [2][0] = 1 # здесь мы меняем содержимое списка
d [2][1] = 2
print ( d ) # (1 , 3 , [1 , 2])
Ïîäðîáíåå îá èçìåíÿåìûõ è íåèçìåíÿåìûõ îáúåêòàõ ñì. Ãëàâó 10, îá èñïîëüçîâàíèè êîðòåæåé â îïðåäåëåíèè ôóíêöèé
ñì. Ãëàâó 11.
∙ ìíîæåñòâåííîå ïðèñâàèâàíèå: a, b = b, a
∙ êîðòåæè (êàê íåèçìåíÿåìûå îáúåêòû, íàðÿäó ñ ÷èñëàìè è ñòðîêàìè) èñïîëüçóþòñÿ â êà÷åñòâå êëþ÷åé â ñëîâàðÿõ
(ñì. ãëàâó 6);
∙ åñëè âû ðàáîòàåòå ñ äàííûìè, êîòîðûå íå ïðåäïîëàãàåòñÿ èçìåíÿòü â ïðîöåññå îáðàáîòêè, òî èñïîëüçîâàíèå êîð-
òåæåé àâòîìàòè÷åñêè çàùèùàåò èõ îò ñëó÷àéíîãî èçìåíåíèÿ (è ïîñëåäóþùåãî ïîèñêà îøèáêè). Ïðèìåðîì ìîãóò
ñëóæèòü àëãîðèòìû âû÷èñëèòåëüíîé ãåîìåòðèè, ðàáîòàþùèå ñ òî÷êàìè êàê ïàðàìè èõ äåêàðòîâûõ êîîðäèíàò.
Глава 6
Словари
Ñëîâàðü ñîçäà¼òñÿ ïðè ïîìîùè ôèãóðíûõ ñêîáîê è ïåðå÷èñëåíèÿ ïàð ключ:значение.  ñëîâàðÿõ ñóùåñòâóåò îãðàíè-
÷åíèå íà òèï êëþ÷åé ýòî ìîãóò áûòü òîëüêî çíà÷åíèÿ íåèçìåíÿåìîãî òèïà: öåëûå ÷èñëà, ñòðîêè è êîðòåæè.
# пустой словарь
d = {}
# словарь задан при помощи встроенной функции zip и двух списков : ключей и значений
# функция zip " сшивает " два списка , первый из которых содержит ключи , второй - значения
key_list = [ ’ Dan ’ , ’ John ’ , ’ Mary ’ , ’ Claire ’]
value_list = [ ’ 7926765431 ’ , ’ 74991234567 ’ , ’ 79037162534 ’ , ’ 74957654321 ’]
phone = dict ( zip ( key_list , value_list ))
Ñîçäàäèì ñëîâàðü:
phone = { ’ Dan ’: ’ 7926765431 ’ , ’ Mary ’: ’␣ 79037162534 ’}
print ( phone1 )
# { ’ Daniel ’: ’7926765431 ’ , ’ John ’: ’74775566221 ’ , ’ Dan ’: ’7926765431 ’}
Ðàáîòàåò îí òàê: âñå êëþ÷è ñëîâàðÿ phone2, êîòîðûõ íåò â ñëîâàðå phone1 äîáàâëÿþòñÿ òóäà âìåñòå ñî ñâîèìè
çíà÷åíèÿìè. Çíà÷åíèÿ îáùèõ äëÿ îáîèõ ñëîâàðåé êëþ÷åé çàìåíÿþòñÿ íà çíà÷åíèÿ èç ñëîâàðÿ phone2.
Äðóãèå ïðèìåðû èñïîëüçîâàíèÿ ñëîâàðåé:
# подсчёт количества вхождения разных слов в данной строке
s = input ( ’s : ’)
d = dict ()
for x in s . split ():
if x in d :
d [ x ] += 1
else :
d[x] = 1
print ( d )
Òî æå ñàìîå ìîæíî çàïèñàòü êîðî÷å, èñïîëüçóÿ ìåòîä get:
s = input ( ’s : ’)
d = dict ()
for x in s . split ():
d [ x ] = d . get (x , 0) + 1
print ( d )
# s : to be or not to be
# { ’ to ’: 2 , ’ or ’: 1 , ’ not ’: 1 , ’ be ’: 2}
Òåïåðü, åñëè íóæíî â êà÷åñòâå êëþ÷åé ñëîâàðÿ èìåòü íå ñëîâà, à èõ ÷àñòîòû (êîëè÷åñòâî âõîæäåíèé), ìîæíî
"èíâåðòèðîâàòü"ñëîâàðü (êëþ÷è ÷àñòîòû, çíà÷åíèÿ ñëîâà, âñòðå÷àþùèåñÿ ñîîòâåòñòâóþùåå êîëè÷åñòâî ðàç):
def invert_dict ( d ):
inv = dict ()
for key in d :
val = d [ key ]
if val not in inv :
inv [ val ] = [ key ]
ГЛАВА 6. СЛОВАРИ 30
else :
inv [ val ]. append ( key )
return inv
s = input ( ’s : ’) # to be or not to be
d = {}
for x in s . split ():
d [ x ] = d . get (x , 0) + 1
# словарь d ={ ’ not ’: 1 , ’ to ’: 2 , ’ or ’: 1 , ’ be ’: 2}
print ( invert_dict ( d )) # {1: [ ’ not ’, ’ or ’] , 2: [ ’ to ’, ’ be ’]}
Глава 7
Множества
Ìíîæåñòâî â ÿçûêå Python òèï äàííûõ â òî÷íîñòè ñîâïàäàþùèé ñ îäíîèì¼ííûì ìàòåìàòè÷åñêèì ïîíÿòèåì. Êàê
è ñëîâàðü, ìíîæåñòâî ÿâëÿåòñÿ íåóïîðÿäî÷åííîé ïîñëåäîâàòåëüíîñòüþ ýëåìåíòîâ. Òàêèì îáðàçîì, âñå îïåðàöèè, ñâÿ-
çàííûå ñ ïîðÿäêîì ñëåäîâàíèÿ ýëåìåíòîâ (èíäåêñèðîâàíèå, ñðåçû, êîíêàòåíàöèÿ) ê ìíîæåñòâàì íåïðèìåíèìû.
 ÿçûêå Python ñóùåñòâóåò äâå ðàçíîâèäíîñòè ìíîæåñòâ èçìåíÿåìûå (set) è íåèçìåíÿåìûå (frozenset). Ïî-
äðîáíåå î ðàçíèöå èçìåíÿåìûõ è íåèçìåíÿåìûõ òèïîâ ñì. ïàðàãðàô 10.3.
∙ Ðàçíîñòü ìíîæåñòâ
A = {1 , 2 , 3 , 4 , 5 , 6 , 7}
B = {5 , 6}
C = {2 , 1 , 5}
print ( A . difference ( C )) # {3 , 4 , 6 , 7}
print ( A - B - C ) # {3 , 4 , 7}
Ìíîãèå èç ïåðå÷èñëåííûõ â ýòîé ãëàâå ôóíêöèé áûëè îïèñàíû âûøå. Òåì íå ìåíåå, çäåñü äà¼òñÿ èõ ôîðìàëüíîå
îïðåäåëåíèå è ïðèìåðû èõ èñïîëüçîâàíèÿ. Îðèãèíàë íà àíãëèéñêîì ÿçûêå ìîæíî íàéòè çäåñü:
Ïî÷åìó â ïîñëåäíåé ñòðîêå ðåçóëüòàò ðàâåí íå 2.68? Äåëî â òîì, ÷òî äâîè÷íîå ïðåäñòàâëåíèå ÷èñëà 2.675 ÿâëÿåòñÿ
ïðèáëèæ¼ííûì è âûðàæåííîå â äåñÿòè÷íîé ñèñòåìå ñ÷èñëåíèÿ ðàâíî:
2.67499999999999982236431605997495353221893310546875
×òîáû óçíàòü èñòèííîå ïðåäñòàâëåíèå âåùåñòâåííîãî ÷èñëà, ìîæíî âîñïîëüçîâàòüñÿ ôóíêöèåé Decimal èç ìî-
äóëÿ decimal:
print ( Decimal (44)) # 44 для целых чисел результат равен самому числу
print ( Decimal (3.5)) # 3.5 для некоторых вещественных - тоже
print ( Decimal (3.55)) # 3.54999999999999982236431605997495353221893310546875
∙ ôóíêöèÿ abs(x)
Âîçâðàùàåò ìîäóëü ïåðåäàííîãî â êà÷åñòâå ïàðàìåòðà ÷èñëà.
print ( abs ( -3)) # 3
print ( abs (0.5)) # 0.5
∙ ôóíêöèÿ len(t)
Âîçâðàùàåò äëèíó ïîñëåäîâàòåëüíîñòè t, êîòîðàÿ ìîæåò áûòü ñòðîêîé, ñïèñêîì, êîðòåæåì, ñëîâàð¼ì, ìíîæå-
ñòâîì.
print ( len ( ’ abcd ’ )) # 4
print ( len ([])) # 0
# обратите внимание , как вычисляется len у вложенных последовательностей
print ( len ((2 , ’ string ’ , (2 , ’ tuple ’ )))) # 3
∙ ìåòîä x.count(a)
Âîçâðàùàåò êîëè÷åñòâî ýëåìåíòîâ ïîñëåäîâàòåëüíîñòè x, ðàâíûõ a.
print ( ’ kldajfhwfgnwegwegvwnrtgh ’. count ( ’h ’ )) # 2
print ([[1 ,2 ,3] , [3] , 3]. count (3)) # 1
print ([[1 ,2 ,3] , [3] , 3]. count ([3])) # 1
print (([1 ,2 ,3] , [3] , 3). count ([1 , 2])) # 0
∙ ìåòîä t.append(x)
Ìåòîä äîáàâëÿåò â êîíåö ñïèñêà t ýëåìåíò x. Ìåòîä append íå âîçâðàùàåò çíà÷åíèÿ, òîëüêî èçìåíÿåò ñïèñîê t.
t = [1 , 2 , 3]
t . append (5)
print ( t ) # [1 , 2 , 3 , 5]
t . append ([9])
print ( t ) # [1 , 2 , 3 , 5 , [9]]
∙ ìåòîä t.insert(i, x)
Âñòàâëÿåò ýëåìåíò x â i-þ ïîçèöèþ ñïèñêà t. Ìåòîä insert íè÷åãî íå âîçâðàùàåò.
t = [4 , 9 , 5 , 4 , -7 , 1]
t . insert (3 , 200)
print ( t ) # [4 , 9 , 5 , 200 , 4 , -7 , 1]
∙ ìåòîä t.extend(x)
Äîáàâëÿåò ñïèñîê x â êîíåö ñïèñêà t. Âîçâðàùàåò èçìåí¼ííûé ñïèñîê t. Äåéñòâèå àíàëîãè÷íî îïåðàöèè
t = t + x, íî âûïîëíÿåòñÿ áûñòðåå êîíêàòåíàöèè.
t = [4 , 9 , 4 , -7 , 1]
t . extend (5) # ошибка ! 5 - число , а не список
t . extend ([5 , 99])
print ( t ) # [4 , 9 , 4 , -7 , 1 , 5 , 99]
∙ ìåòîä t.pop(i)
Ìåòîä óäàëÿåò i-é ýëåìåíò ñïèñêà t è âîçâðàùàåò ýòîò ýëåìåíò.
t = [7 , 8 , 3 , 0 , 7 , -6]
x = t . pop (4)
print (x , t ) # 7 [7 , 8 , 3 , 0 , -6]
x = t . pop ()
print (x , t ) # -6 [7 , 8 , 3 , 0]
Îáðàòèòå âíèìàíèå, ÷òî ïàðàìåòð i ìåòîäà pop ÿâëÿåòñÿ íåîáÿçàòåëüíûì. Åñëè îí íå óêàçàí, òî ñ÷èòàåòñÿ, ÷òî
óäàëÿåòñÿ ïîñëåäíèé ýëåìåíò.
Åñëè ñïèñîê ïóñò, ïðîèçîéä¼ò îøèáêà.
∙ îïåðàòîð del x
Äåéñòâèå îïåðàòîðà del òàêîå æå, êàê è ìåòîäà t.pop(x), íî â îòëè÷èå îò ìåòîäà pop îïåðàòîð del íå âîçâðàùàåò
íèêàêîãî çíà÷åíèÿ.
t = [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8]
del t [4]
print ( t ) # [1 , 2 , 3 , 4 , 6 , 7 , 8]
del t [5:]
print ( t ) # [1 , 2 , 3 , 4 , 6]
∙ ìåòîä t.remove(x)
Óäàëÿåò ïåðâîå âõîæäåíèå ýëåìåíòà x èç ñïèñêà t. Àíàëîãè÷íî îïåðàöèè del t[t.index(x)]
∙ ìåòîä t.reverse()
Ðàçâîðà÷èâàåò ñïèñîê t, ìåíÿÿ ïîðÿäîê ñëåäîâàíèÿ ýëåìåíòîâ íà ïðîòèâîïîëîæíûé. Íå âîçâðàùàåò çíà÷åíèÿ.
t = [1 , 2 , 3]
t . reverse ()
print ( t ) # [3 ,2 ,1]
– ïàðàìåòð cmp: èìÿ ôóíêöèè îò äâóõ ïàðàìåòðîâ, âîçâðàùàþùåé îòðèöàòåëüíîå ÷èñëî, íóëü èëè ïîëîæè-
òåëüíîå ÷èñëî â çàâèñèìîñòè îò òîãî, ÿâëÿåòñÿ ëè ïåðâûé ïàðàìåòð ìåíüøå âòîðîãî, ðàâåí âòîðîìó, áîëüøå
âòîðîãî.
Íàïðèìåð, ìû ìîæåì ñîðòèðîâàòü öåëûå ÷èñëà ïî ñóììå öèôð èõ äåñÿòè÷íîé çàïèñè.
– ïàðàìåòð key: èìÿ ôóíêöèè îò îäíîãî àðãóìåíòà, êîòîðàÿ âûçûâàåòñÿ ïåðåä òåì, êàê âûïîëíÿòü ñðàâíåíèå.
Òàêîé ïðè¼ì óäîáåí ïðè ñîðòèðîâêå ïîñëåäîâàòåëüíîñòåé (ñòðîê, êîðòåæåé èëè ñïèñêîâ), êîãäà íàäî óêàçàòü
èíäåêñ ýëåìåíòà ïîñëåäîâàòåëüíîñòè, ïî êîòîðîìó íàäî ñîðòèðîâàòü ñàìè ïîñëåäîâàòåëüíîñòè.
Íàïðèìåð, åñòü t ñïèñîê êîðòåæåé, óñòðîåííûõ ñëåäóþùèì îáðàçîì: (èìÿ, ôàìèëèÿ, ñðåäíÿÿ îöåíêà,
êëàññ). Äëÿ ñîðòèðîâêè òàêèõ êîðòåæåé ïî ñðåäíåé îöåíêå äîñòàòî÷íî óêàçàòü ôóíêöèþ, âîçâðàùàþùóþ
îäíî çíà÷åíèå: 2-é ýëåìåíò ñâîåãî àðãóìåíòà.
– ïàðàìåòð reverse: åñëè îí ðàâåí True, òî ðåçóëüòàò ñðàâíåíèé ýëåìåíòîâ çàìåíÿåòñÿ íà îáðàòíûé.
Íèæå ïðèâåäåíû ðåçóëüòàòû ñðàâíåíèÿ ðàçíûõ ñïîñîáîâ âûçîâà ìåòîäà t.sort() äëÿ ñïèñêîâ èç n êîðòåæåé
(ñïèñîê t) èëè öåëûõ ÷èñåë (ñïèñîê q). Ñòîèò ïîìíèòü î òîì, ÷òî èñïîëüçîâàíèå ïàðàìåòðà key
n = 10
t = [ randint (0 , 9) , randint (0 , 9)) for i in range ( n )]
q = [ randint (0 , 99) for i in range ( n )]
print ( t )
print q
def cmp_point (a , b ):
if a [0] < b [0]:
return -1
if a [0] == b [0] and a [1] < b [1]:
return -1
if a [1] == b [1]:
return 0
return 1
def cmp_sum ( a ):
return sum ( a )
def cmp_first ( x ):
return x [1]
def cmp_digitsum ( a ):
s = 0
while a >0:
s += a % 10
a = a // 10
return s
# результаты сортировок
[(5 , 0) , (2 , 0) , (7 , 0) , (6 , 1) , (6 , 1) , (0 , 3) , (5 , 4) , (3 , 5) , (9 , 7) , (9 , 7)]
[(2 , 0) , (0 , 3) , (5 , 0) , (7 , 0) , (6 , 1) , (6 , 1) , (3 , 5) , (5 , 4) , (9 , 7) , (9 , 7)]
[30 , 3 , 55 , 65 , 92 , 49 , 67 , 94 , 49 , 99]
∙ ìåòîä str.capitalize()
Ìåòîä âîçâðàùàåò êîïèþ ñòðîêè str, ïåðâûé ñèìâîë êîòîðîé íàáðàí â âåðõíåì ðåãèñòðå, à âñå îñòàëüíûå â
íèæíåì. Ñèìâîëû, îòëè÷íûå îò ëàòèíñêèõ áóêâ, îñòàþòñÿ áåç èçìåíåíèÿ.
ГЛАВА 8. ВСТРОЕННЫЕ ФУНКЦИИ И МЕТОДЫ 38
∙ ìåòîä str.isalnum()
Âîçâðàùàåò True, åñëè âñå ñèìâîëû íåïóñòîé ñòðîêè ýòî áóêâû èëè öèôðû, False â ïðîòèâíîì ñëó÷àå.
∙ ìåòîä str.isalpha()
Âîçâðàùàåò True, åñëè âñå ñèìâîëû íåïóñòîé ñòðîêè ýòî áóêâû, False â ïðîòèâíîì ñëó÷àå.
∙ ìåòîä str.isdigit()
Âîçâðàùàåò True, åñëè âñå ñèìâîëû íåïóñòîé ñòðîêè ýòî öèôðû, False â ïðîòèâíîì ñëó÷àå.
∙ ìåòîä str.islower()
Âîçâðàùàåò True, åñëè âñå áóêâû ñòðîêè ýòî ñòðî÷íûå áóêâû, False â ïðîòèâíîì ñëó÷àå.
∙ ìåòîä str.isspace()
Âîçâðàùàåò True, åñëè âñå ñèìâîëû íåïóñòîé ñòðîêè ýòî ïðîáåëû, False â ïðîòèâíîì ñëó÷àå.
∙ ìåòîä str.isupper()
Âîçâðàùàåò True, åñëè âñå áóêâû ñòðîêè ýòî ïðîïèñíûå áóêâû, False â ïðîòèâíîì ñëó÷àå.
ГЛАВА 8. ВСТРОЕННЫЕ ФУНКЦИИ И МЕТОДЫ 39
∙ ìåòîä str.join(iterable)
Î÷åíü âàæíûé è ïîëåçíûé ìåòîä!
Âîçâðàùàåò ñòðîêó, êîòîðàÿ ïîëó÷åíà êîíêàòåíàöèåé ýëåìåíòîâ ïîñëåäîâàòåëüíîñòè (iterable), ïåðåäàííîé â
êà÷åñòâå ïàðàìåòðà. Ýëåìåíòû ïîñëåäîâàòåëüíîñòè äîëæíû áûòü ñòðîêàìè. Ðàçäåëèòåëü ýëåìåíòîâ â äàííîì
ñëó÷àå ñòðîêà, îò ëèöà êîòîðîé áûë âûçâàí ìåòîä. Ïîä ñòðîêîé ñ âûçîâîì ìåòîäà join óêàçàí ðåçóëüòàò
âûâîäà.
x = [1 , 3 , 24 , 5 , 6 , 7]
print ( ’. ’. join ( ’ abcde ’ ))
a.b.c.d.e
∙ ìåòîä str.lower()
Âîçâðàùàåò ñòðîêó str, âñå áóêâû êîòîðîé ïåðåâåäåíû â íèæíèé ðåãèñòð.
print ( ’ abCDeFGh ’. lower ()) # abcdefgh
print ( ’ 123.45 ’. lower ()) # 123.45
print ( ’3 E23 ’. lower ()) # 3 e23
∙ ìåòîä str.lstrip([chars])
Âîçâðàùàåò ñòðîêó, ïîëó÷åííóþ èç str ñëåäóþùèì îáðàçîì: èç íà÷àëà ñòðîêè str óäàëÿþòñÿ все ñèìâîëû,
ïåðå÷èñëåííûå â ñòðîêå chars. Åñëè ïàðàìåòð chars íå óêàçàí, òî ïî óìîë÷àíèþ óäàëÿþòñÿ ïðîáåëû.
print ( ’␣ ␣ ␣ spacious ␣ ␣ ␣ ’. lstrip ()) # ’ spacious ’
print ( ’ www . example . com ’. lstrip ( ’ cmowz . ’ )) # ’ example . com ’
Íàäî ïîíèìàòü, ÷òî â chars óêàçûâàåòñÿ íå ïðåôèêñ, êîòîðûé íàäî óäàëèòü, à èìåííî íàáîð ñèìâîëîâ. Ïîñëå
ïðåîáðàçîâàíèÿ первый
ñèìâîë ïîëó÷èâøåéñÿ ñòðîêè ãàðàíòèðîâàííî îñòóòñòâóåò â ñòðîêå chars.
∙ ìåòîä str.partition(sep)
Ñíà÷àëà íàõîäèòñÿ ìåñòî ïåðâîãî âõîæäåíèÿ ñòðîêè sep â ñòðîêó str. Ìåòîä âîçâðàùàåò êîðòåæ, ñîñòîÿùèé èç
òð¼õ ñòðîê: ÷àñòü äî ðàçäåëèòåëÿ sep, ñàì ðàçäåëèòåëü, è ÷àñòü ïîñëå ðàçäåëèòåëÿ.
Åñëè ñòðîêà sep íå íàéäåíà, òî ïåðâûé ýëåìåíò êîðòåæà ýòî èñõîäíàÿ ñòðîêà, îñòàëüíûå äâà ïóñòûå ñòðîêè.
print ( ’ word # text ␣ string ’. partition ( ’# ’) # ( ’ word ’, ’# ’ , ’ text string ’))
– åñëè ïàðàìåòð sep íå óêàçàí èëè óêàçàíî çíà÷åíèå None, òî ãðóïïû ïîäðÿä èäóùèõ ïðîáåëîâ èíòåðïðåòè-
ðóþòñÿ, êàê îäèí ðàçäåëèòåëü;
– åñëè æå ïàðàìåòð sep óêàçàí ÿâíî, òî êàæäûé èç èäóùèõ ïîäðÿä ðàçäåëèòåëåé èíòåðïðåòèðóåòñÿ, êàê
ñàìîñòîÿòåëüíûé ðàçäåëèòåëü è â òàêîì ñëó÷àå â ñïèñêå ïîÿâëÿþòñÿ ïóñòûå ñòðîêè.
∙ ìåòîä str.strip([chars])
Ìåòîä âîçâðàùàåò ñòðîêó, ïîñëåäîâàòåëüíî îáðàáîòàííóþ ìåòîäàìè lstrip è rstrip.
∙ ìåòîä str.upper()
Âîçâðàùàåò ñòðîêó str, âñå áóêâû êîòîðîé ïåðåâåäåíû â âåðõíèé ðåãèñòð.
print ( ’ abCDeFGh ’. upper ()) # ABCDEFGH
print ( ’ 123.45 ’. upper ()) # 123.45
print ( ’ 28 mb ’. upper ()) # 28 MB
Глава 9
Работа с файлами
Äî ñèõ ïîð íàøè ïðîãðàììû íè÷åãî íå ñîõðàíÿëè â ðåçóëüòàòå ñâîåé ðàáîòû. Êàê ïðàâèëî îíè ðàáîòàëè íåäîëãî, âõîä-
íûå äàííûå ëèáî ñîçäàâàëèñü ñàìîé ïðîãðàììîé, ëèáî çàïðàøèâàëèñü ó ïîëüçîâàòåëÿ. Ðåçóëüòàò ðàáîòû âûâîäèëñÿ
íà ýêðàí è ñëåäóþùèé çàïóñê ïðîãðàììû íà÷èíàëñÿ ñ ÷èñòîãî ëèñòà.
Äðóãèå ïðîãðàììû ìîãóò ðàáîòàòü ïðîäîëæèòåëüíîå âðåìÿ (èëè ïîñòîÿííî, êàê îïåðàöèîííàÿ ñèñòåìà èëè âåá-
ñåðâåð), ìîãóò ñîõðàíÿòü ðåçóëüòàò ðàáîòû òàêèì îáðàçîì, ÷òîáû åãî ìîæíî áûëî åãî èñïîëüçîâàòü ïîñëå ïåðåçàïóñêà
ïðîãðàììû.
 ýòîé ãëàâå ïîíÿòèå òåêñòîâîãî ôàéëà, ïóòè ôàéëà ñ÷èòàåòñÿ èçâåñòíûì èëè ïî êðàéíåé ìåðå èíòóèòèâíî ïîíÿòíûì.
Äëÿ ðàáîòû ñ ôàéëîì íóæíî åãî открыть
. Ýòó îïåðàöèþ âûïîëíÿåò ôóíêöèÿ open(filename, mode). Ïåðâûé
ïàðàìåòð (ñòðîêà) îïðåäåëÿåò èìÿ îòêðûâàåìîãî äëÿ ðàáîòû ôàéëà è ìîæåò ñîäåðæàòü èëè òîëüêî èìÿ ôàéëà (òîãäà
îí èùåòñÿ â òåêóùåì êàòàëîãå) èëè åãî àáñîëþòíîå èìÿ (âìåñòå ñ ïóò¼ì, ãäå ýòîò ôàéë íàõîäèòñÿ). Ïàðàìåòð mode
îïðåäåëÿåò ñïîñîá ðàáîòû ñ îòêðûâàåìûì ôàéëîì:
∙ чтение (mode=’r’): ôàéë òîëüêî ÷èòàåòñÿ, èçìåíÿòü åãî íåëüçÿ
∙ добавление (mode=’a’): ñîáèðàåìñÿ äîïèñûâàòü èíôîðìàöèþ â åãî êîíåö
∙ запись (mode=’w’): ñîçäà¼ì äëÿ çàïèñè íîâûé ôàéë
Åñëè ñóùåñòâóþùèé ôàéë îòêðûâàåòñÿ ñ ïàðàìåòðîì ’w’, òî åãî ñîäåðæèìîå óäàëÿåòñÿ.
Åñëè ïàðàìåòð mode íå óêàçàí, òî ñ÷èòàåòñÿ, ÷òî îí ðàâåí ’r’.
Ïðèìåðû èñïîëüçîâàíèÿ:
open ( ’ text . txt ’ , ’r ’) # файл text . txt из текущего каталога
# открывается на чтение
open ( ’d :\ python \ data \ a . dat ’ , ’w ’) # файл a . dat из каталога d :\ python \ data
# открывается для записи
open ( ’\ usr \ name \ file . in ’ , ’a ’) # файл file . in из каталога \ usr \ name
# открывается на запись в его конец
Êàê áûëî îòìå÷åíî â ïðåäûäóùåì ðàçäåëå, ðàáîòû ñ ôàéëîì íà÷èíàåòñÿ ñ åãî îòêðûòèÿ â îäíîì èç òð¼õ ðåæèìîâ.
Ôóíêöèÿ open âîçâðàùàåò îáúåêò, îáðàùàÿñü ê êîòîðîìó ìû è áóäåì âûïîëíÿòü âñå íåîáõîäèìûå ìàíèïóëÿöèè ñ
ôàéëîì. Ïîñëå ðàáîòû ñ ôàéëîì åãî íåîáõîäèìî çàêðûòü. Â ÿçûêå Python ìîæíî îôîðìèòü îòêðûòèå ôàéëà â âèäå
îòäåëüíîãî áëîêà, ïî îêîí÷àíèè âûïîëíåíèÿ êîòîðîãî ôàéë àâòîìàòè÷åñêè çàêðîåòñÿ:
with open ( ’ test . txt ’) as f :
...
...
Ñòðî÷êà, íà÷èíàþùàÿñÿ ñî ñëóæåáíîãî ñëîâà with ÿâëÿåòñÿ çàãîëîâêîì áëîêà, âñå îïåðàòîðû êîòîðîãî äîëæíû
áûòü çàïèñàíû íèæå ñî ñòàíäàðòíûì îòñòóïîì (êàê áëîêè, ñîîòâåòñòâóþùèå óñëîâíîìó îïåðàòîðó èëè îïåðàòîðó
öèêëà). Ïî îêîí÷àíèè áëîêà ôàéë àâòîìàòè÷åñêè çàêðîåòñÿ.
Äëÿ èëëþñòðàöèè ìåòîäîâ ðàáîòû ñ ôàéëîì áûë ñîçäàí ôàéë alice.txt ñ òàêèì òåêñòîì:
The rabbit - hole went straight on like a tunnel
for some way , and then dipped suddenly down ,
so suddenly that Alice had not a moment to think
about stopping herself before she found herself
falling down a very deep well .
ГЛАВА 9. РАБОТА С ФАЙЛАМИ 42
Äëÿ ÷òåíèÿ ôàéëà â Python èñïîëüçóþòñÿ ñëåäóþùèå ìåòîäû (êàæäûé âûçûâàåòñÿ äëÿ îáúåêòà ôàéëà, óïîìÿíó-
òîãî âûøå):
1. f.read(n)
Ïàðàìåòð n öåëîå ÷èñëî. Åñëè îí óêàçàí, òî ìåòîä âîçâðàùàåò ñòðîêó, ñîñòîÿùóþ èç ñëåäóþùèõ n ñèìâîëîâ
ôàéëà. Åñëè ïàðàìåòð íå óêàçàí, òî â ñòðîêó ñ÷èòûâàåòñÿ âåñü ôàéë öåëèêîì, íà÷èíàÿ ñ òåêóùåé ïîçèöèè, ò.å.
ñ òîãî ñèìâîëà, äî êîòîðîãî ôàéë áûë ïðî÷èòàí ê íàñòîÿùåìó ìîìåíòó.
with open ( ’ alice . txt ’) as f :
print ( f . read (10)) # ’ The rabbit ’
print ( f . read (10)) # ’- hole went ’
print ( f . read ()) # все оставшиеся символы файла
2. f.readline()
Ìåòîä ÷èòàåò îäíó ñòðîêó (äî ñèìâîëà ïåðåíîñà ñòðîêè ’\n’). Âîçâðàùàåòñÿ ïðî÷èòàííàÿ ñòðîêà, âêëþ÷àÿ
ñèìâîë ïåðåíîñà ñòðîêè. Íàïðèìåð, íèæå ïîêàçàíî, êàê âûâåñòè íà ïå÷àòü ôàéë ñ íóìåðàöèåé åãî ñòðîê:
i = 1
with open ( ’ alice . txt ’) as f :
s = f . readline ()
while s :
print ( ’ {0: d } ␣ {1: s } ’. format (i , s ) , end = ’ ’)
i += 1
s = f . readline ()
3. f.readlines()
Ìåòîä ÷èòàåò âåñü ôàéë ïîñòðî÷íî, âîçâðàùàåò ñïèñîê ñòðîê (âêëþ÷àÿ ñèìâîëû ïåðåíîñà ñòðîêè).
4. Ïîìèìî óêàçàííûõ ìåòîäîâ ðàáîòû ñ ôàéëàìè â ÿçûêå Python ñóùåñòâóåò ñëåäóþùàÿ óäîáíàÿ êîíñòðóêöèÿ,
ïîçâîëÿþùàÿ ïåðåáèðàòü ñòðîêè ôàéëà. Òîãäà ïðèìåð ñ ïå÷àòüþ íóìåðîâàííûõ ñòðîê ôàéëà ìîæíî çàïèñàòü
êîðî÷å è åñòåñòâåííåé:
i = 1
with open ( ’ alice . txt ’) as f :
for line in f :
print ( ’ {0: d } ␣ {1: s } ’. format (i , line ) , end = ’ ’)
i += 1
Äëÿ çàïèñè â ôàéë íàäî îòêðûòü ôàéë äëÿ çàïèñè (ðåæèì w) èëè äîïèñûâàíèÿ (ðåæèì a).
Ðàññìîòðèì ïðèìåð:
# создаём в текущем каталоге файл с именем output . txt
# если такой файл уже был , его содержимое стирается
with open ( ’ output . txt ’ , ’w ’) as f :
# метод write записывает в файл , ассоцированный с переменной f , заданную строку
f . write ( ’ Lewis ␣ Carroll ’)
Ìû âñå âðåìÿ èñïîëüçîâàëè ïåðåìåííûå, íå îáúÿâëÿÿ ïðåäâàðèòåëüíî íè èõ ñàìèõ, íè èõ òèïû, è âñå êàê-òî ðàáîòàëî.
Íàïðèìåð, êîãäà âûïîëíÿåòñÿ èíñòðóêöèÿ а=3, êàê èíòåðïðåòàòîð Python óçíàåò, ÷òî ðå÷ü èäåò î öåëîì ÷èñëå?
Òèï ïåðåìåííîé â ÿçûêå Python îïðåäåëÿåòñÿ àâòîìàòè÷åñêè âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû, à íå â ðåçóëüòàòå
îáúÿâëåíèÿ â ïðîãðàììíîì êîäå. Ïîýòîìó îäíà è òà æå ïåðåìåííàÿ â õîäå ðàáîòû ïðîãðàììû ìîæåò
Ïðåæäå ÷åì ìû âûÿñíèì, êàê îáðàáàòûâàåòñÿ îïåðàòîð ïðèñâàèâàíèÿ âðîäå a = 3, ðàçáåð¼ìñÿ, êàê èíòåðïðåòàòîð
âîîáùå óçíà¼ò î ñóùåñòâîâàíèè ïåðåìåííûõ â ïðîãðàììå.
Создание переменной
Ïåðåìåííàÿ (òî åñòü èìÿ) ñîçäàåòñÿ àâòîìàòè÷åñêè, êîãäà â ïðîãðàììå åé âïåðâûå ïðèñâàèâàåòñÿ çíà÷åíèå. Âñå
ïîñëåäóþùèå îïåðàöèè ïðèñâàèâàíèÿ ïðîñòî èçìåíÿþò çíà÷åíèå, àññîöèèðîâàííîå ñ óæå ñîçäàííûì èìåíåì.
Типы переменных
Ïåðåìåííûå íå èìåþò íèêàêîé èíôîðìàöèè î òèïå èëè îãðàíè÷åíèÿõ, ñâÿçàííûõ ñ íèì. Ïîíÿòèå òèïà ïðèñóùå
îáúåêòàì, à íå èìåíàì. Ïåðåìåííûå óíèâåðñàëüíû ïî ñâîåé ïðèðîäå îíè âñåãäà ÿâëÿþòñÿ âñåãî ëèøü ññûëêàìè
íà êîíêðåòíûå îáúåêòû â êîíêðåòíûå ìîìåíòû âðåìåíè.
Использование переменной
Êîãäà ïåðåìåííàÿ ó÷àñòâóåò â âûðàæåíèè, åå èìÿ çàìåùàåòñÿ îáúåêòîì, íà êîòîðûé îíà â íàñòîÿùèé ìîìåíò
ññûëàåòñÿ, ïîñëå ÷åãî âûðàæåíèå âû÷èñëÿåòñÿ. Êðîìå òîãî, ïðåæäå ÷åì ïåðåìåííóþ ìîæíî áóäåò èñïîëüçîâàòü,
åé äîëæíî áûòü ïðèñâîåíî çíà÷åíèå èñïîëüçîâàíèå íåèíèöèàëèçèðîâàííîé ïåðåìåííîé ïðèâåäåò ê îøèáêå.
Èòàê:
Переменная ýòî ññûëêà íà ìåñòî â ïàìÿòè, ãäå õðàíèòñÿ îáúåêò; ïåðåìåííàÿ ñîçäà¼òñÿ ïðè âûïîëíåíèè ïåðâîé îïå-
ðàöèè ïðèñâàèâàíèÿ åé çíà÷åíèÿ; ïåðåìåííàÿ ìîæåò ññûëàòüñÿ íà îáúåêò ëþáîãî òèïà è åé äîëæíî áûòü ïðèñâîåíî
íåêîòîðîå çíà÷åíèå, ïðåæäå ÷åì å¼ ìîæíî áóäåò èñïîëüçîâàòü.
Ýòî îçíà÷àåò, ÷òî îò âàñ íå òðåáóåòñÿ çàðàíåå îáúÿâëÿòü ïåðåìåííûå â ïðîãðàììå, íî âû äîëæíû èíèöèàëèçèðîâàòü
èõ ïåðåä èñïîëüçîâàíèåì ñ÷åò÷èê, íàïðèìåð, äîëæåí áûòü èíèöèàëèçèðîâàí íóëåâûì çíà÷åíèåì, ïðåæäå ÷åì åãî
ìîæíî áóäåò óâåëè÷èâàòü.
Объект ýòî îáëàñòü ïàìÿòè, ãäå ïîìèìî çíà÷åíèÿ îáúåêòà õðàíèòñÿ òàêæå èíôîðìàöèÿ î òèïå ýòîãî çíà÷åíèÿ è
ñ÷¼ò÷èê ññûëîê íà ýòî çíà÷åíèå.
Òàêèì îáðàçîì, ïðè âûïîëíåíèè îïåðàòîðà ïðèñâàèâàíèÿ a = 3:
1. Ñîçäàåòñÿ îáúåêò (âûäåëÿåòñÿ ïàìÿòü, çàïèñûâàåòñÿ çíà÷åíèå), ïðåäñòàâëÿþùèé ÷èñëî 3.
2. Ñîçäàåòñÿ ïåðåìåííàÿ а, åñëè îíà åùå îòñóòñòâóåò.
3.  ïåðåìåííóþ а çàïèñûâàåòñÿ ññûëêà íà âíîâü ñîçäàííûé îáúåêò, ïðåäñòàâëÿþùèé ÷èñëî 3.
Äî ñèõ ïîð ãîâîðèëîñü îá îñîáåííîñòÿõ ñîçäàíèÿ è õðàíåíèÿ îáúåêòîâ â ïàìÿòè. À áûâàþò ëè ñèòóàöèè, êîãäà îáúåêòû
îñâîáîæäàþò çàíèìàåìóþ ïàìÿòü? Ðàññìîòðèì òàêóþ ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ:
a = 4
a = ’ aaa ’
a = 5.9
ГЛАВА 10. ДИНАМИЧЕСКАЯ ТИПИЗАЦИЯ 44
Èìÿ a ïîñëåäîâàòåëüíî óêàçûâàåò íà îáúåêò òèïà öåëîå ÷èñëî, ïîòîì íà ñòðîêó è â êîíöå êîíöîâ íà âåùåñòâåííîå
÷èñëî. Íî ÷òî ïðîèñõîäèò ñ ïðåæíèì çíà÷åíèåì ïîñëå òîãî, êàê âûïîëíÿåòñÿ íîâîå ïðèñâàèâàíèå?
Âñÿêèé ðàç, êîãäà èìÿ àññîöèèðóåòñÿ ñ íîâûì îáúåêòîì, èíòåðïðåòàòîð Python îñâîáîæäàåò ïàìÿòü, çàíèìàå-
ìóþ ïðåäûäóùèì îáúåêòîì (åñëè íà íåãî íå ññûëàåòñÿ êàêîå-ëèáî äðóãîå èìÿ). Òàêîå àâòîìàòè÷åñêîå îñâîáîæäåíèå
ïàìÿòè, çàíèìàåìîé îáúåêòàìè, íàçûâàåòñÿ ñáîðêîé ìóñîðà ( garbage collection
).
 êàæäîì îáúåêòå èìååòñÿ ñ÷åò÷èê ññûëîê, ñ ïîìîùüþ êîòîðîãî èíòåðïðåòàòîð ñëåäèò çà êîëè÷åñòâîì ññûëîê,
óêàçûâàþùèõ íà îáúåêò â íàñòîÿùèé ìîìåíò âðåìåíè. Êàê òîëüêî çíà÷åíèå ñ÷åò÷èêà äîñòèãàåò íóëÿ (è òîëüêî â
ýòîò ìîìåíò), ïàìÿòü, çàíèìàåìàÿ îáúåêòîì, àâòîìàòè÷åñêè îñâîáîæäàåòñÿ.  ïðåäûäóùåì ïðèìåðå ìû èñõîäèëè
èç ïðåäïîëîæåíèÿ, ÷òî âñÿêèé ðàç, êîãäà èìÿ a àññîöèèðóåòñÿ ñ íîâûì îáúåêòîì, ñ÷åò÷èê ïðåäûäóùåãî îáúåêòà
óìåíüøàåòñÿ äî íóëÿ, çàñòàâëÿÿ èíòåðïðåòàòîð îñâîáîæäàòü ïàìÿòü.
Âàæíî ïîíèìàòü, ÷òî â óêàçàííîì êîäå не происходит ñîçäàíèå íîâîé ïåðåìåííîé a. Â ïàìÿòè ñîçäàþòñÿ новые
объекты (ñòðîêà ’aaa’, âåùåñòâåííîå ÷èñëî 5.9), à ïåðåìåííàÿ a âñÿêèé ðàç ïîëó÷àåò â êà÷åñòâå çíà÷åíèÿ ññûëêó íà
íîâûé îáúåêò. Ïðåæíèé îáúåêò ïðè ýòîì îñâîáîæäàåò ïàìÿòü.
Åù¼ ïðèìåð:
a = 4 # создан объект - целое число 4 , на него указывает имя a
b = 4 # в памяти уже существует объект целого типа со значением 4
# поэтому имя b указывает на него
# у объекта с целым значением 4 счётчик ссылок теперь равен 2
a = 10 # создаётся объект - целое число со значением 10 ( счётчик ссылок равен 1)
# счётчик ссылок у числа 4 становится равным 1
b = 10 # счётчик ссылок на целое число 10 теперь равен 2 ( на него указывают a и b )
# на 4 не указывает ни одно имя , объект освобождает память
a = 5 a = 5 a = ’ abcde ’ a = ’ abcde ’ a = [5 , 6] a = [5 , 6]
b = 5 b = a b = ’ abcde ’ b = a b = [5 , 6] b = a
print ( a is b ) print ( a is b ) print ( a is b ) print ( a is b ) print ( a == b ) print ( a == b )
print (a , b ) print (a , b ) print (a , b ) print (a , b ) print ( a is b ) print ( a is b )
a [0] = 9 a [0] = 9
print (a , b ) print (a , b )
Âèäíî, ÷òî öåëûé òèï è ñòðîêè âåäóò ñåáÿ òàê, êàê îïèñûâàëîñü â ïåðâîì ïðèìåðå. Åñëè îáúåêò ñ òàêèì çíà÷åíèåì
óæå ñóùåñòâóåò, òî åãî êîïèÿ íå ñîçäà¼òñÿ, à ïåðåìåííîé ïðèñâàèâàåòñÿ ññûëêà íà óæå ñóùåñòâóþùåå çíà÷åíèå 5 èëè
’abcde’.
Òàêèå òèïû íàçûâàþòñÿ íåèçìåíÿåìûìè (immutable). Íåèçìåíÿåìûìè òèïàìè â ÿçûêå Python ÿâëÿþòñÿ ÷èñëà,
ñòðîêè (str) è êîðòåæè (tuple).
Ñî ñïèñêàìè âñ¼ âûãëÿäèò èíà÷å. Ïîñëåäîâàòåëüíîñòü ïðèñâàèâàíèé
a = [5 , 6]
b = [5 , 6]
î÷åâèäíî ãàðàíòèðóåò íàì, ÷òî çíà÷åíèå âûðàæåíèÿ a==b ðàâíî True. Íî åñëè ïîïûòàòüñÿ âûÿñíèòü îäèí è òîò æå
ýòî ñïèñîê (a is b), òî îêàçûâàåòñÿ, ÷òî ýòî íå òàê. Ýòî ìîæíî ïðîâåðèòü, èçìåíèâ îäèí èç íèõ (a[0] = 9).
ГЛАВА 10. ДИНАМИЧЕСКАЯ ТИПИЗАЦИЯ 45
∙ ñå÷åíèÿ:
a = [5 , 6]
b = a [:]
∙ ôóíêöèÿ list():
a = [5 , 6]
b = list ( a )
Åñëè ñïèñîê âëîæåííûé, òî íè îäèí èç óêàçàííûõ âûøå ìåòîäîâ íå äàñò æåëàåìîãî ðåçóëüòàòà. Ïðîâåðüòå èíòóè-
öèþ ñíîâà: ÷òî âûâåäåò ïðîãðàììà â êàæäîì èç ôðàãìåíòîâ?
# вложенные словари :
a = { ’x ’ :[1 , 2] , ’y ’: [3 , 4]}
b = deepcopy ( a )
Åù¼ îäèí ïðèìåð ñ âëîæåííûìè ñïèñêàìè:
t = [1 ,2]
x = []
x = [t , t [:]]
print ( x ) # [[1 , 2] , [1 , 2]]
t [0] = 99 # изменяем список t , но первый элемент списка x это тот же самый объект !
# поэтому ничего удивительного в следующем результате :
print ( x ) # [[99 , 2] , [1 , 2]]
Глава 11
Èñïîëüçóÿ èçâåñòíûå ê ýòîìó âðåìåíè êîíñòðóêöèè (ïðèñâàèâàíèå, ââîä/âûâîä, óñëîâíûé îïåðàòîð è îïåðàòîð öèêëà)
ìîæíî çàïðîãðàììèðîâàòü ëþáîé àëãîðèòì. Òàê è ïðîèñõîäèò ñ íåñëîæíûìè çàäà÷àìè è íåáîëüøèìè ïðîãðàììàìè.
Íî ñ ðîñòîì ñëîæíîñòè çàäà÷ îñòàâàòüñÿ â ýòèõ ðàìêàõ ñòàíîâèòñÿ âñ¼ òðóäíåå.
Íàðÿäó ñ îñíîâíûìè êîíñòðóêöèÿìè â áîëüøèíñòâå ÿçûêîâ ñóùåñòâóþò ñïîñîáû, ðåàëèçóþùèå èäåè декомпозиции
èабстракции .
Декомпозиция ñïîñîá ðàçáèåíèÿ òåêñòà ïðîãðàììû íà îòäåëüíûå áëîêè, êàæäûé èç êîòîðûõ ðåàëèçóåò îïðå-
äåë¼ííóþ îñìûñëåííóþ çàäà÷ó, ÷àñòü îáùåé ðàáîòû. Îäíè è òå æå áëîêè ìîãóò áûòü èñïîëüçîâàíû â ðàçíûõ ìåñòàõ
ïðîãðàììû (èëè íåñêîëüêèõ ïðîãðàìì).
Абстракция ïîçâîëÿåò ñêîíöåíòðèðîâàòüñÿ íà ñìûñëå è ñóòè äàííûõ è/èëè ïðîãðàììû, íå îáðàùàÿ âíèìàíèÿ
íà îñîáåííîñòè ðåàëèçàöèè ýòèõ äàííûõ è/èëè ïðîãðàììû.
 ÿçûêå Python, êàê è â áîëüøèíñòâå äðóãèõ ÿçûêîâ, äëÿ ðåàëèçàöèè èäåé äåêîìïîçèöèè è àáñòðàêöèè èñïîëü-
çóþòñÿ, â ÷àñòíîñòè, ôóíêöèè. Ôóíêöèè ìîæíî ðàññìàòðèâàòü êàê ñïîñîá çàäàâàòü íîâûå, áîëåå ñëîæíûå "ïðèìèòè-
âû"(êîìàíäû) ÿçûêà.
∙ ôóíêöèè, âîçâðàùàþùèå çíà÷åíèå â òåëå òàêîé ôóíêöèè äîëæåí âñòðåòèòüñÿ õîòÿ áû îäèí îïåðàòîð return.
∙ ôóíêöèè, íå âîçâðàùàþùèå çíà÷åíèÿ
Òàêèì îáðàçîì, ôóíêöèè, âîçâðàùàþùèå çíà÷åíèå, ìîæíî èñïîëüçîâàòü â âûðàæåíèÿõ (â ïðàâîé ÷àñòè îïåðàòîðà
ïðèñâàèâàíèÿ, óñëîâèÿõ îïåðàòîðîâ (if, while), îïåðàòîðà print).
Òèï çíà÷åíèÿ ôóíêöèè îïðåäåëÿåòñÿ òèïîì âîçâðàùàåìîãî âûðàæåíèÿ, ñòîÿùåãî ïîñëå return â òåëå ôóíêöèè.
ãäå <имя функции> èìÿ îäíîé èç îïðåäåë¼ííûõ âûøå ôóíêöèé, <фактические параметры> ñïèñîê âûðà-
æåíèé, ðàçäåë¼ííûõ çàïÿòûìè. Ïåðåä âûïîëíåíèåì ôóíêöèè çíà÷åíèÿ ýòèõ âûðàæåíèé áóäóò âû÷èñëåíû. Ñ
ýòèìè âû÷èñëåííûìè çíà÷åíèÿìè áóäóò ñâÿçàíû èìåíà ñîîòâåòñòâóþùèõ ôîðìàëüíûõ ïàðàìåòðîâ â îïèñàíèè
ôóíêöèè. Òàêèì îáðàçîì, êîëè÷åñòâî ôîðìàëüíûõ è ôàêòè÷åñêèõ ïàðàìåòðîâ äîëæíî ñîâïàäàòü.
Ïðèìåðû âûçîâîâ ôóíêöèé, âîçâðàùàþùèõ çíà÷åíèå:
# функция возвращает значение : f ( x ) = x !
def factorial ( x ):
res = 1
if x == 0 or x == 1:
return res
while x > 1:
res = res * x
x -= 1
return res
# сокращение дроби
def gcd (a , b ):
while b != 0:
a, b = b, a % b
return a
else :
return False
def stairway ( n ):
k = 1
while k <= n :
step ( k )
k += 1
print ()
t = [1 , 2 , 3] t = [1 , 2 , 3]
smart_print ( t ) print ( smart_print ( t ))
x [0] = 1 x [0] = 1
x [1] = 2 x [1] = 2
x [2] = 3 x [2] = 3
None
Êîìó-òî ìîæåò ïîêàçàòüñÿ, ÷òî ïå÷àòü ëèøíåãî ñëîâà None íå ÿâëÿåòñÿ áîëüøîé ïðîáëåìîé, õîòÿ, íàïðèìåð, â
àâòîìàòè÷åñêèõ ïðîâåðÿþùèõ ñèñòåìàõ âûâîä äîëæåí òî÷íî ñîîòâåòñòâîâàòü ñïåöèôèêàöèè. Ïðèâåä¼ì òåïåðü
ïðîñòîé, íî íå òàêîé áåçîáèäíûé ïðèìåð.
def odd ( t ):
if t %2 == 0:
return False
Ôàéë, ñîäåðæàùèé òåêñò ïðîãðàììû íà ÿçûêå Python âûïîëíÿåòñÿ ïîñëåäîâàòåëüíî ñâåðõó âíèç îïåðàòîð çà
îïåðàòîðîì. Îïðåäåëåíèÿ ôóíêöèé, ò.å. îïåðàòîðû, èç êîòîðûõ îíè ñîñòàâëåíû, íå âûïîëíÿþòñÿ. Îïðåäåëåíèå
ôóíêöèè ëèøü îïèñûâàåò ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ, êîòîðóþ íàäî âûïîëíèòü, åñëè ôóíêöèÿ áóäåò âûçâàíà
â òåêñòå ïðîãðàììû.
Òàêèì îáðàçîì, îáà ïðèâåä¼ííûõ íèæå ôðàãìåíòà âûïîëíÿþòñÿ îäèíàêîâî: òåëî ôóíêöèè âûïîëíÿåòñÿ òîëüêî
â ìîìåíò å¼, ôóíêöèè, âûçîâà â 11-é è â 12-é ñòðî÷êàõ ñîîòâåòñòâåííî.
Òî æå ñïðàâåäëèâî äëÿ ëþáîãî êîëè÷åñòâà ôóíêöèé, îïðåäåë¼ííûõ â ôàéëå ñ ïðîãðàììîé íà ÿçûêå Python.
менные
Áëîêîì â Ïèòîíå íàçûâàåòñÿ ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ òåëà ôóíêöèè èëè âñåãî ôàéëà.
 ïðèìåðå, èëëþñòðèðóþùåì ôóíêöèè (ñì. 11.2), âîçâðàùàþùèå ïàðàìåòðû, âñåãî 4 áëîêà: 3 áëîêà ôóíêöèè
factorial, n_length è is_sqr, åù¼ îäèí âêëþ÷àþùèé â ñåáÿ ïåðâûå òðè (îíè íàçûâàþòñÿ âëîæåííûìè) è
ñòðîêè ïîñëå îïèñàíèÿ ôóíêöèé.
Областью видимости имени считается блок, в которой это имя было связано с новым значением,
à òàêæå âñå âëîæåííûå â íåãî áëîêè.
Íàïðèìåð:
def f ():
return k + 1
k = 5
print ( f ())
Çäåñü îáëàñòüþ âèäèìîñòè ïåðåìåííîé k ÿâëÿåòñÿ âåñü òåêñò ïðîãðàììû âìåñòå ñ òåëîì ôóíêöèè, ò.ê. îíà ïî-
ëó÷èëà çíà÷åíèå â áëîêå ñîäåðæàùåì âíóòðè ñåáÿ òåëî ôóíêöèè (à âíóòðè òåëà ôóíêöèè èìÿ k íå ñâÿçûâàëîñü
íè ñ êàêèì çíà÷åíèåì). Òàêèì îáðàçîì, èñïîëüçîâàíèå ïåðåìåííîé k ðàçðåøåíî, ïðîãðàììà âûâåäåò 6. Òàêàÿ
ïåðåìåííàÿ íàçûâàåòñÿ глобальной
.
ГЛАВА 11. ФУНКЦИИ, ПАРАМЕТРЫ, ВЫЗОВЫ ФУНКЦИЙ. 50
Åù¼ ïðèìåð:
a = 20
def f ( x ):
x = x + a
return x
print (a , f (4))
Áóäóò âûâåäåíû ÷èñëà 20 è 24. Ïî óìîë÷àíèþ îáëàñòü âèäèìîñòè èìåíè a ðàñïðîñòðàíÿåòñÿ íà ôóíêöèè ýòîãî
áëîêà, â ÷àñòíîñòè, íà ôóíêöèþ f.
Äðóãîé ïðèìåð:
a = 20
def f ( x ):
a = 3
x = x + a
return x
print (a , f (4))
Áóäóò âûâåäåíû ÷èñëà 20 è 7. Âíóòðè ôóíêöèè f(x) èìÿ a ñâÿçàíî ñî çíà÷åíèåì 3. Îáëàñòü âèäèìîñòè ýòîé
ïåðåìåííîé ôóíêöèÿ f. Òàêèì îáðàçîì, èìÿ a âíóòðè ôóíêöèè ñóùåñòâóåò îòäåëüíî îò ãëîáàëüíîãî èìåíè a.
Òàêàÿ ïåðåìåííàÿ íàçûâàåòñÿ локальной
.
Ýòî æå ïðàâèëî äåéñòâóåò è äëÿ èì¼í ôîðìàëüíûõ ïàðàìåòðîâ. Èõ èìåíà ÿâëÿþòñÿ локальными ïåðåìåííûìè:
def f ( a ):
return a * a
a = 20
print (a , f (4))
def f ( x ):
a = a + 3
x = x + a
return x
print (a , f (4))
a = 20
f ()
Íåñìîòðÿ íà òî, ÷òî îïåðàòîð ïðèñâàèâàíèÿ âíóòðè ôóíêöèè никогда íå áóäåò âûïîëíåí, ñàì ôàêò åãî ïðèñóò-
ñòâèÿ âíóòðè ôóíêöèè äåëàåò ïåðåìåííóþ a ëîêàëüíîé, à çíà÷èò ïðè âûïîëíåíèè îïåðàòîðà print å¼ çíà÷åíèå
áóäåò íåèçâåñòíî.
Èñïðàâèòü ñèòóàöèþ â ïåðâîì ïðèìåðå ìîæíî òàê:
a = 20
def f ( x ):
ГЛАВА 11. ФУНКЦИИ, ПАРАМЕТРЫ, ВЫЗОВЫ ФУНКЦИЙ. 51
b = a + 3
x = x + b
return x
print (a , f (4))
Áóäóò âûâåäåíû ÷èñëà 20 è 27.
Ïîäðîáíåå îá îáëàñòÿõ âèäèìîñòè è ñâÿçûâàíèè ÷èòàòü â ãëàâå "Execution model"äîêóìåíòàöèè íà àíãëèéñêîì
ÿçûêå: http://docs.python.org/reference/executionmodel.html
 ñëåäóþùåì ïàðàãðàôå áóäóò áîëåå ïîäðîáíî ðàññìîòðåíû ñïîñîáû ïåðåäà÷è ïàðàìåòðîâ â ôóíêöèè, è êàê ñ
ýòèì ñâÿçàíî ñâîéñòâî èçìåíÿåìîñòè (mutablity).
Çíàêîìûå ñ ÿçûêîì Ïàñêàëü èëè C++ çíàþò, ÷òî ñóùåñòâóþò äâà ïðèíöèïèàëüíî ðàçíûõ ñïîñîáà ïåðåäà÷è
ïàðàìåòðîâ ôóíêöèÿì: ïåðåäà÷à ïàðàìåòðà ïî çíà÷åíèþ è ïåðåäà÷à ïàðàìåòðà ïî ññûëêå.
Ïåðâûé îçíà÷àåò, ÷òî â ôóíêöèþ ïåðåäà¼òñÿ êîïèÿ è ëþáûå èçìåíåíèÿ ýòîé êîïèè âíóòðè ôóíêöèè íèêàê íå
îòðàæàþòñÿ íà çíà÷åíèè ýòîãî ïàðàìåòðà ñíàðóæè ôóíêöèè.
Âòîðîé îçíà÷àåò, ÷òî â ôóíêöèþ ïåðåäà¼òñÿ ññûëêà íà îðèãèíàë, ïîýòîìó èçìåíåíèå òàêîãî ïàðàìåòðà âíóòðè
ôóíêöèè âëå÷¼ò èçìåíåíèå îðèãèíàëà.
Ïðåäñòàâèì ñåáå, ÷òî ïàðàìåòð TEX-âåðñèÿ ýòîé êíèæêè, íà 23-é ñòðàíèöå êîòîðîé íàäî èñïðàâèòü îïå÷àòêó
è ìû õîòèì ïîðó÷èòü ýòó îïåðàöèþ êîððåêòîðó. Ïðåäïîëîæèì, ÷òî îðèãèíàë ýòîãî ôàéëà íàõîäèòñÿ â ñåòè è
äîñòóïåí êàæäîìó æåëàþùåìó.
×òîáû ïåðåäàòü òàêîé ïàðàìåòð ïî çíà÷åíèþ, ìîæíî ñêîïèðîâàòü ôàéë è ïåðåäàòü êîïèþ ïî ýëåêòðîííîé ïî÷òå,
ðàñïå÷àòàòü êíèæêó èëè òîëüêî å¼ 23-þ ñòðàíèöó. Òîãäà ïðàâêà îñòàíåòñÿ â êîïèè (â êîïèè ôàéëà, íà ëèñòå
áóìàãè), íî íèêàê íå îòðàçèòñÿ íà îðèãèíàëüíîì ôàéëå. Äëÿ ïåðåäà÷è ïàðàìåòðà ïî ññûëêå íàäî ñîîáùèòü
àäðåñ ôàéëà êîððåêòîðó, ò.å. ñîîáùèòü, ãäå èìåííî íàõîäèòñÿ îðèãèíàë.
 ÿçûêå Python ñïîñîá ïåðåäà÷è ïàðàìåòðà ôóíêöèè çàâèñèò îò òîãî, êàêîâ òèï ýòîãî ïàðàìåòðà: èçìåíÿåìûå
òèïû ïåðåäàþòñÿ ïî ññûëêå, íåèçìåíÿåìûå ïî çíà÷åíèþ.
 ïðèâåä¼ííûõ íèæå ïðèìåðàõ ñòàíäàðòíàÿ ôóíêöèÿ id() âûâîäèò èäåíòèôèêàòîð îáúåêòà. Ìîæíî ñ÷èòàòü,
÷òî ýòî àäðåñ, ïî êîòîðîìó õðàíèòñÿ çíà÷åíèå, ñ êîòîðûì ñâÿçàíà ïåðåìåííàÿ, ïåðåäàííàÿ â êà÷åñòâå ïàðàìåòðà
ôóíêöèè id().
1. def ref_demo ( x ):
print (x , id ( x )) # локальная для функции переменная - параметр x
# связана со значением 10
# обе переменные ( k и x )
# связаны с одним и тем же значением
x = 42
print (x , id ( x )) # теперь x связана со значением 42
# k и x связаны с разными значениями
k = 10
print (k , id ( k )) # переменная k связана со значением 10
ref_demo ( k )
print (k , id ( k )) # целочисленный тип является неизменяемым
# поэтому все изменения параметра внутри функции
# означали не изменение , а создание нового объекта
Âûâîä, êîòîðûé ìû âèäèì ïîñëå çàïóñêà ïðîãðàììû:
k =10 , id ( k )=31041244
x =10 , id ( x )=31041244
x =42 , id ( x )=31040860
k =10 , id ( k )=31041244
Êîíêðåòíûå çíà÷åíèÿ ôóíêöèè id(), êîíå÷íî, âñÿêèé ðàç áóäóò äðóãèå, íî ãëàâíîå â òðåòüåé ñòðî÷êå
всегда áóäåò îòëè÷íîå îò îñòàëüíûõ ÷èñëî.
2. Äîïóñòèì, ìû õîòèì îïèñàòü ôóíêöèþ, îñóùåñòâëÿþùóþ ïàðàëëåëüíûé ïåðåíîñ îòðåçêà íà çàäàííûé âåê-
òîð.
Îòðåçîê çàäàí êîîðäèíàòàìè ñâîèõ êîíöîâ (ýëåìåíò êîðòåæà ñ èíäåêñîì 0 àáñöèññà, ñ èíäåêñîì 1
îðäèíàòà).
−−→
Âåêòîð ñäâèãà 𝑂𝑋 çàäàí êîîðäèíàòàìè òî÷êè 𝑋 (òî÷êà 𝑂 íà÷àëî êîîðäèíàò).
ГЛАВА 11. ФУНКЦИИ, ПАРАМЕТРЫ, ВЫЗОВЫ ФУНКЦИЙ. 52
# Такое решение не будет работать просто потому , что кортежи нельзя изменять ,
# в первой же строчке функции будет ошибка
def shift (a , b , x ):
a [0] , b [0] = a [0]+ x [0] , b [0]+ x [0] # TypeError : ’ tuple ’ object
# does not support item assignment
a [1] , b [1] = a [1]+ x [1] , b [1]+ x [1]
a = (1 , 2)
b = ( -3 , 2)
shift (a , b , (1 , 1))
print (a , b )
a = (1 , 2)
b = ( -3 , 2)
a , b = shift (a , b , (1 , 1))
print (a , b ) # (2 , 3) ( -2 , 3)
t = [1 , 2 , 3] t = [1 , 2 , 3] t = [1 , 2 , 3] t = [1 , 2 , 3 , 4]
f1 ( t ) f2 ( t ) f3 ( t ) f4 ( t )
print ( t ) print ( t ) print ( t ) print ( t )
[1 , 2 , 3] [1 , 2 , 3] [1 , 2 , 3] [1 , 2 , 3 , 4]
[1 , 2 , 3 , 57] [99 , 2 , 3] [1 , 2 , 3 , 34 , 45] [1 , 2 , 99 , 4]
[1 , 2 , 3 , 57] [99 , 2 , 3] [1 , 2 , 3] [1 , 2 , 3 , 4]
 êàæäîé ôóíêöèè ïåðåìåííàÿ-ïàðàìåòð t ëîêàëüíàÿ.  íà÷àëå âûïîëíåíèÿ ôóíêöèè ýòà ëîêàëüíàÿ ïåðå-
ìåííàÿ ñâÿçûâàåòñÿ ñî çíà÷åíèåì, êîòîðîå èìååò ãëîáàëüíàÿ ïåðåìåííàÿ t. Ò.å. â íà÷àëå ðàáîòû ôóíêöèè íà
çíà÷åíèå ïåðåäàâàåìîãî ñïèñêà "ñìîòðÿò"äâå ïåðåìåííûå îäíà ãëîáàëüíàÿ, âòîðàÿ ëîêàëüíàÿ.
Çàòåì â ôóíêöèÿõ f1(t) è f2(t) ïðîèñõîäèò èçìåíåíèå ýòîãî çíà÷åíèÿ.  f1(t) â ñïèñîê äîáàâëÿåòñÿ ÷èñëî 57,
â f2(t) íóëåâîé ýëåìåíò ýòîãî ñïèñêà èçìåíÿåòñÿ íà 99.
 ôóíêöèÿõ f3(t) è f4(t) ñîçäà¼òñÿ новое значение локальной переменной t. Çíà÷åíèå ãëîáàëüíîé ïåðåìåííîé
t ïðè ýòîì íå èçìåíÿåòñÿ.
ГЛАВА 11. ФУНКЦИИ, ПАРАМЕТРЫ, ВЫЗОВЫ ФУНКЦИЙ. 53
t = [1 , 2 , 3 , 4 , 5 , 6 , 7]
f1 ( t )
print ( t ) # [1 , 2 , 3 , 4 , 5 , 6 , 7]
t = [1 , 2 , 3 , 4 , 5 , 6 , 7]
f2 ( t )
print ( t ) # [1 , 99 , 3 , 4 , 5 , 6 , 7]
Âàæíî ïîíèìàòü, ÷òî ñëó÷àè 1 è 2 âîçìîæíû ëèøü ïðè ïåðåäà÷å â êà÷åñòâå ïàðàìåòðîâ çíà÷åíèé èçìåíÿåìûõ
òèïîâ (òàêèõ êàê ñïèñîê). Ìåòîä append è èçìåíåíèå ýëåìåíòà ñïèñêà ñ çàäàííûì èíäåêñîì ñóòü èçìåíåíèÿ
ñïèñêà, îïåðàöèè â ïðèìåðàõ 3 è 4 ýòî ñîçäàíèå íîâîãî ñïèñêà (â ò.÷. ïðè ïîìîùè ñðåçà ñóùåñòâóþùåãî ñïèñêà).
Ðåêóðñèåé íàçûâàåòñÿ ñèòóàöèÿ, êîãäà ôóíêöèÿ âûçûâàåò ñàìà ñåáÿ (ÿâíûì îáðàçîì èëè êîñâåííî). Êëàññè÷åñêèå
ïðèìåðû ðåêóðñèè â ìàòåìàòèêå îïðåäåëåíèå ôàêòîðèàëà, ÷èñåë Ôèáîíà÷÷è.
Çíàêîìûå ñ òâîð÷åñòâîì Ñòàíèñëàâà Ëåìà íàâåðíÿêà ïîìíÿò ïðèìåð êîñâåííîé ðåêóðñèè èç "Çâ¼çäíûõ äíåâíè-
êîâ Èéîíà Òèõîãî":
Нашёл следующие краткие сведения:
«СЕПУЛЬКИ — важный элемент цивилизации ардритов с планеты Энтеропия. См. СЕПУЛЬКАРИИ».
Я последовал этому совету и прочёл:
«СЕПУЛЬКАРИИ — устройства для сепуления (см.)».
Я поискал «Сепуление»; там значилось:
«СЕПУЛЕНИЕ — занятие ардритов (см.) с планеты Энтеропия (см.). См. СЕПУЛЬКИ».
Ïðè çàïèñè ðåêóðñèâíûõ ôóíêöèé îáû÷íî ðåøàþòñÿ äâå çàäà÷è:
# вычисление факториала
def factorial ( n ):
if n == 0 or n == 1:
return 1
else :
return n * factorial (n -1)
ГЛАВА 11. ФУНКЦИИ, ПАРАМЕТРЫ, ВЫЗОВЫ ФУНКЦИЙ. 54