You are on page 1of 188

Taspython

Python

Python

: :
TasPython


2008 / & -
,
, -
-
. ,
,
,
.
, ,
-
, , ,
.
,
,
.

TasPython , -
, .
,
.

iii
iv
.
vi

1 1
1.1 . . . . . . . . . . . . . . . . . . . . . 2
1.2 . . . . . . . . . . . . . . . . . 2
1.2.1 . . . . . . . . . . . 3
1.2.2 . . . . . . 3
1.2.3 . . . . . . . . . . . . . . . . . . . . . . 4
1.2.4 . . . . . . . . . . . . . 5
1.2.5 . . . . . . . . . . . . . . . . . . . . . 5
1.2.6 . . . . . . . . . . . . . . . . . . . . 5
1.2.7 . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.2.8 . . . . . . . . . . . . . . 6
1.3 Python . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.1 . . . . . . . . . . . . . . . . . . . 9
1.3.2 Python 3 . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3.5 Zen of Python . . . . . . . . . . . . . . . . . . . . . . . 13
1.4 Python . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.1 . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.2 Python . . . . . . . . . . 15
1.5 . . . . . . . . . . . . . . . . . . . . . . . . 18

vii
viii

2 21
2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3 Boolean . . . . . . . . . . . . . . . . . . . . . . . . 24
2.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3 29
3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 . . . . . . . . . . . . . . . . . . . . . 30
3.3 . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4 if . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.4.1 . . . . . . . . . . . . . . . . . . 34
3.5 . . . . . . . . . . . . . . . . . . . . . . . 36
3.5.1 for . . . . . . . . . . . . . . . . . . . . . . . . 36
3.5.2 while . . . . . . . . . . . . . . . . . . . . . . . 38
3.6 break . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.7 with . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.7.1 with . . . . . . . . . . . . . . . . . . . . . . 40
3.7.2 . . . . . . . . . . . . . . . . . . . . . . . 41

4 43
4.1 . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.1.2 . . . . . . . . . . . . . . . . . . . . 44
4.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.3 . . . . . . . . . . . . . . . . . 46
4.4 . . . . . . . . . . . . . . . . . . . . . . . . 47

5 49
5.1 . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.2 . . . . . . . 51
5.3 (Docstrings) . . . . . . . . . . . . 52
5.4 . . . . . . . . . . . . . . . . . . . . . 54
5.4.1 . . . . . . . . . . . . . . . . . . . . . . 54
5.5 . . . . . . . . . . . . . . . . . . . . . . 55
ix

5.6 (Decorators) . . . . . . . . . . . . . . . . . . . . 56

6 59
6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.1.1 . . . . . . . . . . . . . . . . . 60
6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.2.1 . . . . . . . . . . . . . 61
6.2.2 . . . . . . . . . . . . . . . 62
6.2.3 . . . . . . . . . . . . . . 63
6.2.4 . . . . . . . . . . . . . . . 64
6.2.5 . . . . . . . . . . . . . . . . . . . 64
6.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.3.1 . . . . . . . . . . . . . . . . . . . . . 67
6.3.2 . . . . . . . . . . . . . . . 68
6.3.3 . . . . . . . . . . . . . . . . . 70
6.3.4 . . . . . . . . . . . . . . . . . . . . 70
6.3.5 (Lists comprehensions) . . . . . . . 71
6.3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
6.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6.5.1 . . . . . . . . . . . . . . . . . . . . 73
6.5.2 . . . . . . . . . . . . . . . . . . . 74
6.5.3 . . . . . . . . . . . . . . . . . . . . . . . 76
6.5.4 . . . . . . . . . . . . . . . . 76
6.5.5 (Dict comprehension) . . . . . . . 77
6.5.6 . . . . . . . . . . . . . . . . . . . 77
6.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6.6.1 . . . . . . . . . . . . . . . . . . . . . . . . 78
6.6.2 . . . . . . . . . . . . . . . . . 79

7 81
7.1 (immutable objects) . . . . . . . . . . . . . . . . 81
7.2 . . . . . . . . . . . . . . . . 83
7.3 . . . . . . . . . . . . . . . . . . . . . . . 86
7.3.1 . . . . . . . . . . . . . . . . . . . . . . . . 87
x

7.3.2 None . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7.4 . . . . . . . . . . . . . . . . . . . . . . . . . 88
7.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
7.6 . . . . . . . . . . . . . . . . . . . . . 94

8 99
8.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
8.2 . . . . . . . . . . . . . . . . . . . . . . . . . 101
8.3 . . . . . . . . . . . . . . . . . 104
8.4 (attributes) . . . . . . . . . . . . . . 107
8.5 . . . . . . . . . . . . . . . . . . . . . . . 108
8.6 . . . . . . . . . . . . 109
8.6.1 . . . . . . . . . . . . . . . . . . . . 109
8.6.2 . . . . . . . . . . . . . . . . . . . . . 110
8.7 . . . . . . . . . . . . . . . . . . . . . . . . . 110
8.8 . . . . . . . . . . . . . . . . . . . . . . . . . 112

9 115
9.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
9.2 . . . . . . . . . . . . . . . . . . . . . . . 116
9.2.1 . . . . . . . . . . . . . . . . . . . 116
9.2.2 . . . . . . . . . . . . . . . . . . . . 117
9.2.3 . . . . . . . . . . . . . . . . . . . . 117
9.2.4 () . . . . . 118
9.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
9.3.1 . . . . . . . . . . . . . . . . . 119
9.3.2 . . . . . . . . . . . . . . . . . . . 122

10 123
10.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
10.2 . . . . . . . . . . . . . . . . . . . . . . . . . . 124
10.3 . . . . . . . . . . . . . . . . . . . . . 128
10.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
10.4.1try:. . . else: . . . . . . . . . . . . . . . . . . . . . . . . . 129
10.4.2finally . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
xi

10.5 . . . . . . . . . . . . . . . . . . . . . 131
10.5.1 . . . . . . . . . . . . . . . . . . . 131
10.5.2 (raise) . . . . . . . . . . . . . . . 132
10.5.3 . . . . . . . . . 132
10.6 if . . . else . . . . . . . . . . . . . . . . . . . . . . 133

11 139
11.1 (Iterators) . . . . . . . . . . . . . . . . . . . . . 139
11.1.1 for . . . . . . . . . . . . . . 140
11.2 . . . . . . . . . . . . . . . . . . . . . 140
11.3 . . . . . . . . 143
11.4 . . . . . . . . 144

12 147
12.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

13 149
13.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
13.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
13.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . 150

14 GUI tkinter 153


14.1 . . . . . . . . . . . . . . . . . . . . . . . . . 154
14.2 . . . . . . . . . . . . . . . . . . . 154
14.3 . . . . . . . . . . . . . . . . 160

15 163
15.1 . . . . . . . . . . . . . . . . . . . . . . . . . 163
15.1.1 . . . . . . . . . . . . . . . . . . . 163
15.1.2 . . . . . . . . . . . . . . . 164
15.1.3 . . . . . . . . . . . . . . . . . . . . . 164
15.2 Python Debugger . . . . . . . . . . . . . . . . . . . . . . . . . 164
15.2.1 . . . . . . . . . . . . . . . . . . . . 165
15.2.2 . . . . . . . . . . . . . . . . . . . . . . . . 165
15.2.3 . . . . . . . . . . . . . . . . . 166
15.2.4 . . . . . . . . . . . . . . . . . . . . 166
xii

16 169
16.1 . . . . . . . . . . . . . 170
16.2 . . . . . . . . . . . . 171
16.3 garbage collector . . . . . . . . . . . . . . . . . 173
16.4 . . . . . . . . . . . . . . . 173
16.5 . . . . . . . . . . . . . . . . . . . . 175
16.6 (Profiling) . . . . . . . . . . . . . . . . . . 175
1

In times of change, learners will inherit the


earth while the learned will find themselves
beautifully equipped to deal with a world that
no longer exists.

Eric Hoffer

Python 3. -
. -
.
, -
. :

Longum iter est per preaecepta, breve et efficax per exempla!

,
.
, .
, -
.

1
2 1.

1.1
-
, , -
. -
.
, -
.
.
,
,
.

1. .

2. .

p r i n t ( ' Hello , World ! ' )

3. _..

4. , _..

,
. ,

, -
.

1.2
Python
.
Linux
web applications (
Django). ,
1.2. 3

,
.

.

1.2.1

,
.
. -
, (compile)1
, ,
.
,
,
,

.
-
.
. .

1.2.2

, , -
, . -
, -
.
, -

.
,
, -
1

4 1.

. ,
( ),
,

.
, ,

.
,
. ,
,
.

1.2.3

,
. !,
.
, .
,
. ,
. ,
.
. ,
!

, ,
. , -
,

. ,
!
, !
1.2. 5

1.2.4


. -
, -

.
.
. -

-

.

1.2.5

, -
, . .
. -
.
, Python -
.
. , ,
.
.

1.2.6

.
.
,
.
,

.
6 1.

1.2.7
(compiler) -
. .
.
,
.
,
.
, -
. ,

. , -
,

.

1.2.8
.
-
. , ,
. Python
. -
,
. -
(bugs),
.

1.3 Python
Python ,
(semantics).
(standard library).
:
1.3. Python 7


 ( , )


segmentation faults

-
Python .
, -

.
.
, -
. ,
- ,
.
Python
-
( C, C++)
8 1.

Python 3 5 Ja-
va. ,
.
( -
) .
-
.
(efficiency),
(productivity).

-
, . (interpreters)
(compilers).
-

.
-
(virtual machine) (
Python). ,
, (bytecode).
-
(object code).

.
,
. -

, -
.

, (modules)
,
,
( 3 Python
1.3. Python 9

).
, -
( Windows, Linux/U-
nix, OS/2, Mac, Amiga). -
, Java, Jython -
Java, .NET
IronPython Microsoft. , -
C/C++ (modules)

Python.
, . -
1980
. ,

.
, ,
Python segmentation faults. ,
Python (
throw)
.
-

. , Python -

.
(reference counting).

1.3.1

Python, . ,
(generators), , .
,
,
( , ..).
10 1.


, , , , ( -
)
. -
Python
, -
.
, ,
, ,
. ,

-
-
.
(Python Enhancement Proposal (PEP))

(
PEP 8 PEP 257)

1.3.2 Python 3

Python ,
1980.
,

(
2 import this)
. :

7 / 4 = 1 C.

range ( )
2
Linux python3
, Windows IDLE.
1.3. Python 11

print statement
.

Unicode ( ) .

... .

,
. Python -
3 ( py3k 3000).
,
-
.
:

7 / 4 = 1.75 ( // -
)

. -
range
3
.

print

Unicode, -
.

...


Python.
3
11.2.
12 1.

1.3.3

2
:

2to3

3to2

python -3

2
3 , . -
Python (2.6+)
3 Python.
-
, PEP 3003 (Python Enhancement Proposal) -
2
Python (CPython)
( Jython, Pypy, IronPython)
.

1.3.4
Python,
:

Google ( Google App Engine)

NASA

Yahoo!

(MIT, Stanford ).

linux.

... !
1.3. Python 13

-
Python, :

1. (prototyping)

2.

3. Scripting

4.

5.

6.

7. ... !

,
. -
Python
.

1.3.5 Zen of Python


Zen of Python Python
Tim Peters.
:

import t h i s

.
.
.
.
.
.
.
-
.
14 1.

.
.
.
, .

.

.
.
.
, .
, .
(namespaces)
!

1.4 Python

1.4.1

Python
. ,
(
). .

Linux

Linux package manager -


, ( ). ,
, -
,
. ,
Python 3. -
.
1.4. Python 15

,
. , ,
( IDLE).

Mac, Python . , -
, -
.
. , -
Applications / Utilities / Terminal Python.
, , 3 .

1.4.2 Python

Python .py.
-
.
.py .
:

