Язык программирования

Лекция №1. Введение в Python

Владимир Владимирович Руцкий rutsky.vladimir@gmail.com

_images/cgsg.png _images/pml30.png
1

План лекции

2

Что такое Python?

3

Python — высокоуровневый ЯП

4

Python — ориентирован на разработчика

5

Python — масштабируемый

6

Python — интерпретируемый

7

Интроспекция

8

Динамическая типизация

9

Python — мультипарадигменный

10

Дополнительные характеристики Python

11

Интерпретаторы Python

12

Версии Python

13

Библиотеки Python

14

Применение Python (1/2)

15

Применение Python (2/2)

16

Примеры Python-интерфейсов к библиотекам

17

Установка Python

  1. Скачиваем дистрибутив Python 3.3 с официального сайта http://python.org
    • Последняя версия на данный момент 3.3.4: http://python.org/download/releases/3.3.4/
    • Для Windows ищите на странице ссылку "Windows X86 MSI Installer (3.3.4)" (или "X86-64")
  2. Устанавливаем в директорию по умолчанию (C:\Python33)

Интерпретатор: "C:\Python33\python.exe"

Установка дополнительных библиотек будет рассмотрена на следующих лекциях

18

Установка PyCharm

В раздаточном материале

19

Введение в Python

20

Выполнение программ на Python

Способы выполнения программ:

21

Интерактивная консоль Python

Запустите python.exe:

C:\> C:\Python33\python.exe
Python 3.3.4 (v3.3.4:7ff62415e426, Feb 10 2014, 18:12:08) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

">>> " — приветствие, интерпретатор ожидает ввода команды

22

Hello, world!

1
2
3
>>> print("Hello, world!")
Hello, world!
>>>
23

Вычисление выражений

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> 2 + 2
4
>>> # Это комментарий
... 6 + 4
10
>>> 2 + 2  # а вот комментарий на одной строке с кодом
4
>>> (45 - 5 * 6) / 4  # деление возвращает число с плавающей точкой
3.75
>>> (45 - 5 * 6) // 4 # целочисленное деление (с округлением)
3
>>> # Целочисленное деление возвращает округленное к минимальному значение:
... 7 // 3
2
>>> 7 // -3
-3
>>> # Результат последнего вычисления хранится в переменной `_'
... _
-3
>>> # В интерактивной консоли результат вычисления выражения пишется на экран
... # Чтобы вывести на экран в скрипте можно использовать функцию `print()'
... print(5 * 6)
30
>>>
24

Переменные

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
>>> # Присваивание делается знаком `='
... a = 30
>>> a / 3
10.0
>>> # Значение может быть присвоено нескольким переменным одновременно
... a = b = c = 0
>>> a
0
>>> b
0
>>> c
0
>>> # Перед использованием переменной в выражении она должна быть определена
... d
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
NameError: name 'd' is not defined
>>>
25

Числовые типы

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
>>> # Есть поддержка чисел с плавающей точкой, длинных, с фиксированной
... # точностью, рациональных, комплексных...
... 3 * 3.75 / 1.5
7.5
>>> i = 1j # мнимая единица
>>> i
1j
>>> i ** 2 # возведение в степень
(-1+0j)
>>> i.real
0.0
>>> i.imag
1.0
>>> (1 + 2j) / (1 + 1j)
(1.5+0.5j)
>>> 2 ** 200
1606938044258990275541962092341162602522202993782792835301376
>>> # Логический тип:
... a = (1 == 2)
>>> print(a)
False
>>> not a
True
>>> x = 30
>>> x > 0  # операторы сравнения: >, <, >=, <=, ==, !=
True
>>> 1 < x and x < 100  # логические операторы: and, or, not
True
>>> 1 < x < 100
True
>>>
26

Строки

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>>> # Строки можно задавать следующим образом:
... 'spam eggs'
'spam eggs'
>>> 'doesn\'t'
"doesn't"
>>> "doesn't"
"doesn't"
>>> '"Yes," he said.'
'"Yes," he said.'
>>> "\"Yes,\" he said."
'"Yes," he said.'
>>> '"Isn\'t," she said.'
'"Isn\'t," she said.'
>>> "first word \
... second word"
'first word second word'
>>> print("first line\n secondline")
first line
 secondline
>>> r"line with \n in middle"
'line with \\n in middle'
>>> """Multiline with ' or "
... Yes.
... """
'Multiline with \' or "\nYes.\n'
>>>
27