>>> a = 5
>>> b = 6
>>> a + b
11

(interpre-
ter), (
Linux, > > cmd Windows) python ( python3 -
).
>>> ,
.
16 1.

Windows

-
python.

1. Python PATH. ,
-> -> ->
(Control Panel -> System -> Advanced ->
Environment Variables) (path) -
Python. -
(command line) python o-
noma.py.

2. IDLE ( py-
thon ).
(File > Open). , Run Module
> Run .


Notepad Wordpad. , Note-
pad++ .

Linux

1. path
. python3 onoma.py
4 .

2. ,

#! / usr/bin/env python3


4
python 3 python3
/usr/bin
1.4. Python 17

#!/ usr/bin/python3

-
. #/usr/bin/env python3
Python 3
( /usr/bin/python3) -
. ,
. , ,
.

PEP5 8 -

Python, tab ,
(indent) .6
"Unknown option: -",
-
. Unix .
-
.

1. Notepad++

Tabs: Settings > Preferences > Edit Components > Tab settings.
Settings > Preferences > MISC > auto-indent.
: Format > Convert, Unix.

2. JEdit

: U W M , -
U
5
PEP: Python Enhancement Proposal. -
, ,
..
6
PEPs
http://python.org/dev/peps/.
18 1.

3. Mac TextWrangler

Tabs:
Auto Expand Tabs. -
Defaults > Auto-Expand Tabs Defaults >
Auto-indent.

: , -
Unix.

-
. Windows, IDLE (
) , Eclipse
pydev. Linux kate gedit,
Eclipse.
( ).
,
.

1.5
:
1
Python.
2 -
.
,
.
3 , -
.
4 -
.
5
-
.
1.5. 19

6 :

.
7 Python -

.
8 -
: .
.
9
. ,

.
10
.
11
Python, .
13
.
14

(tkinter)
Python.
15 -
.
, 16
( -
).
20 1.
2

, , ,
: .

. ,


.
-

. -
,
, . ,

-

. ,
Structure and Interpretation of Computer Programs :

1. , -
.

21
22 2.

2. -
.

3. -
.


-
.

2.1
, -
. , Python .

2.1.1. bit -
. bits
-
.

2.1.2.
.

.
print . -
,
. ,
. , ,
, .

print ( 1 )
p r i n t ( ' asdf ' )
primeNumbers = 1 , 2 , 3 , 5 , 7
p r i n t ( primeNumbers )

Python .
,
2.2. 23

, .
dynamic typing. ,
Python
.
. :

a = ' asdf '


a = 2
a = pow ( a , 100000)
print ( a )

a -

.

2.1.3. (dynamically
typed),
.
,

. , -
Python
.

2.2
2.2.1. -
.
. , .

num = 17
pi = 3.14
paei = ' Allou '
paei = ' Molis g y r i s e '
24 2.

-
. , ,
. , -
. , ,
.
, -
. -
pi
3.14 .

pi = 3.14
p r i n t ( pi 2)

2.3 Boolean
2.3.1. Boolean
.

5 == 5 ()

5 == 6 ()

True and False ()

True or False ()

Boolean -
. -

.
Boolean :

not

or

and
2.3. Boolean 25

2.1: not

a b



2.2: and

a b



2.3: or


(
and), (-
or) ( not
and)1 . .
1
De Morgan
.
26 2.

>>> a = 5
>>> b = 4
>>> a > b
True
>>> c = 6
>>> a > b and a > c
False
>>> a > b or a > c
True
>>> a > b and not a > c
True
>>> a > b or not a > c
True
>>> not a > b or not a > c
True
>>> not ( a > b ) or a > c
False
>>> not a > b or a > c
False

2.4
Boolean (
) -
.

2.4.1. -
.
.

,
5.
:
2.4. 27

(+)

()

()

(/)

()

(modulo) (%)

. -
. Python

.

(==)

(! =)

(>)

(<)

(>=)

(<=)
28 2.
3

It is not enough to do your best; you must


know what to do, and then do your best.

W. Edwards Deming

3.1

.
.

3.1.1. -
( ).
-
.
:

: -
.

:
( , , ).

: .

29
30 3.

! Python !
:

IndentationError : expected an indented block

.
tabs

.
tabs .
, PEP
8 .

. ,
.
,
. , Python

.

3.2
3.2.1.
, .

, -
,
. -
-
.
. -
.
sequential, .
:

p r i n t (123)
3.3. 31

print ( )
print ( ' Hello ' , end= ' ' )
print ( ' World ' )

print() , -
, .
end
.
, -

(program counter).


.

3.3

3.3.1. :

(statement) (unconditional branch


or jump).

-
.


(, ).

,
.
32 3.

3.4 if
-
, if
.
, -
if ,
if.

answer = i n t ( input ( ' What i s the product o f 2 5: ' ) )

i f ( answer == 1 0 ) :
p r i n t ( ' Correct ! ' )

p r i n t ( ' Exiting program ' )

, -
.

:

What i s the product o f 2 5: g


Traceback ( most recent c a l l l a s t ) :
F i l e " <stdin > " , l i n e 1 , in <module>
ValueError : i n v a l i d l i t e r a l for i n t ( ) with base 10: ' g '

g
int(), ,
ValueError.
.
.
-
,
if...else....

from math import sqrt


3.4. if 33

a = f l o a t ( input ( " C o e f f i c i e n t o f the x^2: " ) )


b = f l o a t ( input ( " C o e f f i c i e n t o f the x : " ) )
c = f l o a t ( input ( " Constant : " ) )

i f a == 0:
print ( " This i s not a 2nd degree equation " )
import sys
exit ( )

D = b2 4 a c

i f D >= 0:
x1 = (b + sqrt (D ) ) / (2 a )
x2 = (b sqrt (D ) ) / (2 a )
else :
x1 = complex(b / (2 a ) , sqrt (D) / 2 a )
x2 = complex(b / (2 a ) , sqrt (D) / 2 a )

s f = " x1 = { 0 } , x2 = { 1 } "
print ( s f . format ( x1 , x2 ) )

-
.
-
.