Конкатенация строк

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
>>> # Конкатенация строк
... word = 'Help' + 'A'
>>> word
'HelpA'
>>> '<' + word * 5 + '>'
'<HelpAHelpAHelpAHelpAHelpA>'
>>> 'first' 'second'
'firstsecond'
>>> ('first') 'second'
  File "<stdin>", line 1
    ('first') 'second'
                     ^
SyntaxError: invalid syntax
>>> # Строки — неизменяемые
... word[0] = 'x' # word[0] — обращение к первому символу строки
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>>
28

Индексация последовательностей (1/2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> # Индексация в последовательностях (например строках):
... # +---+---+---+---+---+
... # | H | e | l | p | A |
... # +---+---+---+---+---+
... #   0   1   2   3   4   5
... #  -5  -4  -3  -2  -1
... #  v[i] - i-й элемент
... #  v[i:j] - подпоследовательность начиная с i-го включительно,
... #           и до j (не включительно) — полуинтервал [i, j)
... word = 'HelpA'
>>> word[4]
'A'
>>> word[0:2]
'He'
>>> word[2:4]
'lp'
>>> word[:2]    # Первые два символа
'He'
>>> word[2:]    # Всё, исключая первые два символа
'lpA'
>>> word[1:100]
'elpA'
>>> word[10:]
''
>>>
29

Индексация последовательностей (2/2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> # Индексация в последовательностях (например строках):
... # +---+---+---+---+---+
... # | H | e | l | p | A |
... # +---+---+---+---+---+
... #   0   1   2   3   4   5
... #  -5  -4  -3  -2  -1
... #  v[i] - i-й элемент
... #  v[i:j] - подпоследовательность начиная с i-го включительно,
... #           и до j (не включительно) — полуинтервал [i, j)
... word = 'HelpA'
>>> word[-1]     # Последний символ
'A'
>>> word[-2]     # Предпоследний символ
'p'
>>> word[-2:]    # Последние два символа
'pA'
>>> word[:-2]    # Всё, кроме последних двух символов
'Hel'
>>> word[-100:]
'HelpA'
>>> word[-10]    # ошибка
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>>
30

Списки

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
>>> # Список — встроенный в язык тип данных
... a = ['spam', 'eggs', 1234, 30]
>>> # Список — это упорядоченная последовательность элементов.
... # Для списков действуют такие же правила индексации как для строк
... a[0]
'spam'
>>> a[1:3]
['eggs', 1234]
>>> # Но списки, в отличие от строк, изменяемые
... a[1] = 3030
>>> a
['spam', 3030, 1234, 30]
>>> a[:2] + a[3:] * 2
['spam', 3030, 30, 30]
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [1, 2] * 4
[1, 2, 1, 2, 1, 2, 1, 2]
>>>
31

Функция range()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> # Функция range([start,] stop[, step]) создаёт "виртуальную" последовательность
... # (iterable) из натуральных чисел
... a = range(5)
>>> a
range(0, 5)
>>> # Функции, классы и модули в Python имеют способы встроенного документирования
... help(range)  
Help on class range in module builtins:

class range(object)
 |  range(stop) -> range object
 |  range(start, stop[, step]) -> range object
 |
 |  Returns a virtual sequence of numbers from start to stop by step.
 |
 |  Methods defined here:
 |
...

>>> # Функция list (конструктор класса) позволяет создать список по
... # последовательности
... list(range(3, 10, 2))
[3, 5, 7, 9]
>>>
32

Модификация списков (1/2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> # Заменим некоторые элементы:
... a[1:3] = [20, 30]
>>> a
[0, 20, 30, 3, 4, 5, 6, 7, 8, 9]
>>> # Удалим:
... a[1:3] = []
>>> a
[0, 3, 4, 5, 6, 7, 8, 9]
>>> # Вставим:
... a[1:1] = ['bletch', 'xyzzy']
>>> a
[0, 'bletch', 'xyzzy', 3, 4, 5, 6, 7, 8, 9]
>>> # Вставим (копию) самого себя в начало
... a[:0] = a
>>> a
[0, 'bletch', 'xyzzy', 3, 4, 5, 6, 7, 8, 9, 0, 'bletch', 'xyzzy', 3, 4, 5, 6, 7, 8, 9]
>>> # Очистка списка: замена всех значений пустым списком
... a[:] = []
>>> a
[]
>>> # Также, переменную можно удалить командой `del'
... del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>>
33

Модификация списков (2/2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> len(a) # Возвращает длину последовательности
10
>>> len('some string')
11
>>> # Списки, как и почти все контейнеры Python, могут хранить любые объекты
... a[1] = ['another', 'list']
>>> a
[0, ['another', 'list'], 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[1][0]
'another'
>>> b = list(range(3))
>>> b
[0, 1, 2]
>>> # Некоторые операции со списками:
... # добавить в конец
... b.append(10)
>>> b
[0, 1, 2, 10]
>>> # добавить в конец списка элементы из другой последовательности
... b.extend([3, 7, 12, 1, 5])
>>> b
[0, 1, 2, 10, 3, 7, 12, 1, 5]
>>> b.reverse()  # развернуть список
>>> b
[5, 1, 12, 7, 3, 10, 2, 1, 0]
>>> b.sort()     # отсортировать список
>>> b
[0, 1, 1, 2, 3, 5, 7, 10, 12]
>>>
34

Конструкция while

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> # Ряд Фибоначчи:
... # сумма двух элементов определяет следующий элемент
... a, b = 0, 1  # множественное присваивание: a = 0, b = 1
>>> while b < 10:
...     print(b)
...     a, b = b, a + b
...
1
1
2
3
5
8
>>> # while УСЛОВИЕ:
... #     команды
... # Блоки в Python определяются отступом!
... pass # команда "ничего не делать"
>>> while True: # бесконечный цикл, можно прервать по Ctrl+C 
...     pass
...
^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt
>>>
35

Конструкция if

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
>>> # input() можно использовать для чтения ввода с клавиатуры
... s = input("Введите, пожалуйста, целое число: ")
Введите, пожалуйста, целое число: 42
>>> s
'42'
>>> # s — строка, переведём её к целочисленному типу
... x = int(s)
>>> x
42
>>> # Условная конструкция
... if x < 0:
...     print('Отрицательное значение')
... elif x == 0:
...     print('Ноль')
... elif x > 0:
...     print('Больше нуля')
... else:
...     print('Такого быть не может!')
...
Больше нуля
>>>
36

Конструкция for

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
>>> # Конструкция for используется для выполнения какого-то действия
... # для всех элементов последовательности.
... # for ПЕРЕМЕННЫЕ in ИТЕРИРУЕМОЕ-ВЫРАЖЕНИЕ:
... #     команды
... a = ['cat', 'window', 'defenestrate']
>>> for x in a:
...     print(x, len(x))
...
cat 3
window 6
defenestrate 12
>>> # Изменять содержимое контейнера по которому итерируется цикл
... # часто небезопасно
... for x in a[:]: # создадим копию списка
...     if len(x) > 6:
...         a.insert(0, x)
...
>>> a
['defenestrate', 'cat', 'window', 'defenestrate']
>>>
37

Команды break, continue

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
>>> # В циклах можно использовать команды break и continue,
... # а также конструкцию else
... for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'равно', x, '*', n // x)
...             break
...     else:
...         # циклу не удалось найти множитель
...         print(n, '— простое число')
...
2 - простое число
3 - простое число
4 равно 2 * 2
5 - простое число
6 равно 2 * 3
7 - простое число
8 равно 2 * 4
9 равно 3 * 3
>>>
38

Словари

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
>>> # Словарь — контейнер, хранящий пары (ключ, значение), и позволяющий
... # быстро находить по ключу соответствующее значение
... tel = {'jack': 4098, 'sape': 4139}
>>> tel['jack']
4098
>>> tel['guido'] = 4127
>>> tel
{'guido': 4127, 'jack': 4098, 'sape': 4139}
>>> del tel['sape']
>>> tel
{'guido': 4127, 'jack': 4098}
>>> list(tel.keys())
['jack', 'guido']
>>> list(tel.values())
[4098, 4127]
>>> list(tel.items())
[('jack', 4098), ('guido', 4127)]
>>> for name, phone in tel.items():
...     print(name, 'has phone number', phone)
...
guido has phone number 4127
jack has phone number 4098
>>> 'guido' in tel
True
>>> 'sam' in tel
False
>>>
39

Функции

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
>>> # Определение функции
... def fib(n):    # вывести числа Фибоначчи меньшие (вплоть до) n
...     """Выводит ряд Фибоначчи, ограниченный n."""
...     a, b = 0, 1
...     while b < n:
...         print(b, end=' ')
...         a, b = b, a+b
...
>>> # Теперь вызовем определенную нами функцию:
... fib(2000)  
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
>>> help(fib)  
Help on function fib in module __main__:

fib(n)
    Выводит ряд Фибоначчи, ограниченный n.

>>>
40

Функции с аргументами по умолчанию (1/2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>>> def f(a, b, c=5, d=[1,3]):
...     print(a, b, c, d)
...
>>> f(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() missing 1 required positional argument: 'b'
>>> f(1, 2)
1 2 5 [1, 3]
>>> f(1, 2, 'c')
1 2 c [1, 3]
>>> f(1, 2, d='D', c='C')
1 2 C D
>>> def f(a, b, *args):
...     print(a, b, end=' ')
...     for x in args:
...         print(x)
...
>>> f(1, 2)  
1 2
>>> f(1, 2, 3, 4, 5, 6)  
1 2 3 4 5 6
>>> 
41

Функции с аргументами по умолчанию (2/2)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
>>> # Значения по умолчанию вычисляются только один раз!
... def f(a, L=[]):
...     L.append(a)
...     return L
... 
>>> f(1)
[1]
>>> f(2)
[1, 2]
>>> f(3)
[1, 2, 3]
>>> def f(a, L=None):
...     if L is None:
...         L = []
...     L.append(a)
...     return L
... 
>>> f(1)
[1]
>>> f(2)
[2]
>>> 
42

Неименованные аргументы

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
>>> # Есть возможность для получения произвольного количества аргументов
... def f(a, *args, **kwargs):
...     print(args)
...     print(kwargs)
... 
>>> f(1, 'a', 'b', 3, k1=1, k2=2, k3=3)
('a', 'b', 3)
{'k3': 3, 'k2': 2, 'k1': 1}
>>> # Кортеж — контейнер аналогичный списку, но не изменяемый
... a = (1, 2, 3)
>>> a
(1, 2, 3)
>>> a[0:2]
(1, 2)
>>> a[1] = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> b = (1, [])
>>> # Кортеж содержит список объектов, и этот список изменить нельзя
... # Но можно менять сами объекты
... b[1].extend([30, 40])
>>> b
(1, [30, 40])
>>> 
43

Объекты Python (1/3)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> # В Python все хранимые в памяти вещи являются объектами
... # Тип объекта можно получить с помощью функции `type'
... type(1)
<class 'int'>
>>> type(1+2j)
<class 'complex'>
>>> type('aaa')
<class 'str'>
>>> # Каждый объекты имеет идентификатор, который можно получить 
... # с помощью функции `id'
... id(1)  
17528760
>>> id(1+2j)  
17674480
>>> id(2-1)  
17528760
>>> def f():
...     pass
... 
>>> type(f)
<class 'function'>
>>> id(f)  
18917688
>>> 
44

Объекты Python (2/3)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
>>> # Конструкция присваивания `=' на самом деле связывает имя и определённый объект
... a = [1, 2, 3] # связываем имя `a' с объектом списком 
>>> id(a) # ID-объекта, на который ссылается имя `a'  
18908584
>>> b = a # связываем имя `b' с объектом, на который ссылается `a'
>>> id(b) # ID-объекта, на который ссылается `b', такое же как и у `a'!  
18908584
>>> a is b # проверяет, являются ли два объекта одним и тем же
True
>>> a is [1, 2, 3]
False
>>> # Так как `a' и `b' ссылаются на один объект, то при изменении его через
... # одно имя, он окажется изменённым и по другому имени
... a[0] = 'steel'
>>> a
['steel', 2, 3]
>>> b
['steel', 2, 3]
>>> # Числа, строки и некоторые другие объекты являются неизменяемыми, 
... # при попытке их изменения создаётся новый объект.
... a = 1
>>> id(a)  
17528760
>>> b = a
>>> a += 1
>>> id(a)  
17528736
>>> a is b
False
>>> 
45

Объекты Python (3/3)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
>>> def f(a):
...     a.append(30)
... 
>>> # Аргументы в функцию передаются по ссылке
... a = []
>>> f(a)
>>> a
[30]
>>> def g(b):
...     b += 1 # перезапишет на что ссылается локальный `b'
...     print(b)
... 
>>> a = 10
>>> g(a)
11
>>> a
10
>>> # Имя функции — такая же ссылка на объект, как и имя переменной
... F = g
>>> F(10)
11
>>> F is g
True
>>> 
46