+
: x1,2 = , = 2 4 . -
2
(
if 1 ( else).

1
0 ,

.
34 3.

3.4.1
if...elif...else...

Python, switch -
k , k
switch.
switch C/C++ Java. Py-
thon, if...elif...else....
:

x = i n t ( input ( " Please enter an i n t e g e r : " ) )


i f x < 0:
p r i n t ( ' Negative number, transforming i n t o p o s i t i v e ' )
x = x # make i t p o s i t i v e
# Be careful , because the f o l l o w i n g statements w i l l be
# examined only i f the f i r s t condition i s f a l s e , they
# won ' t be executed
e l i f x == 0:
p r i n t ( ' Zero ' )
e l i f x == 1:
p r i n t ( ' One ' )
else :
p r i n t ( ' Great than 1 ' )

, elif
, .

switch,
.
Python

.
(key)
. -
3.4. if 35

,
, .

# Sample functions
def square ( x ) :
return x 2

def double ( x ) :
return x 2

opdict = { " a " : square , " b " : square , " c " : double }

# Example ( random access O( 1 ) )


print ( opdict [ " b " ] ( 5 ) )

# Example 2 ( checking everything )


for operation in " abc " :
prin t ( operation , opdict [ operation ] ( 3 ) )

if...elif...else....
, ,
.
, ,

.

# Sample functions
def square ( x ) :
return x 2

def double ( x ) :
return x 2

def decrease ( x ) :
return x1
36 3.

opdict = { " a " : square , " b " : double , " c " : decrease }

try :
p r i n t ( opdict [ " d " ] ( 5 ) )
except KeyError :
p r i n t ( ' I n v a l i d use o f index ' )

# Example 2 ( checking everything )


for operation in " abc " :
p r i n t ( operation , opdict [ operation ] ( 3 ) )

3.5
,
.
( )
, . ,
for while .

3.5.1 for
for . -
range(). ,
range() , -
.
20 Fibo-
nacci. n-
Fibonacci Fn = Fn1 + Fn2 F0 = 0 F1 = 1.

# the 2 f i r s t f i b o n a c c i numbers are always known


a, b = 0, 1
# p r i n t the f i r s t f i b o n a c c i number ( a )
p r i n t ( a , end= ' ' )
3.5. 37

# find the next 18 f i b o n a c c i numbers and p r i n t them


for i in range ( 1 8 ) :
prin t ( b , end= ' ' )
a, b = b, a + b

# print the l a s t fibonnaci number ( o f t o t a l l y 20)


print ( b )

i 0 17,
18 . 2
range() .
range() ,
.

>>> for i in range (100 , 120):


... p r i n t ( i , end= ' ' )
...
100 101 102 103 104 105 106 107 108 109 110
111 112 113 114 115 116 117 118 119

>>> for i in range (100 , 120, 2 ) :


... p r i n t ( i , end= ' ' )
...
100 102 104 106 108 110 112 114 116 118


[100, 120) -
[100, 120) 2,
.

.

2
, .
38 3.

3.5.2 while
for, while
.

def f i b ( a , b ) :
sum = 0;
while a < 4 (10 6 ) :
sum += a
a, b = b, a + b
return sum

a, b = 0, 1
print ( f i b ( a , b ) )


Fibonnaci 4 106 .

3.6 break
break -
.
, if
.
break
.
. ,
.
-
Zn (modulo).
0,
.

def printSubgroups ( n ) :
"""
Prints a l l the subgroups o f Zn
3.7. with 39

"""
for i in range ( 0 , n ) :
p r i n t ( ' < ' , end= ' ' )
p r i n t ( i , end= ' >: ' )
for j in range ( 1 , n + 1 ) :
num = ( i j )%n
p r i n t (num, end = ' ' )
i f (num % n ) == 0:
break
p r i n t ( ' , ' , end= ' ' )
print ( )

3.7 with
3 Python, with ,
.
.
with , with
.
, block with. with


.

filename = "CanadaSong . t x t "

data = " " " \


F i r s t come the black f l i e s ,
Then the Horse f l i e s ,
Then the Deer f l i e s ,
Then the snow f l i e s !
"""

with open ( filename , "w" ) as fout :


40 3.

fout . write ( data )

, with, filename,
.
,
. , with
.

3.7.1 with

with
, with -
.
. -

,
.

# every l i n e containing these words won ' t be written


# at the output
exclude_class = [ ' not ' , ' negation ' ]

with open ( ' i n f i l e ' , ' r ' ) as f1 , open ( ' o u t f i l e ' , 'w ' ) as f2 :
# f o r each l i n e in the input f i l e
for l i n e in f1 . readlines ( ) :
# by d e f a u l t write a l i n e to the o u t f i l e unless
# i t doesn ' t contain one o f the excluded words
w r i t e _ t o _ f i l e = True
# f o r each word in a l i n e o f the input f i l e
for word in l i n e . s p l i t ( ) :
# i f t h i s word doesn ' t belong to closed_class
i f word . r s t r i p ( ) in exclude_class :
w r i t e _ t o _ f i l e = False
break
if write_to_file :
3.7. with 41

f2 . write ( l i n e )

3.7.2
__en-
ter__ __exit__, with
__enter__ , -
,
__exit__.
.
with __exit__,

( ,
).
with, -
__exit__, .

.
42 3.
4

And there was huge numbers of UFOs around


my parents home in Kingston.

Betty Hill)

Python -

. -
:
(scripts). scripts.
.
Python , -
,
. , -
. -

(overflow). -
.
python
,
:

43
44 4.

python

. -
, ctrl+d Linux/BSD ctrl+z Windows.

4.1
(, , , ) -
(+, , , /)

>>> 3+8
11
>>> 38
5
>>> 38
24
>>> 3/8
0.375

4.1.1

.
( )
.

>>> 7/2
3.5
>>> 7//2
3

4.1.2

,
.
4.2. 45

>>> 210
1024
>>> 38
6561

-
n (mod n ),
python (modular exponentiation)
, .
,
.
,
21024 , 1024
1000 . Python
.

>>> pow( 2 , 1024, 1000)


216

4.2
,
:

1. d:

2. b: ( bin())

3. o: ( oct())

4. x: ( hex())

, -
.
46 4.

p r i n t ( ' value = { 0 : 2 d } ' . format ( 1 2 ) ) # value = 12


p r i n t ( ' value = { 0 : 2 b } ' . format ( 1 2 ) ) # value = 1100
p r i n t ( ' value = {0:#2b } ' . format ( 1 2 ) ) # value = 0b1100
p r i n t ( ' value = { 0 : 2 o } ' . format ( 1 2 ) ) # value = 14
p r i n t ( ' value = {0:#2 o } ' . format ( 1 2 ) ) # value = 0o14
p r i n t ( ' value = { 0 : 2 x } ' . format ( 1 2 ) ) # value = c
p r i n t ( ' value = {0:#2 x } ' . format ( 1 2 ) ) # value = 0xc

p r i n t ( ' value = { 0 : 5 } ' . format ( bin ( 1 2 ) ) ) # value = 0b1100


p r i n t ( ' value = { 0 : 5 } ' . format ( oct ( 1 2 ) ) ) # value = 0o14
p r i n t ( ' value = { 0 : 5 } ' . format ( hex ( 1 2 ) ) ) # value = 0xc

4.3
,
(specifier) f .
. , +,
.
.

p r i n t ( ' x = { 0 : 5 . 3 f } ' . format (1234.567)) # x = 1234.567


p r i n t ( ' x = { 0 : 1 2 . 6 f } ' . format (1234.567)) # x = 1234.567000
p r i n t ( ' x = {0: 12.9 f } ' . format (1234.567)) # x = 1234.567000
p r i n t ( ' x = {0:+12.9 f } ' . format (1234.567)) # x = +1234.567000
p r i n t ( ' x = {0:+12.9 f } ' . format ( 1234.567)) # x = 1234.567000
p r i n t ( ' x = {0:012.3 f } ' . format (1234.567)) # x = 00001234.567
print ( )
p r i n t ( ' x = { 0 : 1 . 5 e } ' . format (1234.567)) # x = 1.23457e+03
p r i n t ( ' x = { 0 : 1 . 5 e } ' . format (0.000001234)) # x = 1.23400e06
p r i n t ( ' x = { 0 : 1 . 5 g } ' . format (0.000001234)) # x = 1.234e06
print ( )
p r i n t ( ' x = {0:2.3%} ' . format ( 0 . 3 3 7 ) ) # x = 33.700%
print ( )
4.4. 47

print ( ' pi = { 0 : . 3 f } ' . format ( math . pi ) ) # pi = 3.142


print ( ' pi = { 0 : . 8 f } ' . format ( math . pi ) ) # pi = 3.14159265

4.4

(, -
, ). -
complex. ,
.

a = complex ( 1 , 1)
b = complex ( 1 , 2)
print ( a+b )
print ( a b )
48 4.
5

, (
)

.

.

, ,

-
. -
,
. -
, -
. ,
.
Python -
.
, ,
. ,
, -
. ,

49
50 5.

,
, .

5.1
5.1.1. -
.


.
, .

5.1.2.
.
.

5.1.3.
return.
return,
.


. ,
.

def add ( a , b ) :
c = a + b

return c

p r i n t ( add ( 2 , 3 ) )


.
5.2. 51

from math import c e i l

def fun2 ( c ) :
a = c // 2
b = c a

return a , b

d , e = fun2 ( 7 )
print ( d , e )

1. , .
def .

2. (:). -
,
.

3.
() ( ).
-
.

5.2 -

(Pure Functions)
. ,
(modifier functions) -
. -
(side effects),
,
.
52 5.

a = ' Python '


p r i n t ( a . upper ( ) )
print ( a )

, upper()

. ,
string
a.
, (mutable),
, . ,
, count() b, reverse()
.

b = [ 'a ' , 'b ' , ' c ' , 'd ' , ]


p r i n t ( b . count ( ' a ' ) )
print ( b )
p r i n t ( b . reverse ( ) )
print ( b )

5.3 (Docstrings)
, .
,
.
Python, , -

.

def f i b o n a c c i ( n ) :
" " " Return the nth Fibonacci number counting from 0. " " "

# we should have used the closed formula f o r f i b o n a c c i


# TODO: throw an e r r o r f o r negative numbers
5.3. (Docstrings) 53

i f n <= 1:
return n
return f i b o n a c c i ( n 1) + f i b o n a c c i ( n 2)

print ( f i b o n a c c i ( 1 0 ) )

,
-
.


. -
. ,
, ()
. -
PEP 257,

,
-
.
, .

-
Python.

>>> help ( fibonnaci )


>>> prin t ( f i b o n a c c i . __doc__ )


.
,
__doc__
Python.
, Python
.
54 5.

5.4

.
-
.
,
.

def h e l l o ( message= ' Hello World ! ' ) :


p r i n t ( message )

hello ( )
h e l l o ( message= ' Hello Brave New World ! ' )

5.4.1

. -
.
.
, tuple -
.

>>> a = ( 1 , 2 , 3 , 4)
>>> def add ( a , b , c , d ) :
... return a + b + c + d
...
>>> add ( a )
10

-
.
, .
,
( )
5.5. 55

.
.

b = { 'a ' :2 , ' c ' : 3 , 'd ' : 5 , 'b ' : 1 }

def p r i n t _ v a r i a b l e s ( a , b , c , d ) :
prin t ( ' a : { } ' . format ( a ) )
prin t ( ' b : { } ' . format ( b ) )
prin t ( ' c : { } ' . format ( c ) )
prin t ( ' d : { } ' . format ( d ) )

p r i n t _ v a r i a b l e s ( b )

varargs
default arguments ( ) Python.

5.5
-
. -
-
. , .
.
lambda
.
. , lambda -
def. -
1 . ,
,
return. -
.

def double ( x ) :
return x x
1
.
56 5.

def p r i n t _ r e s u l t s ( f , args ) :
p r i n t ( f ( args ) )

p r i n t _ r e s u l t s ( double , 5) # prints 25
p r i n t _ r e s u l t s ( lambda x : x x , 5) # prints 25

5.6 (Decorators)
-

. -
,
-
(randomized algorithm).
Python
. , -
.
. , -
, .
, -
. ,

.
Python
-
. , -
.
,
(decorators).

def makebold ( fn ) :
def wrapped ( ) :
return " <b> " + fn ( ) + " </b> "
5.6. (Decorators) 57

return wrapped

def message ( ) :
return " TasPython Guide "

message = makebold ( message )


print ( message ( ) )

g -
f . g f .
, makebold() -
wrapped().
wrapped() . -
. ,
f n wrapped()
. wrapped()
,
makebold().
message make-
bold(message). , Python .
, makebold(message)
message. message
-
, , .
makebold(), -
wrapped(). wrapped() makebold()
string fn . -
.
,
.
, -
.

def makebold ( fn ) :
def wrapped ( ) :
58 5.

return " <b> " + fn ( ) + " </b> "


return wrapped

@makebold
def message ( ) :
return " Python Guide "

p r i n t ( message ( ) )

, ,
message()
-
,
. , message(),
makebold.
6

There is no abstract art. You must always


start with something. Afterward you can
remove all traces of reality.

Pablo Picasso

.


.
-
. , ,
-
,
Python . ,

.

59
60 6.

6.1

6.1.1
(Strings): (quotes). -
immutable
.

' This i s a s t r i n g '

(Tuples): ,

. .

( ' These ' , 3 , 5.711 , True , ' Prime ' )

(Lists): [ ].
. -
(mutable).

[ ' These ' , 3 , 5.711 , True , ' Prime ' ]

(Dictionaries): { }
. ( )
:

 key: .
 value: ,
.

{ 1 : ' alpha ' , 2: ' beta ' , 3: 'gamma ' , 4: ' d e l t a ' }

(Sets): ,
set .

.
6.2. 61

( (union), (in-
tersection), (difference), (issuperset), -
(issubset)) (add), (remove) .

6.1
.


(string)
.
(tuple) .
.
(list) .
keys.
(dictionary)
.

6.1:

6.2

6.2.1
, ,
.
,
.
UTF-8.

# the v a r i a b l e myString points to an immutable s t r i n g


myString = ' This i s a s t r i n g . '

(sequence).
,
.
62 6.

myString = ' This i s a s t r i n g . '


# the f i r s t character o f myString
p r i n t ( myString [ 0 ] )
# the second character o f myString
p r i n t ( myString [ 1 ] )
p r i n t ( myString [ 2 ] )
p r i n t ( myString [ 3 ] )
# prints the l a s t character which i s '. '
p r i n t ( myString [ len ( myString ) 1 ] )



() (index).

# the v a r i a b l e myString points to an immutable s t r i n g


myString = ' This i s a s t r i n g . '
# the l a s t character o f myString
# prints ' . '
p r i n t ( myString [ 1])
# prints ' g ' .
p r i n t ( myString [ 2])
# prints ' n ' .
p r i n t ( myString [ 3])

6.2.2

,
-
. ,
.

def reverse ( t e x t ) :
return t e x t [ : : 1 ]
6.2. 63

sentence = input ( ' Enter your t e x t : ' )

i n v e r t = reverse ( sentence )

print ( ' The inverted t e x t i s : ' , i n v e r t )

,
.
:

def r e v e r s e p a r t i a l l y ( t e x t ) :
return t e x t [3:1: 1]

sentence = input ( ' Enter your t e x t : ' )

i n v e r t = r e v e r s e p a r t i a l l y ( sentence )

print ( ' The inverted t e x t i s : ' , i n v e r t )

3,
2, -
. Python,
, 0.

6.2.3


string.format(). python, strings -
.
,
{x}, x
.

s f = ' the { } jumped over the { } ! '


print ( s f . format ( ' mouse ' , ' moon ' ) )
64 6.

6.2.4
repr() ,

-
.
rjust() string, -
, .

for x in range ( 1 , 1 1 ) :
p r i n t ( repr ( x ) . r j u s t ( 2 ) , repr ( x x ) . r j u s t ( 3 ) , \
repr ( x x x ) . r j u s t ( 4 ) )

, ,
, -
format().

for x in range ( 1 , 1 1 ) :
p r i n t ( ' { 0 : 2 d } { 1 : 3 d } { 2 : 4 d } ' . format ( x , x x , x x x ) )

split().

>>> a = ' asdf '


>>> b = ' asdasdfnbfds '
>>> a . s p l i t ( '' )
[ ' asdf ' ]
>>> b . s p l i t ( '' )
[ ' asdasdf ' , ' nbfds ' ]

split()
.
,
, .

6.2.5
,

6.2. 65

# count l i n e s , sentences , and words o f a t e x t f i l e

# set a l l the counters to zero


lines , blanklines , sentences , words = 0 , 0 , 0 , 0

# t r y to open the f i l e
try :
filename = ' random_file '
t e x t f = open ( filename , ' r ' )
except IOError :
print ( ' Cannot open f i l e { 1 } f o r reading ' , filename )
# import sys only i f needed
import sys
# e x i t the program
sys . e x i t ( 0 )

# reads one l i n e at a time


for l i n e in t e x t f :
# increase l i n e counter
l i n e s += 1

# i f i t i s an empty l i n e
i f l i n e . startswith ( ' \n ' ) :
blanklines += 1
else :
# assume that each sentence ends with . or ! or ?
# so simply count these characters
sentences += l i n e . count ( ' . ' ) + l i n e . count ( ' ! ' ) + \
l i n e . count ( ' ? ' )

# create a l i s t o f words
# use None to s p l i t at any whitespace regardless o f length
66 6.

# so f o r instance double space counts as one space


tempwords = l i n e . s p l i t ( None )

# word t o t a l count
words += len ( tempwords )

# close t e x t f i l e
t e x t f . close ( )

p r i n t ( " Lines : " , lines )


p r i n t ( " Blank l i n e s : " , blanklines )
p r i n t ( " Sentences : " , sentences )
p r i n t ( "Words : " , words )

6.3
6.3.1.
.
.

.
,
. Python
. -

. .
,
.

l i s t 1 = [ ' pick up g r o c e r i e s ' , 123,\


' do laundry ' , 3.14 , ' return l i b r a r y books ' ]
# an empty l i s t
list2 = [ ]
6.3. 67

# a l i s t may contain any type o f o b j e c t


l i s t 3 = [ l i s t 1 , l i s t 2 , 1.234 , ' This i s a diverse l i s t ' ]
print ( l i s t 3 )

,
. , ,
, .

6.3.1

.

list1 = [ ]

,
. list() ,
.
,
.

a = [1 ,2 ,3 ,4]

b = list (a)
c = [a]

print ( b )
print ( c )


list() . list()
, Python

.

a = [1 ,2 ,3 ,4]
68 6.

b = list (a)
c = a

print ( b )
print ( c )

# b i s a copy o f a and any change


# on i t doesn ' t a f f e c t a
b[0] = 5
print ( a )
# c i s a reference to a and a l l
# changes are r e f l e c t e d to a
c [ 0 ] = 10
print ( a )

6.3.2
, -
, ,
. -
.

,
list1[j] list1[j 1].
, n ,
list1[n] list1[n 1]
.

n = len ( l i s t 1 )

list1 [0]
6.3. 69

[i, j):

list1 [ i : j ]


,
.
10
( -
) ,
:

a = [ x for x in range ( 1 0 ) ]
# or a = l i s t ( range ( 1 0 ) )
print ( a [ 2 : 8 : 2 ] )

[i, j) k

list1 [ i : j :k]

list1 [ : : k]

k ,
,
(
).

def reverse ( l i s ) :
return l i s [ : : 1 ]
70 6.

6.3.3

-
for.

a = [ 1 , 1 , 2 , 3 , 5 , 8]

for i in a :
print ( i )

, -
,
.

a = [ 1 , 1 , 2 , 3 , 5 , 8]

b = iter (a)
p r i n t ( next ( b ) )
p r i n t ( next ( b ) )
p r i n t ( next ( b ) )

6.3.4

,
del
.

.

a = [ 0 , 1 , 2 , 3 , 4 , 5]

del a [ 2 : 4 ]
print ( a )
6.3. 71

6.3.5 (Lists comprehensions)



(list comprehensions). -
,
.
.

primes = [ 1 , 2 , 3 , 5 , 7]

square_primes = [ i 2 for i in primes ]


print ( square_primes )

list comprehension
. .
:

r e s u l t = [ transform i t e r a t i o n f i l t e r ]

(transform)
1 (iteration) -
(filter), .

.
-
. ,
for, -
.
. , ,
, -
sum(). , 100
3 7.

nums = [ i for i in range ( 1 , 101) i f i % 3 == 0 or i % 7 == 0]


sum(nums) #2208

1
-
.
72 6.

6.3.6

,
. .

6.3.2. . :

push ( append Python)

pop

a = [ 1 , ' TasPython ' , ' geia ' ]


a . append ( ' xara ' )
print ( a )
b = a . pop ( )
print ( b )

6.4
6.4.1. . -
.

.
,
. , ,
.

a = ( 1 , ' asdf ' , 3.14)


print ( a )
6.5. 73

, -
.
,
.

6.5
(dictionary)
. 2 ,
,
,
( ) .

6.5.1

d = {
' milk ' : 3.67 ,
' butter ' : 1.95 ,
' bread ' : 1.67 ,
' cheese ' : 4.67
}


.
.

d = {}
d [ ' key ' ] = value

di-
ct().
2
hash
.
74 6.

d = d i c t ( [ ( ' milk ' , 3.67) ,


( ' butter ' , 1 . 9 5 ) ,
( ' bread ' , 1.67) ,
( ' cheese ' , 4 . 6 7 ) ] )

6.5.2
: del. del d[milk]
.

: (
/) len(d).

: ( )
d.keys().

: , d.values().

/ : /
d.items()
,
.

, -
.
,
,
, -
.
.
.

def increaseValue ( d , key , value ) :


" " " Increase value o f d [ key ] .
Precondition : We can add value to 0.
"""
6.5. 75

i f key not in d :
d [ key ] = 0

d [ key ] += value

def increaseValue2 ( d , key , value ) :


" " " Increase value o f d [ key ] .
Precondition : We can add value to 0.
"""

# get the value o f d [ key ] i f i t e x i s t s ,


# or zero i f i t doesn ' t e x i s t .
# Then add i t to value and set i t
# as the new value o f d [ key ]
d [ key ] = d . get ( key , 0) + value

# testing
d = {}
increaseValue2 ( d , ' d i m i t r i s ' , 5)
print ( d )

.
, (
).
(value).


. get .
d[key]
.
value
d[key] .
76 6.

6.5.3
.

,
.

d = {
' milk ' : 3.67 ,
' butter ' : 1.95 ,
' bread ' : 1.67 ,
' cheese ' : 4.67
}
for food in d :
p r i n t ( ' { } costs { } ' . format ( food , d [ food ] ) )

items() ,
.

thoughts = { 'Omada ' : ' TasPython ' ,\


' Ti e i n a i o Anthropos ' : 'Command not found ' }
for k , v in thoughts . items ( ) :
print ( k, v )

6.5.4
(mutable).

.
, copy().

d [ ' a ' ] = 123


c = d
c [ ' a ' ] = 1821
print ( d [ 'a ' ] )

:
6.5. 77

d = {}
d [ ' a ' ] = 123
c = d . copy ( )
c [ ' a ' ] = 1821
print ( d [ ' a ' ] )

6.5.5 (Dict comprehension)


, .
, {}
(ite-
rable), .
.

d = { k : v for k , v in enumerate ( ' taspython ' ) i f v not in ' tas ' }


print ( d ) # { 8 : ' n ' , 3: ' p ' , 4: ' y ' , 6: ' h ' , 7: ' o ' }

d = { k : v for k , v in z i p ( range ( 1 5 ) , ' taspython ' ) i f v not in ' tas ' }


print ( d ) # { 8 : ' n ' , 3: ' p ' , 4: ' y ' , 6: ' h ' , 7: ' o ' }

,
Python.
. , -
.

6.5.6
,
/ . , -
.
-
.
. -
. ,
78 6.

, .
(
),
.

from c o l l e c t i o n s import OrderedDict

d = OrderedDict ( )
d [ ' python ' ] = ' TasPython '
d [ ' guide ' ] = ' Greek '
p r i n t ( d . items ( ) )

6.6


, ,
, .

.

6.6.1

.
Python ,

.

s = { 'a ' , 'a ' , 'b ' , ' c ' , 'a ' }
print ( s )



(iterable).
6.6. 79

s = set ( ' TasPython . . . because simplcity matters ! ' )


print ( s )

6.6.2
, :

a = set ( ' abracadabra ' )


b = set ( ' alacazam ' )
print ( ' A = ' , a )
print ( 'B = ' , b )
a . add ( ' z ' ) # add element
b . remove ( ' z ' ) # remove element
print ( ' A = ' , a )
print ( 'B = ' , b )
print ( ' A B = ' , a b ) # difference
print ( ' A | B = ' , a | b ) # union
print ( ' A & B = ' , a & b ) # intersection
print ( ' A ^ B = ' , a ^ b ) # symmetric d i f f e r e n c e


:
80 6.

a = [ ' apple ' , ' bread ' , ' carrot ' , ' carrot ' ]
set1 = set ( a )
p r i n t ( set1 )
p r i n t ( ' apple ' in set1 )
set2 = set1 . copy ( )
set2 . add ( ' d e l i c i o u s ' )
p r i n t ( set1 < set1 )
set1 . remove ( ' bread ' )
# prints { ' carrot ' , ' apple ' }
p r i n t ( set1 & set2 )
# prints { ' carrot ' , ' apple ' , ' d e l i c i o u s ' , ' bread ' }
p r i n t ( set1 | set2 )
7


,
.

Python . -
,


Python.

7.1 (immutable objects)


Python -
.
. -
, -
.

bool

int

81
82 7.

float

string

-
, .
id() 1
. is
True .

>>> a = 5
>>> b = 5
>>> c = 5.0
>>> d = ' 5 '
>>> id ( a )
137061184
>>> id ( d )
3073418688
>>> a i s b
True
>>> c i s d
False

, -
, a
is b .


.
-
,
-
.
1
,
, , .
7.2. 83

>>> a = 4
>>> b = 4
>>> a i s b
True
>>> a += 1
>>> a
5
>>> b
4

7.2
, , .

7.1. .

7.2. (sco-
pe).

. , -
, ,
.

7.3. (scope)
. (scope).

Python, -
. ,
(
) .
.

g = " I am a g l o b a l v a r i a b l e "

def function1 ( arg ) :


84 7.

a = " I am a l o c a l v a r i a b l e "
print ( g )
# g += ' modified ' # produces an e r r o r
p r i n t ( arg )

#p r i n t ( a ) # produces an e r r o r

function1 ( "A reference to me i s passed . " )

, , g -
.
function1 . , -
a ,
. -
a function1
.

.
, Python
.
global.

g = " I am a g l o b a l v a r i a b l e "

def function1 ( arg ) :


global g
a = " I am a l o c a l v a r i a b l e "
print ( g )
g += ' modified '
print ( g )
p r i n t ( arg )

function1 ( "A reference to me i s passed . " )

-
7.2. 85

global,

.

g = " I am a g l o b a l v a r i a b l e "

def function1 ( arg ) :


g = " I thought I was g l o b a l "
prin t ( g )

function1 ( "A reference to me i s passed . " )

print ( g )

,
. ,
nonlocal global
. ,
.

def function1 ( ) :
a = " Scope1 v a r i a b l e "
def function2 ( ) :
nonlocal a
a += " modified "
print ( a )
function2 ( )

function1 ( )

nonlocal
.
86 7.

7.3
Python
(container types). :

(tuple)

(string)

(list)

(set)

(dictionary)


.

.
(alias) , .

>>> a = ' Python by example '


>>> b = ' Python by example '
>>> a i s b
False
>>> a = 1
>>> b = 2
>>> a i s b
False
>>> b = 1
>>> a i s b
True

is -
==.
2 ==
.
2
,
.
7.3. 87

>>> a = [ 1 , 2 , 3]
>>> b = [ 1 , 2 , 3]
>>> a i s b
False
>>> a == b
True

7.3.1
(alias) -
, -
. , , ,
,
.

a = [ 1 , 2 , 3]
b = a
a . append ( 4 )
print ( b )

4 -
a, b, b
a .

7.3.2 None
None -
. Null.
Null Python

None.

def helloWorld ( ) :
prin t ( ' Hello World ' )
88 7.

p r i n t ( helloWorld ( ) == None )

None
. None
,
.
: None.
,
. ,
, None

.

p = [ 1 , 2 , 3 , 4]
print ( p )
# i l l e g a l statement because the returned value i s None
#p = p . pop ( )
p . pop ( )
print ( p )

7.4
-
(
) .
.
Python, , -
. ,
:

from f i l e import

python.py .
,
, -
7.4. 89

.
. ,

( )
.

7.4.1. (module) -
(, ). -
.py.
(
)
, -
( ). (
python file.py) import
. Python ,
"__name__" "__main__".
"__name__"


.

from module import *


,
.
from module
import function ( ) -
import module,
module, module.variable, -
(
) /
.
-
. :

.
90 7.

-
namespace :

List1 = [ 1 , 2 , 3]
List2 = [ 1 , 2 , 3]
List2 [ 2 ] = "new"
List1 = { " a " : [ 1 ] , " b " : [ 2 ] }

1 2 3

aList [0] [1] [2]

Namespace

7.1: (namespace) .

7.5

.

>>> def f ( a ) :
... a = 5
...
>>> a = 4
>>> f ( a )
>>> a
4
7.5. 91

1 2 3

aList [0] [1] [2]

bList

Namespace

7.2:
.

1 2 "new"

aList [0] [1] [2]

bList

Namespace

7.3: .

a [0] 1
aDict
b [0] 2

Namespace

7.4: .
92 7.

a f
, . ,
a = 5 .

,
.
, L -
. , x
L. ,
x .
. , , L
, .
, , -
.
,
x . , L
foo()

.

def foo ( x ) :
p r i n t ( ' point 2: ' , end= ' ' )
p r i n t ( id ( x ) )
x = [ 1 , 2 , 3]
p r i n t ( ' point 3: ' , end= ' ' )
p r i n t ( id ( x ) )
print ( x )

L = [ 3 , 2 , 1]
p r i n t ( ' point 1: ' , end= ' ' )
p r i n t ( id ( L ) )
foo ( L )
p r i n t ( ' point 4: ' , end= ' ' )
p r i n t ( id ( L ) )
7.5. 93

print ( L )



, L .
L -
,
.
foo() , -
L, python

L error
.
Python

.

def foo ( ) :
print ( ' point 2: ' , end= ' ' )
# Error . L i s not declared in t h i s scope
print ( id ( L ) )
L = [ 1 , 2 , 3]
print ( ' point 3: ' , end= ' ' )
print ( id ( L ) )
print ( L )

L = [ 3 , 2 , 1]
print ( ' point 1: ' , end= ' ' )
print ( id ( L ) )
foo ( )
print ( ' point 4: ' , end= ' ' )
print ( id ( L ) )
print ( L )
94 7.

:

.
, , -
-
, ,
, -
, .

def foo ( x ) :
p r i n t ( ' point 2: ' , end= ' ' )
p r i n t ( id ( L ) )
x . append ( 0 )
p r i n t ( ' point 3: ' , end= ' ' )
p r i n t ( id ( x ) )
print ( x )

L = [ 3 , 2 , 1]
p r i n t ( ' point 1: ' , end= ' ' )
p r i n t ( id ( L ) )
foo ( L )
p r i n t ( ' point 4: ' , end= ' ' )
p r i n t ( id ( L ) )
print ( L )

7.6
,
-
.
, deepcopy.

Python -
.
7.6. 95

from copy import deepcopy

def a c c e s s _ t r i e ( d , sequence , p o s i t i o n =None ) :


"""
Access the d i c t i o n a r y which i s r e f e r r e d by applying
consequently each term o f the sequence . In a more python
terms , i f sequence i s ' key ' , access : d [ ' k ' ] [ ' e ' ] [ ' y ' ] .
Assume that the d i c t i o n a r y i s at the ` position ` o f a l i s t ,
i f ` position ` i s an argument .

>>> a = { ' k ' : [ 0 , { ' a ' : [ 0 , { ' l ' : [ 0 , { ' o ' : [ 1 , { } ] } ] } ] } ] }


>>> a c c e s s _ t r i e ( a , ' kal ' , 1)
{ ' o ': [1 , { } ] }
>>> a c c e s s _ t r i e ( a , ' kalo ' , 1)
{}
>>> a = { ' p ' : { ' y ' : { ' t ' : { ' h ' : { ' o ' : { ' n ' : {}}}}}}}
>>> a c c e s s _ t r i e ( a , ' pyt ' )
{ 'h ': { ' o ': { 'n ': {}}}}
>>> a c c e s s _ t r i e ( a , ' ')
{ 'p ': { ' y ': { ' t ': { 'h ': { ' o ': { 'n ': { } } } } } } }
>>> a c c e s s _ t r i e ( a , ' python ' )
{}
>>> b = a c c e s s _ t r i e ( a , ' pyth ' )
>>> b [ ' O ' ] = ' 123 '
>>> a
{ ' p ' : { ' y ' : { ' t ' : { ' h ' : { ' O ' : ' 123 ' , ' o ' : { ' n ' : {}}}}}}}

"""

for c in sequence :
d = d[ c ]
i f p o s i t i o n i s not None :
d = d [ position ]
96 7.

return d

def p o p u l a t e _ t r i e ( t r i e , sequence , p o s i t i o n =None ) :


"""
Populate a t r i e .

Assume that the counter i s always at ` position ` 0 while the


` position ` o f the d i c t i o n a r y i s the l a s t one .

>>> t r i e = { }
>>> p o p u l a t e _ t r i e ( t r i e , ' python ' )
{ 'p ': { ' y ': { ' t ': { 'h ': { ' o ': { 'n ': {}}}}}}}
>>> t r i e = { }
>>> p o p u l a t e _ t r i e ( t r i e , ' kalo ' , 1)
{ 'k ': [1 , { ' a ': [1 , { ' l ': [1 , { ' o ': [1 , { } ] } ] } ] } ] }
>>> t r i e = { }
>>> p o p u l a t e _ t r i e ( t r i e , ' heh ' , 2)
{ 'h ': [1 , 0, { ' e ': [1 , 0, { 'h ': [1 , 0, { } ] } ] } ] }
>>> t r i e = { }
>>> t r i e = p o p u la t e _ t r i e ( t r i e , ' heh ' , 1)
>>> p o p u l a t e _ t r i e ( t r i e , ' ha ' , 1)
{ 'h ': [2 , { ' a ': [1 , { } ] , 'e ': [1 , { 'h ': [1 , { } ] } ] } ] }

"""

i f ( p o s i t i o n i s not None ) and ( p o s i t i o n >= 1 ) :


embedded_obj = [ 0 ] p o s i t i o n
embedded_obj . append ( { } )
else :
embedded_obj = { }
7.6. 97

d2 = t r i e
for i , character in enumerate ( sequence ) :
d2 = a c c e s s _ t r i e ( t r i e , sequence [ : i ] , p o s i t i o n )
i f character not in d2 :
i f p o s i t i o n i s None :
d2 [ character ] = deepcopy ( embedded_obj )
else :
d2 [ character ] = d2 . get ( character ,\
deepcopy ( embedded_obj ) )
d2 [ character ] [ 0 ] += 1
e l i f p o s i t i o n i s not None :
d2 [ character ] [ 0 ] += 1
return t r i e

access_trie() -

-
. ,
position None, if
,
.
sequence
. ,

.
.
d (hides)
. ,
d
.

.
populate_trie -
, -
98 7.


deepcopy.
.

.
embedded_obj ,
.
embedded_obj
embedded_obj. .
, (
) .
:

>>> L = l i s t ( range ( 5 ) )
>>> L . append ( L )
>>> L
[0 , 1, 2, 3, 4, [ . . . ] ]


, 8.8,

8.3.
8

What can be said at all can be said clearly,


and what we cannot talk about we must pass
over in silence.

Ludwig Wittgenstein

, -


Python.

8.1
Ludwig Wittgenstein ,
-
:

. (-
)

. ( )



. ()

99
100 8.

, -
, -
, -
. (
)

. ( )

.
( )

,
. ( )



.
, ,

. -
,

-
. ( )
,
.
-
.
-
.
, .
:

: : Guido van Rossum

: : Python
8.2. 101

(Class): (attributes)
(methods) -
. .

(Object): ,
.
.

(Instance): -
.

(Method): -
.

(Inheritance): -
,
,
. -

.


. (fields)
((methods). -

.
.

8.2
:
102 8.

class Snake ( ) :
pass

python = Snake ( )

class Snake(): Snake


, python = Snake() -
.

.

class Snake ( ) :
def helloWorld ( s e l f ) :
p r i n t ( ' Hello World ! ' )

python = Snake ( )
python . helloWorld ( )

, , -
def. ,

self .
self,
.
, -
. -
.
(
)
.
, , . -
( , ),
. ,
, .
, . , -
8.2. 103

, , ,
.

class Dog ( ) :
def _ _ i n i t _ _ ( s e l f , name, color , height , mood, age ) :
"""
This method i s c a l l e d when an new objected i s
initiallized .
"""

# here we setup the a t t r i b u t e s o f our dog


s e l f .name = name
s e l f . color = color
s e l f . height = height
s e l f .mood = mood
s e l f . age = age
s e l f . hungry = False
s e l f . t i r e d = False

def p r i n t _ a t t r i b u t e s ( s e l f ) :
" " " P r i n t a l l the a t t r i b u t e s o f the dog " " "

p r i n t ( 'Name i s ' , s e l f .name)


p r i n t ( ' Color i s ' , s e l f . c o l o r )
p r i n t ( ' Height i s ' , s e l f . height )
p r i n t ( ' Mood i s ' , s e l f .mood)
p r i n t ( ' Age i s ' , s e l f . age )
p r i n t ( ' Hungry i s ' , s e l f .name)
p r i n t ( ' Tired i s ' , s e l f . t i r e d )

ralph = Dog ( ' Ralph ' , ' blue ' , 1.80 , ' good ' , 15)
ralph . p r i n t _ a t t r i b u t e s ( )

,
Dog() -
104 8.

. -
__init__().
. __init__()
self -
,
. -
.

8.2.1. -
, self this
. self
. , self
, . -
, ,
.

8.3

.
-
Trie
.

class T r i e :
"""
A T r i e i s l i k e a d i c t i o n a r y in that i t maps keys to values .
However , because o f the way keys are stored , i t allows
look up based on the longest p r e f i x that matches .

"""

def _ _ i n i t _ _ ( s e l f ) :
# Every node consists o f a l i s t with two p o s i t i o n . In
# the f i r s t one , there i s the value while on the second
8.3. 105

# one a d i c t i o n a r y which leads to the r e s t o f the nodes .


s e l f . root = [ 0 , { } ]

def i n s e r t ( s e l f , key ) :
"""
Add the given value f o r the given key .

>>> a = T r i e ( )
>>> a . i n s e r t ( ' kalo ' )
>>> p r i n t ( a )
[0 , { 'k ': [1 , { ' a ': [1 , { ' l ': [1 , { ' o ': [1 , { } ] } ] } ] } ] } ]
>>> a . i n s e r t ( ' kalo ' )
>>> p r i n t ( a )
[0 , { 'k ': [2 , { ' a ': [2 , { ' l ': [2 , { ' o ': [2 , { } ] } ] } ] } ] } ]
>>> b = T r i e ( )
>>> b . i n s e r t ( ' heh ' )
>>> b . i n s e r t ( ' ha ' )
>>> p r i n t ( b )
[0 , { 'h ': [2 , { ' a ': [1 , { } ] , 'e ': [1 , { 'h ': [1 , { } ] } ] } ] } ]

"""

# f i n d the node to append the new value .


curr_node = s e l f . root
for k in key :
curr_node = curr_node [ 1 ] . s e t d e f a u l t ( k , [ 0 , { } ] )
curr_node [ 0 ] += 1

def f i n d ( s e l f , key ) :
"""
Return the value f o r the given key or None i f key not
found .
106 8.

>>> a = T r i e ( )
>>> a . i n s e r t ( ' ha ' )
>>> a . i n s e r t ( ' ha ' )
>>> a . i n s e r t ( ' he ' )
>>> a . i n s e r t ( ' ho ' )
>>> p r i n t ( a . f i n d ( ' h ' ) )
4
>>> p r i n t ( a . f i n d ( ' ha ' ) )
2
>>> p r i n t ( a . f i n d ( ' he ' ) )
1

"""

curr_node = s e l f . root
for k in key :
try :
curr_node = curr_node [ 1 ] [ k ]
except KeyError :
return 0
return curr_node [ 0 ]

def _ _ s t r _ _ ( s e l f ) :
return s t r ( s e l f . root )

def __getitem__ ( s e l f , key ) :


curr_node = s e l f . root
for k in key :
try :
curr_node = curr_node [ 1 ] [ k ]
except KeyError :
yield None
for k in curr_node [ 1 ] :
8.4. (attributes) 107

yield k , curr_node [ 1 ] [ k ] [ 0 ]

i f __name__ == ' __main__ ' :


a = Trie ( )
a . i n s e r t ( ' kalo ' )
a . i n s e r t ( ' kala ' )
a . i n s e r t ( ' kal ' )
a . i n s e r t ( ' kata ' )
prin t ( a . f i n d ( ' kala ' ) )
for b in a [ ' ka ' ] :
print ( b )
prin t ( a )

8.4 (attributes)

-
( ) (attributes) .
ralph (instance)
Dog,
name, ralph.name.

self .
() -
.


self.characteristic = .
, print_attributes(). -
self
.
.
108 8.

8.5
(member functions)
-
.
, , ,
(Member Functions). -
,
.
.

.
Python :

v a r i a b l e . member_function ( [ any arguments required ] )

, -
dir Python
.

a = ' Python by example '


p r i n t ( ' Member functions f o r s t r i n g ' )
print ( dir ( a ) )

b = ( 1 , 2 , 3)
p r i n t ( ' Member functions f o r tuple ' )
print ( dir ( b ) )

c = [ 1 , 2 , 3]
p r i n t ( ' Member functions f o r l i s t ' )
print ( dir ( c ) )

__functionname__
Python
.
, -
8.6. 109

Python.

c = [ 1 , 2 , 3]
print ( help ( c . s o r t ) )

8.6

8.6.1
8.6.1.
( ).
.

class Snake :
noOfSnakes = 0

def _ _ i n i t _ _ ( s e l f , name = ' unknown ' ) :


s e l f .name = name
prin t ( ' I n i t i a l i z i n g { 0 } ' . format ( s e l f .name ) )
Snake . noOfSnakes += 1

def helloWorld ( s e l f ) :
prin t ( ' Hello World from { 0 } ! ' . format ( s e l f .name ) )

@staticmethod
def numberOfSnakes ( ) :
prin t ( Snake . noOfSnakes )

python = Snake ( ' TasPython ' )


python . helloWorld ( )
Snake . numberOfSnakes ( )
cobra = Snake ( )
cobra . helloWorld ( )
Snake . numberOfSnakes ( )
110 8.



. , -
(__init__,
noOfSnakes.

8.6.2

8.6.2. ,
. ,

( self).

,
(decorator) @staticmethod
. , ,
,
,
.

8.7


A b1 B . , -
B A, -
b1 1 . -
B 2 .
: -
(part-of) (has-a) - (is-a).
Python
.
1
fun
B a1.b1.fun(), a1 A.
2
a1.fun()
8.7. 111

8.7.1. -
. -

. (-
) -
().

class UniversityMember :
def _ _ i n i t _ _ ( s e l f , name, age ) :
s e l f .name = name
s e l f . age = age

def who ( s e l f ) :
p r i n t ( 'Name : " { } " Age : " { } " ' . format ( s e l f .name, s e l f . age ) )

class Professor ( UniversityMember ) :


def _ _ i n i t _ _ ( s e l f , name, age , salary ) :
UniversityMember . _ _ i n i t _ _ ( s e l f , name, age )
s e l f . salary = salary

def who ( s e l f ) :
UniversityMember .who ( s e l f )
p r i n t ( ' Salary : " { } " ' . format ( s e l f . salary ) )

class Student ( UniversityMember ) :


def _ _ i n i t _ _ ( s e l f , name, age , marks ) :
UniversityMember . _ _ i n i t _ _ ( s e l f , name, age )
s e l f . marks = marks

def who ( s e l f ) :
UniversityMember .who ( s e l f )
p r i n t ( ' Marks : " { } " ' . format ( s e l f . marks ) )
112 8.

p = Professor ( ' Mr. Sipser ' , 40, 3000000)


s = Student ( ' Kosmadakis ' , 25, 9.99)

for member in ( p , s ) :
p r i n t ( '' )
member.who ( )

, Professor
UniversityMember.
, Professor
(UniversityMember). ,
Professor

.
-
-
. ,

, , -

DRY Dont Repeat Yourself
,
( -

).

8.8
,
( , ,
..).
__. .
,
8.8. 113

Python operator overloading.

__init__(self, . . . ): . -

. (base class) __init__(),
.
, __init__()

__del__(self): .
(destructor). ,
.

__repr__(self): repr() -
-
. ,
Python .
debugging.

__str__(self): str()
print().
__repr__() .
.

__lt__(self, other), __le__(self, other), __eq__(self, other), __ne__(self, o-


ther), __ne__(self, other), __gt__(self, other), __ge__(self, other): -
(<),
(<=), (==), (! =),
(>), (>=). -


.

, -
, .

__add__(self, other): (+)

__sub__(self, other): ()
114 8.

__mul__(self, other): ()

__truediv__(self, other): (/)

__floordiv__(self, other): (//)

__mod__(self, other): (%)

,
(descriptors)
.

__, ,
.

:

class EmbeddedDict ( d i c t ) :
def __missing__ ( s e l f , key ) :
value = EmbeddedDict ( )
s e l f [ key ] = value
return value

d = {}
d2 = EmbeddedDict ( d )
d2 [ ' a ' ] [ ' b ' ] [ ' c ' ] = 1
p r i n t ( d2 )


, .
9


. -
,

.

9.1


, ,

. ,
open() . ,
,
. , -
, .

115
116 9.

open()
9.1.


r

w
( )

a
( )
b

+
r+ /

9.1:

r, w, a .
,
( r.

9.2

9.2.1

read().
, bytes
.

f = open ( ' i n p u t _ f i l e . t x t ' ) # open , readonly ( d e f a u l t )


p r i n t ( f .name) # recover name from f i l e o b j e c t
p r i n t ( f . readlines ( ) )
p r i n t ( f . readlines ( ) ) # already at end o f f i l e
f . seek ( 0 ) # go back to byte 0 o f the f i l e
p r i n t ( f . read ( ) ) # read to EOF, returning bytes in a s t r i n g
f . close ( )
9.2. 117

readlines read,
,
,
. , close()
.

9.2.2
, ,
,
open().
,
.

g = open ( ' n e w _ f i l e ' , 'w ' ) # open f o r w r i t i n g


g . write ( ' A new f i l e begins ' ) # takes j u s t one argument
g . write ( ' . . . today ! \n ' )
g . close ( )

, -
,
.

f = open ( ' f i l e . t x t ' , ' a ' )


f . write ( ' Append a new l i n e at the end o f the f i l e \n ' )
f . close ( )

9.2.3
for
(iterate), .

f = open ( ' i n p u t _ f i l e . t x t ' ) # open , readonly ( d e f a u l t )

for l i n e in f :
prin t ( l i n e )
118 9.

, -
.
, , -
\n. , ,
. -
print ,
.

9.2.4 ()
(serialization) , -
bits
( ) -
.

.

( -
) .
, Python (module) pickle.
pickle
.

0:

1:

2: 2
Python

3:

( 3),
.
, .
9.3. 119

import p i c k l e

write_data = [ 1 , 2.0 , ' asdf ' , [ None , True , False ] ]

with open ( ' data . p i c k l e ' , ' wb ' ) as f :


p i c k l e .dump( write_data , f )

with open ( ' data . p i c k l e ' , ' rb ' ) as f :


read_data = p i c k l e . load ( f )

print ( read_data )

-
python
. ,
(binary for-
mat),
.

9.3
,
. python
,
.
os
( )
.

9.3.1
:

getcwd(): .
120 9.

listdir(): .

chdir(path): path.

(module)
os.
cross-platform,
.
-
. os.path.split()
os.path.join() cross-
platform ,
.

import os

abs_path = os . path . abspath ( os . path . curdir )


# os . path . j o i n i s used to append a r e l a t i v e path at the
# end o f another path
path2 = os . path . j o i n ( abs_path , " new_dir " )
p r i n t ( path2 )
# os . path . s p l i t " s p l i t s " the path in two pieces .
# The path u n t i l the l a s t ' / ' and whatever f o l l o w s
path0 , path1 = os . path . s p l i t ( path2 )
p r i n t ( path0 )
p r i n t ( path1 )

-

( cross-platform) Python.

import os

p r i n t ( os . path . curdir ) # get current d i r e c t o r y ( Pythonic humor )


abs_path = os . path . abspath ( os . path . curdir ) # get i t s f u l l path
p r i n t ( abs_path )
9.3. 121

f u l l _ p a t h = os . getcwd ( )
print ( f u l l _ p a t h )

# get the t a i l end o f the path


print ( os . path . basename ( f u l l _ p a t h ) )

# l i s t the contents o f the current d i r e c t o r y


os . l i s t d i r ( f u l l _ p a t h )

# get information about f i l e . t x t


# the numbers below are : inode protection mode; inode number ;
# device inode resides on ; number o f l i n k s to the inode ;
# user id o f the owner ; group id o f the owner ; s i z e in bytes ;
# time o f l a s t access ; time o f l a s t modification ;
# " ctime " as reported by OS
print ( os . s t a t ( ' f i l e . t x t ' ) )

s i z e = os . path . g e t s i z e ( ' f i l e . t x t ' )


print ( ' The f i l e s i z e i s : ' , s i z e )
i s d i r e c t o r y = os . path . i s d i r ( ' f i l e . t x t ' )
print ( ' I s f i l e . t x t a d i r e c t o r y : ' , i s d i r e c t o r y )
# time o f l a s t modification ( seconds since Epoch )
last_mod = os . path . getmtime ( ' f i l e . t x t ' )
print ( ' The l a s t time t h i s f i l e modified i s ' , last_mod )

, -
os.system().

import os

os . system ( " l s " )

,
-
122 9.

9.3.2
.

mkdir(path): path.

makedirs(path): path
-
, .

import os

# remove new_dir i f already e x i s t s and i t i s empty


i f os . path . i s d i r ( ' new_dir ' ) :
os . rmdir ( ' new_dir ' )
os . makedirs ( ' new_dir ' )
p r i n t ( os . l i s t d i r ( ' . ' ) )
# change to subdirectory new_dir
os . chdir ( ' new_dir ' )
10

Success is not final, failure is not fatal: it is


the courage to continue that counts.

Winston Churchill

-
( ) -
. -
,

.

10.1
10.1.1.

.

, -

, -
.

123
124 10.


. ,
(
).
:

1. Python .

2. ( NameError, TypeError,
IndexError).

3. .

4. ,
.

5. , traceback,
.

-
,
, if. . . else . . . ,
. ,
,
else. ,

,
except.

10.2 .
,
.
.

>>> 8/0
Traceback ( most recent c a l l l a s t ) :
10.2. . 125

F i l e " <stdin > " , l i n e 1 , in <module>


ZeroDivisionError : i n t d i v i s i o n or modulo by zero

(shell) Py-
thon, -
. ,
(<stdin>, -
), ( 1), (ZeroDivisionError,
) (int
division or modulo by zero).
,
.

>>> try :
... 8/0
. . . except ZeroDivisionError :
... p r i n t ( ' Could not make the d i v i s i o n ' )
...
Could not make the d i v i s i o n

, -
try -
,
except.
(
ZeroDivisionError),
.
.
, -
:

>>> a 5
Traceback ( most recent c a l l l a s t ) :
F i l e " <stdin > " , l i n e 1 , in <module>
NameError : name ' a ' i s not defined
126 10.


a .
NameError.
, a,
try. . . except. . . ,
(NameError).

( )
.

>>> b = None
>>> b 7
Traceback ( most recent c a l l l a s t ) :
F i l e " <stdin > " , l i n e 1 , in <module>
TypeError : unsupported operand type ( s ) for :
' NoneType ' and ' i n t '

, ,
, .

>>> with open ( ' 3BirdsAreSitting .mp3 ' , ' r ' ) as f :


... f . read ( )
...
Traceback ( most recent c a l l l a s t ) :
F i l e " <stdin > " , l i n e 1 , in <module>
IOError : [ Errno 2] No such f i l e or d i r e c t o r y :
' 3BirdsAreSitting .mp3 '

with,
3BirdsAreSitting.mp3, with,
, ,
.
,
except,
,
.
10.2. . 127

. . . except ( RuntimeError , TypeError , NameError ) :


... pass

-
except:, , -
.

import sys

try :
f = open ( ' myfile . t x t ' )
s = f . readline ( )
i = int ( s . strip ( ) )
except IOError as e r r :
prin t ( " I /O e r r o r : { } " . format ( e r r ) )
except ValueError :
prin t ( " Could not convert data to an i n t e g e r . " )
except :
prin t ( " Unexpected e r r o r : " , sys . exc_info ( ) [ 0 ] )
raise

, -
, , -
except . ,
myfile.txt,

.
, .
,
, IOError -
err.
. -
except
,
, except
128 10.

try, .
ValueError
.
, ,

raise,
.1 ,
, (
) .
raise .

10.3
, ( -
web )
, ,
.

.

while True :
try :
x = i n t ( input ( " Please enter a number : " ) )
break
except ValueError :
p r i n t ( " Not a number . Try again . . . " )
print ( x )

, -
. ,
, . ,
input -
1
, ,
try. . . except. . .
.
10.4. 129

. , int
.
, x -
while, break
except ValueError,
. break ,
. ,
print.

10.4
,
Python.

1. try .

2. , except.

3. try ,
except.

4. except .

5. , .

6. , try .

7. , -
.

10.4.1 try:. . . else: . . .


,
.

try . , Python
else, if,
.
130 10.

try :
f = open ( ' myfile . t x t ' )
except IOError as e r r :
p r i n t ( " I /O e r r o r : { } " . format ( e r r ) )
else :
s = f . readline ( )
p r i n t ( ' The f i r s t l i n e o f f i s : ' , s )
f . close ( )

else
. , ,

.
:

1. try.

2. except.

3. ( ) else.

else
except .

10.4.2 finally
, finally,
, .

# how many times we have requested f o r input


times = 0

while True :
try :
x = i n t ( input ( " Please enter a number : " ) )
break
10.5. 131

except ValueError :
p r i n t ( " Not a number . Try again . . . " )
finally :
times += 1
print ( ' Requested input ' , times )

,
, -
. , finally,
,
.

.

10.5

.

10.5.1

2 Exception.

.
args
.
.

try :
r a i s e Exception ( ' Can you handle i t ? ' )
except Exception as i n s t :
prin t ( i n s t . args )
prin t ( i n s t )

2

132 10.

, Exception. -
Can you handle it?.
as
inst,
. args -
, .
__str__() .

10.5.2 (raise)
,
BaseException. ,
, -
Exception. -
raise.

>>> r a i s e NameError ( ' TesseraPoulakiaKa8ontai ' )


Traceback ( most recent c a l l l a s t ) :
F i l e " <stdin > " , l i n e 1 , in <module>
NameError : TesseraPoulakiaKa8ontai

-
.

>>> r a i s e NameError
Traceback ( most recent c a l l l a s t ) :
F i l e " <stdin > " , l i n e 1 , in <module>
NameError

10.5.3
-
, -
Exception.

>>> class MyError ( Exception ) :


10.6. if . . . else 133

... def _ _ i n i t _ _ ( s e l f , value ) :


... s e l f . value = value
... def _ _ s t r _ _ ( s e l f ) :
... return repr ( s e l f . value )

__init__, -
__str__
.
, -
,
.

>>> try :
... r a i s e MyError ( 4 )
. . . except MyError as e :
... p r i n t ( 'My exception occurred : ' , e )
...
My exception occurred : 4

>>> r a i s e MyError ( ' oops ! ' )


Traceback ( most recent c a l l l a s t ) :
F i l e " <stdin > " , l i n e 1 , in ?
__main__ . MyError : ' oops ! '

10.6 if . . . else

.
if
. . . else. .

10.6.1. -

,
. ,
134 10.

( ). , -
,
.

from t i m e i t import Timer


from random import randint

VALUES = 10000
inverseprob = 2
d = d i c t ( [ ( x , y ) for x , y in z i p ( range (VALUES) , \
range (VALUES, 2 VALUES ) ) ] )

class MyError ( Exception ) :


def _ _ i n i t _ _ ( s e l f , value ) :
s e l f . value = value
def _ _ s t r _ _ ( s e l f ) :
return repr ( s e l f . value )

def try_except ( d ) :
try :
d [ ' not ' ]
except KeyError :
pass

def i f _ e l s e ( d ) :
i f ' not ' in d :
d [ ' not ' ]
else :
pass
10.6. if . . . else 135

def try_exceptYES ( d ) :
try :
d[1]
except KeyError :
pass

def if_elseYES ( d ) :
i f 1 in d :
d[1]
else :
pass

def try_exceptMAYBE ( d , inverseprob ) :


s = randint ( 0 , inverseprob )
try :
i f s == 0: r a i s e MyError ( 2 )
d[1]
except MyError :
pass

def if_elseMAYBE ( d , inverseprob ) :


s = randint ( 0 , inverseprob )
i f s == 0: return
else : d [ 1 ]

def f a i l ( ) :
prin t ( " Unsuccessful look up" )
136 10.

t = Timer ( " try_except ( d ) " ,\


" from __main__ import try_except , d " )
s f = ' Execution time with exceptions : { } seconds '
p r i n t ( s f . format ( t . t i m e i t ( ) / 10 6))

t = Timer ( " i f _ e l s e ( d ) " ,\


" from __main__ import i f _ e l s e , d " )
s f = ' Execution time with i f / e l s e : { } seconds '
p r i n t ( s f . format ( t . t i m e i t ( ) / 10 6))

def success ( ) :
p r i n t ( " Successful look up" )
t = Timer ( " try_exceptYES ( d ) " ,\
" from __main__ import try_exceptYES , d " )
s f = ' Execution time with exceptions : { } seconds '
p r i n t ( s f . format ( t . t i m e i t ( ) / 10 6))

t = Timer ( " if_elseYES ( d ) " ,\


" from __main__ import if_elseYES , d " )
s f = ' Execution time with i f / e l s e : { } seconds '
p r i n t ( s f . format ( t . t i m e i t ( ) / 10 6))

def maybe ( ) :
p r i n t ( " Successful under a p r o b a b i l i t y " )
t = Timer ( " try_exceptMAYBE ( d , inverseprob ) " ,\
" from __main__ import try_exceptMAYBE , d , inverseprob " )
s f = ' Execution time with exceptions : { } seconds '
p r i n t ( s f . format ( t . t i m e i t ( ) / 10 6))

t = Timer ( " if_elseMAYBE ( d , inverseprob ) " ,\


" from __main__ import if_elseMAYBE , d , inverseprob " )
s f = ' Execution time with i f / e l s e : { } seconds '
10.6. if . . . else 137

prin t ( s f . format ( t . t i m e i t ( ) / 10 6))

def main ( ) :
success ( )
fail ()
maybe ( )

i f __name__ == ' __main__ ' :


main ( )
138 10.
11

A woodpecker can peck twenty times on a


thousand trees and get nowhere, but stay
busy. Or he can peck twenty-thousand times
on one tree and get dinner.

Seth Godin

, . -
,
, .
( -
, ),
Python 3 .

11.1 (Iterators)
, -
(iterators).
, .

mylist = [ 1 , 2 , 3]

for i in mylist :

139
140 11.

print ( i )

(iterator) -
next() .

11.1.1 for
:

for i in mylist :
. . . loop body . . .

Python :

1. next(). iter(mylist)
next().

2.
. i
mylist. ,
next() i . -
i .
StopIteration next()
mylist
.

11.2
(generators)
yield return. -
. ,
yield. ,
yield, yield. ,
,
,
.
11.2. 141

11.2.1. -
iterators. ,

. , . -

.


range() (end)
(start), modulo
.

def modulo_yield ( s t a r t , end , modulo ) :


" " " Create a l i s t o f a l l the number from s t a r t _ { modulo }
u n t i l end_ { modulo } i s reached .
"""
i f ( s t a r t > end ) :
a = s t a r t % modulo
b = ( end % modulo ) + modulo
else :
a = start
b = end

for num in range ( a , b ) :


yield num % modulo

start > end ,


. , yield
for. ,
, ,
.
Fibonacci
.

def f i b o n a c c i (num) :
a = 0
142 11.

yield a
b = 1
yield b

for i in range ( 2 , num) :


b, a = a + b, b
yield b

for i in f i b o n a c c i ( 1 0 ) :
print ( i )

, -
lists comprehensions.

primes = [ 1 , 2 , 3 , 5 , 7]

square_primes = ( i 2 for i in primes )


p r i n t ( next ( square_primes ) )
p r i n t ( next ( square_primes ) )
p r i n t ( next ( square_primes ) )

, ,
next(). -
next()
StopIteraton

.

,
.
( yield)
. ,
yield.
11.3. 143

11.3 -

:


. -
,
-
(on the fly). ,
.

parsing
.

.

-
.
Fibonacci.

,

.
,
.. for,
.
:

1. len(). -

(
) for .

2. ( ) -
.
144 11.

,
:

for i in range ( 0 , len ( l ) ) :


e = l[i]
...

for i , e in enumerate ( l ) :
...

11.4 -

,

.
,
,
( ,
).
( 1, 17).
-
.
10
Fibonacci, 20,
Fibonacci.
. fibonacci
.

import i t e r t o o l s
class Indexable ( o b j e c t ) :
def _ _ i n i t _ _ ( s e l f , i t ) :
11.4. 145

self . it = it
def _ _ i t e r _ _ ( s e l f ) :
for e l t in s e l f . i t :
yield e l t
def __getitem__ ( s e l f , index ) :
try :
return next ( i t e r t o o l s . i s l i c e ( s e l f . i t , index ,\
index + 1 ) )
# support f o r [ s t a r t : end : step ] notation
except TypeError :
return l i s t ( i t e r t o o l s . i s l i c e ( s e l f . i t ,\
index . s t a r t , index . stop , index . step ) )

i t = Indexable ( f i b o n a c c i ( 4 5 ) )
# prints the 10th element
print ( i t [ 1 0 ] )
# 55

# prints the element a f t e r 10 elements from the current


print ( i t [ 1 0 ] )
# 10946

# prints the elements s t a r t i n g a f t e r where we had stopped


print ( i t [ 2 : 1 2 : 2 ] )
# [46368 , 121393, 317811, 832040, 2178309]
146 11.
12


, .

-
,
, (
).
(pattern).
Python.
. ,
. ,
.

12.1

1 . -
1

.

147
148 12.

-
.
,

. ,
4.

import re

def num_start4 ( t e x t ) :
" " " Check whether any number which s t a r t s with 4. " " "
pattern = re . compile ( r ' \b4[0 9] ' )

return bool ( pattern . search ( t e x t ) )

a = num_start4 ( " asdf 1234" ) # False


a = num_start4 ( " asdf 4123" ) # True

-
\. .
,
4 4321 4 3421.


. ,
.

import re

a = "3141/1000 reminds me o f pi "


b = re . f i n d a l l ( " [0 9] " , a )
13

I cant understand why people are frightened


of new ideas. Im frightened of the old ones.

Josh Cage

, ,

,
-

.

13.1
( ) object.
-
(descriptors).
-
(attributes) .
, -
. -


. ,

149
150 13.

x -
y .
,
getters set-
ters
. , -
.
Python ,
-
. ,
.

13.2

13.2.1

. -
:

__get__(self, instance, owner)

__set__(self, instance, value)

__delete__(self, instance)


(attributes) :

: -
__get__(self, instance, owner). ()
AttributeError.

:
__set__(self, instance, value).

:
__delete__(self, instance).
13.2. 151

self
() ,
.

owner:
.

instance: ( )
. None
.

value: -
.
152 13.
14
GUI tkinter


. :
. .

GUI (Graphical

User Interface) .

.
:

1. wxPython

2. pyQT

3. PyGTK

4. tkinter

,
-

Python. , tkinter (= Tk interface) Python,

153
154 14. GUI tkinter

.
Tcl/Tk. tkinter
Tcl/Tk.

14.1
:

from t k i n t e r import

root = Tk ( )

w = Label ( root , t e x t = " Hello world ! " )


w. pack ( )

root . mainloop ( )

tkinter , -
,
. (label)
pack(). ,
(mainloop)
.

14.2
,
. ,
, -
. , -
.
,

.
14.2. 155

from t k i n t e r import
from t k i n t e r . messagebox import

class Calculator ( Frame ) :


" " " Describes the main behaviour o f a c a l c u l a t o r
"""

def d_result ( s e l f , c ) :
" " " Displays the r e s u l t o f an operation
"""

s e l f . label3 . c o n f i g ( t e x t = ' The r e s u l t i s ' + s t r ( c ) )


s e l f . label3 . pack ( )

def d_add ( s e l f ) :
" " " Handles the addition in the GUI
"""
a , b = s e l f . getNum ( )
c = s e l f . addition ( a , b )

s e l f . d_result ( c )

def d_sub ( s e l f ) :
" " " Handles the substraction in the GUI
"""
a , b = s e l f . getNum ( )
c = s e l f . substraction ( a , b )

s e l f . d_result ( c )
156 14. GUI tkinter

def d_mul ( s e l f ) :
" " " Handles the m u l t i p l i c a t i o n in the GUI
"""
a , b = s e l f . getNum ( )
c = s e l f . multiplication ( a , b )

s e l f . d_result ( c )

def d_div ( s e l f ) :
" " " Handles the d i v i s i o n in the GUI
"""
a , b = s e l f . getNum ( )
c = s e l f . division ( a , b)

s e l f . d_result ( c )

def addition ( s e l f , a , b ) :
" " " Add numbers a , b and return t h e i r r e s u l t
"""
c = a + b
return c

def substraction ( s e l f , a , b ) :
" " " Substract a b and return the r e s u l t
"""
c = a b
return c

def m u l t i p l i c a t i o n ( s e l f , a , b ) :
" " " Multiply a b and return i t s r e s u l t
"""
c = a b
14.2. 157

return c

def d i v i s i o n ( s e l f , a , b ) :
" " " Divide a / b and return i t s r e s u l t
"""
try :
# i f b != 0
c = a / b
except ZeroDivisionError :
# i f b == 0
showinfo ( ' Warning ' , ' Cannot d i v i d e by 0. ' )
c = 0
return c

def getNum ( s e l f ) :
" " " Gets the two numbers on which the operation
w i l l be applied .
In case o f error , i t returns both o f them as zero
and warns the user .
"""
try :
a = f l o a t ( s e l f . enter1 . get ( ) )
b = f l o a t ( s e l f . enter2 . get ( ) )

# i f the f i e l d s were empty


except ValueError :
a, b = 0, 0
showinfo ( ' I n f o ' , ' There are some empty f i e l d s ' )

return a , b

def insertNum ( s e l f , l a b e l = " I n s e r t a number : " ) :


" " " Draw the necessary elements f o r the i n s e r t i o n o f
158 14. GUI tkinter

two numbers
"""

# The f i r s t number
s e l f . label1 = Label ( s e l f , t e x t = l a b e l )
s e l f . label1 . pack ( )
# create the f i e l d f o r that number
s e l f . enter1 = Entry ( s e l f )
s e l f . enter1 . pack ( )

# the second number


s e l f . label2 = Label ( s e l f , t e x t = l a b e l )
s e l f . label2 . pack ( )
# create the f i e l d f o r the new number
s e l f . enter2 = Entry ( s e l f )
s e l f . enter2 . pack ( )

def drawGUI ( s e l f ) :
"""
I t draws the GUI within the container from which i s
c a l l e d . In t h i s case , within the frame where the
c a l c u l a t o r belongs .
"""

# draws the elements which are used to i n s e r t a number


s e l f . insertNum ( )

# set the focus to enter1


s e l f . enter1 . focus ( )

# create the buttons


s e l f . button1 = \
Button ( s e l f , t e x t = " add " , command = s e l f . d_add )
14.2. 159

s e l f . button2 = \
Button ( s e l f , t e x t = " sub " , command = s e l f . d_sub )
s e l f . button3 = \
Button ( s e l f , t e x t = "mul" , command = s e l f . d_mul )
s e l f . button4 = \
Button ( s e l f , t e x t = " div " , command = s e l f . d_div )

# display them
s e l f . button1 . pack ( side=LEFT )
s e l f . button2 . pack ( side=LEFT )
s e l f . button3 . pack ( side=LEFT )
s e l f . button4 . pack ( side=LEFT )

# create the l a b e l where we display the r e s u l t


s e l f . label3 = Label ( s e l f )

return root ;

def _ _ i n i t _ _ ( s e l f , master = None ) :


"""
The constructor i s c a l l e d with a parent widget .
I t creates the GUI f o r the c a l c u l a t o r .
"""
Frame . _ _ i n i t _ _ ( s e l f , master )
s e l f . master . t i t l e ( " Calculator " )
s e l f . pack ( )
s e l f . drawGUI ( )

root = Tk ( )
calc = Calculator ( master = root )
calc . mainloop ( )
160 14. GUI tkinter

14.1: showinfo(Info, There are some empty fields.)

Entry -
Button .

14.3
pop-up -
,
. print

(
).
-
,
tkinter.messagebox. ,
.

showinfo()

askokcancel()

showwarning()

showerror()

askquestion()

askyesno()

askretrycancel()
14.3. 161

14.2: askokcancel(Go on?, Would you like to quit?)

14.3: showwarning(Warning, A window detected!)

14.4: showerror (Error, Many windows have been detected!)

14.5: askquestion(Install, Would you like to install a door?)

14.6: askyesno(Taste, Would you like fries with that?)


162 14. GUI tkinter

14.7: askretrycancel(No media found, Would you like to try again?)

-
:

: . ,
.

, -

.

from t k i n t e r import
from t k i n t e r . messagebox import

showinfo ( ' I n f o ' , ' There are some empty f i e l d s . ' )


showwarning ( ' Warning ' , ' A window detected ! ' )
showerror ( ' Error ' , ' Many windows have been detected ! ' )
askquestion ( ' I n s t a l l ' , ' Would you l i k e to i n s t a l l a door? ' )


( , ),
true false .
15

All those who believe in psychokinesis raise


my hand.

,


. ,

.

15.1

15.1.1


. -
.
, -
.

163
164 15.

,
.

15.1.2
(run time errors)
(
, ).

15.1.3
,
.
. ,
!

15.2 Python Debugger


-
debugger. Python
debugger module,
pdb1 . , debugger
(print, log
messages) . -
, Python
(debugger)
. debugger,
.

import pdb

debugger .
:


1
Python DeBugger
15.2. Python Debugger 165

(breakpoints)

Python.

15.2.1

, -
pdb.set_trace().

import pdb

a = " taspython "


b = " . eu\n"
pdb . s e t _ t r a c e ( )
c = " Because s i m p l i c i t y matters "
final = a + b + c
print ( f i n a l )

pdb.set_trace(),
n -
.
n,
enter
. debugger
q debugger c
.

15.2.2

n,
debugger ,
. -
s.
n,
166 15.

, -
.

s, r. , -
return
( -
).

15.2.3
l p.
,
p ,
.
,
Python . , -
-
,


.
-
,
Python. ,
(!)
debugger Python
.

15.2.4
15.1 -
debugger.
15.2. Python Debugger 167


import pdb debugger.
pdb.set_trace()
<Enter>
q (quit)
p (print)
c (continue)
l (listing)
s (step into)
r (return)

15.1:
168 15.
16

The only reason for time is so that everything


doesnt happen at once.

Albert Einstein


.

, .
-
-
. , ,
, -
. -
; ,
. garbage collector
,
. ,

.
Python,
,

169
170 16.

, timeit. timeit,
,
. , -

,
.
, .

16.1

. -
1 -
.

def measure_time ( ) :
from t i m e i t import Timer

s = """\
x = 5
i f x > 5:
p = 4
else :
p = 0
"""
t = Timer ( s )
print ( t . timeit ( ) )

timeit()
1.000.000 , , -

.
,
1

.
16.2. 171

number
timeit().

def measure_time ( ) :
from t i m e i t import Timer

s = """\
x = 5
i f x > 5:
p = 4
else :
p = 0
"""
t = Timer ( s )
prin t ( t . t i m e i t ( number=100000))

16.2
,
timeit.
Timer.
. -
(statements)2
.

def measure_time ( ) :
from t i m e i t import Timer
t = Timer ( " f a s t _ f u n c t i o n ( ) " ,\
" from __main__ import f a s t _ f u n c t i o n " )
s f = ' Execution time ( f o r each c a l l ) : { } seconds '
prin t ( s f . format ( t . t i m e i t ( ) / 10 6))

def f a s t _ f u n c t i o n ( ) :
2
(;)
172 16.

" " " A f a s t function or at l e a s t we hope so " " "

# the 2 f i r s t f i b o n a c c i numbers are always known


a, b = 0, 1

# f i n d the 20 f i r s t f i b o n a c c i numbers and p r i n t them


for i in range ( 1 , 2 0 ) :
a, b = b, a + b

def main ( ) :
measure_time ( )

i f __name__ == ' __main__ ' :


main ( )

fast_function(),
.
.
, -
fast_function Timer -
106 ,
. ,
, t.timeit()

fast_function. ,
1000 .

t = Timer ( " f a s t _ f u n c t i o n ( ) " ,\


" from __main__ import f a s t _ f u n c t i o n " )
t . t i m e i t (1000)

,
106 ,
.
16.3. garbage collector 173

16.3 garbage collector


, , -
timeit() garbage collector. -

, -

gc.enable().

def measure_time ( ) :
from t i m e i t import Timer

s = """\
x = 5
i f x > 5:
p = 4
else :
p = 0
"""
t = Timer ( s , ' gc . enable ( ) ' )
prin t ( t . t i m e i t ( number=100000))

16.4

. ,
. Ti-
mer() .
-
3 .
, -
.

3
, pass
174 16.

,
.

def measure_time ( ) :
from t i m e i t import Timer

t = Timer ( ' f a s t _ f u n c t i o n ( a , b ) ' ,\


' from __main__ import fast_function ,\
setup_function ; a , b = setup_function ( ) ' , )
print ( t . timeit ( ) )

def f a s t _ f u n c t i o n ( a , b ) :
" " " A f a s t function or at l e a s t we hope so " " "

if a > b:
l = []
else :
d = {}

def setup_function ( ) :
" " " A function which must be c a l l e d f i r s t " " "

a = 5
#b = 4
b = i n t ( input ( " I n s e r t b : " ) )

return a , b

def main ( ) :
measure_time ( )

i f __name__ == ' __main__ ' :


main ( )
16.5. 175

, -
,
.

16.5
-
; !
,
, ,
.
, (
)
:

python mtimeit s "SETUP_COMMANDS" "COMMAND_TO_BE_TIMED"


, -
. (Garbage Collector)

python mtimeit s ' f o r i in range ( 1 0 ) : oct ( i ) ' ' gc . enable ( ) '

16.6 (Profiling)
, -
,
. , -
(Law of diminishing
returns).
,
. -

.
176 16.

, -
profiling Python cPro-
file.
. -
.
:

python m c P r o f i l e filename . py

, ,
, .

You might also like