Skip to content
Snippets Groups Projects
Commit fcd5c86e authored by S.Guliaev's avatar S.Guliaev
Browse files

Added Lecture 2

parent abf369ee
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
# Python
## Начальный уровень
## Вводная лекция
### Раздел 1. Общие соображения
#### Мотивация для изучения Python
Несколько плюсов языка Python:
- Python - один из самых широко используеммых языков программирования. В рейтингах популярности и востребованности языков он давно уже не опускается ниже 5 позиции.
- Python очень гибкий с точки зрения используеммых конструкций и подходов. Он позволяет вам писать классический императивный (процедурный код), объектно-ориентированный код, функциональный код или любую их комбинацию. Эта особенность способствует очень высокой скорости разработки (при этом, на мой взгляд, снижает читаемость по сравнению с "чистыми" языками программирования, где есть возможность придерживаться только одной парадигмы).
- Python очень требователен к оформлению кода по сравнению с другими языками программирования. К тому же, есть документ [PEP 8](https://www.python.org/dev/peps/pep-0008/), который содержит соглашения относительно оформления кода, которые не являются обязательными, но строго рекомендуются к исполнению. Все это влечет к простоте прочтения кода на Python.
- Python обладает невероятно большим списком областей применения: утилитарные скрипты; анализ, обработка, хранение, визуализация и передача данных; web- и сетевое программирование; программирование приложений для desktop- и mobile-систем; web-scrapping, offensive-security и тестирование приложений; программирование микроконтроллеров — и многие другие задачи могут быть эффективно решены при помощи Python.
Основными недостатками Python можно назвать:
- Ограниченный набор базовых конструкций языка и ограниченный функционал стандартной библиотеки.
- Низкая скорость выполнения кода.
- Реализация многих реальных механизмов взаимодействия в коде скрывается "под капотом" от пользователя.
#### Литература для этого курса
Единственная книга, которая является обязательной для этого курса:
**Programming in Python 3 : a complete introduction to the Python language / Mark Summerfield. — 2nd ed.**
В природе существует ее *перевод на русский язык*.
Еще книги, которые будут полезны:
- **Learning Python, Fifth Edition by Mark Lutz** — какое-то издание точно переведено на русский.
- **Python Pocket Reference, Fifth Edition by Mark Lutz** — какое-то издание точно переведено на русский.
- **Python Cookbook, Second Edition Edited by Alex Martelli, Anna Martelli Ravenscroft, and David Ascher** — не встречал, но наверняка есть перевод.
- Любая другая литература, которую найдете (с некоторыми оговорками).
#### Темы и модули, которые будут затронуты в этом курсе.
В ходе этих лекций мы постараемся затронуть как можно больше областей и модулей, поэтому характер изучения конкретных модулей может оказаться весьма поверхностным. Приведенный ниже список не является исчерпывающим.
##### Работа с данными (получение, передача, хранение, выборка, визуализация)
- sqlite3;
- MySQLdb;
- psycopg2;
- pymongo;
- Pandas;
- Vedis;
- matplotlib;
- bokeh.
##### Обработка данных
- NumPy;
- SymPy;
- SciPy.
*Более подробное изучение этой области смотрите в курсе "Машинное обучение на Python" (ссылка появится позже)*
##### Web
- pika;
- CherryPy;
- Django;
- Flask;
- Sphinx.
##### Тестирование
- selenium.
##### Web-scrapping
- BeautifulSoup;
- scrapy.
#### Варианты установки и запуска Python
На момент написания курса у меня стоит версия Python 3.6.5, на нее и будем ориентироваться.
Основных способов написания Python-кода 3:
1. Скачать один из дистрибутивов, который будет содержать сразу IDE и интерпретатор.
2. Скачать отдельно интерпретатор и писать код в текстовом редакторе или IDE по выбору.
3. Пользоваться сервисом Jupyter с онлайн-доступом, ничего не скачивая.
##### 1. Дистрибутивы
- [Официальный дистрибутив с IDLE](https://www.python.org/downloads/).
- [Anaconda — очень популярный дистрибутив](https://www.anaconda.com/download/).
- [Python(x, y) — дистрибутив, ориентированный на научные вычисления и визуализацию](https://python-xy.github.io/).
##### 2. Интерпретатор
В Windows скачиваем [официальный дистрибутив](https://www.python.org/downloads/), после чего создаем свои файлы с расширением .py и запускаем в командной строке команду python, передавая ей в качестве аргумента путь (абсолютный или относительный) к файлу .py.
В Linux-based системах, скачиваем пакет python3 (иногда называется python) с помощью своего пакетного менеджера, после чего создаем свои файлы с расширением .py и запускаем в командной строке команду python3 (или python), передавая ей в качестве аргумента путь (абсолютный или относительный) к файлу .py. Также необходимо поставить менеджер пакетов для python — pip (как правило, пакет python3-pip).
Сам интерпретатор можно запустить и без аргументов, тогда он запустится в интерактивном режиме.
После того, как вы установили интерпретатор, вы можете воспользоваться любым удобным IDE (самые популярные: PyCharm и Visual Studio) или текстовым редактором (neovim, spacemacs, Sublime, Atom, Visual Studio Code и др.).
##### 3. Jupyter notebook
Jupyter можно [использовать онлайн без установки](http://jupyter.org/try). Просто загрузите свой iPython notebook файл и эксперементируйте!
#### Где искать информацию?
Загугли!
Если не получилось загуглить — спроси в канале Slack #python.
Стесняешься спросить — напиши мне в личку в ВК, телеге, твиттере или слаке (@devsagul).
Совсем не стесняешься спросить — сделай mention в твиттере, может отвечу :)
#### Куда слать домашку?
Если ты вдруг что-то сделал и хочешь похвастаться — залей на github или gitlab, а ссылку присылай мне. Как прислать? Смотри пункт выше + почта [s.guliaev@lambda-it.ru](mailto:s.guliaev@lambda-it.ru).
%% Cell type:markdown id: tags:
### Раздел 2. It's time to get our hands dirty или императивное (процедурное) программирование в Python
#### Hello, World!
Изучение любого языка программирования начинается с программы "Hello, World!", давайте не отходить от этой славной традиции:
%% Cell type:code id: tags:
``` python
print("Hello, World!")
```
%% Output
Hello, World!
%% Cell type:markdown id: tags:
Сразу можно отметить, что функция вывода сообщения на экран в Python вызывается как совершенно обычная функция. Также видно, что никаких точек запятой после завершения утверждения нет. В Python точка с запятой используется только для разделения нескольких утверждений на одной строке.
%% Cell type:markdown id: tags:
#### Типы данных в Python
Python содержит огромное количество разнообразных типов данных, но пока мы сосредоточим свое внимание на двух из них:
целочисленный и строковый тип. Целочисленный тип обозначается ключевым словом int, а строковый — ключевым словом str. Исходя из названия, легко понять, что целочисленный тип предназначен для хранения целых чисел, а строковый — строковых литералов. Вот примеры нескольких литералов:
%% Cell type:code id: tags:
``` python
123
3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067
0
-12
"Hello, World!"
'I prefer Python over PHP'
''
'It is really useful, что можно использовать символы Юникода в строковых литералах. Εύρηκα!'
```
%% Output
'It is really useful, что можно использовать символы Юникода в строковых литералах. Εύρηκα!'
%% Cell type:markdown id: tags:
Как можно заключить по второму числу, тип int в Python не ограничен каким-то конкретным размером, а зависит от объема памяти на вашем компьютере. Строковые литералы можно заключать в одинарные или двойные кавычки и использовать в них символы Юникода. Пустая строка обозначается просто парой кавычек.
%% Cell type:markdown id: tags:
Строки в Python можно рассматривать как массивы символов. Следовательно, для них есть операции получения элемента по индексу и получения среза:
%% Cell type:code id: tags:
``` python
print("The New York Times"[4])
print("Hot Dogs"[4:6])
print("Python"[0])
```
%% Output
N
Do
P
%% Cell type:markdown id: tags:
Нумерация индексов начинается с нуля, отрицательные индексы отсчитываются с конца в обратном направлении. Более подробно операция получения среза будет рассмотрена позже.
%% Cell type:markdown id: tags:
Для перевода данных их одного типа в другой, нужно вызвать этот тип данных в качестве функции и передать ему значение, которое будем переводить:
%% Cell type:code id: tags:
``` python
int('45')
str(10000)
int(' 1605 ')
```
%% Output
1605
%% Cell type:markdown id: tags:
Как видно из последнего примера, int при переводе строкового литерала удаляет все лидирующие и завершающие пробельные символы.
%% Cell type:markdown id: tags:
#### Переменные
Python — язык со слабой (утиной) типизацией. Более того, нет необходимости указывать тип переменной. Более того, переменная может принять значение любого другого типа в любой момент:
%% Cell type:code id: tags:
``` python
x = 1605
x = "November fifth"
```
%% Cell type:markdown id: tags:
Соглашения относительно именования различных сущностей можно посмотреть в [PEP 8](https://www.python.org/dev/peps/pep-0008/#naming-conventions).
%% Cell type:markdown id: tags:
#### Типы данных-коллекции
Все типы данных в Python делятся на *изменяемые* и *неизменяемые*. Многие типы, которые мы будем рассматривать, можно будет разделить на пары, очень близкие по смыслу, но отличающиеся только тем, что одни изменяемы, а другие — нет. С практической точки зрения, неизменяемые типы необходимы для того, чтобы их можно было хешировать.
Первая коллекция которую мы рассмотрим — *кортежи*. Кортежи — неизменяемые упорядоченные последовательности элементов. Для получения кортежа можно просто выражения через запятую:
%% Cell type:code id: tags:
``` python
"HTML", "CSS", "JavaScript"
```
%% Output
('HTML', 'CSS', 'JavaScript')
%% Cell type:markdown id: tags:
Также кортежи могут быть заключены в скобки. Для создания кортежа из одного элемента необходимо поставить запятую, даже если мы заключаем его в скобки:
%% Cell type:code id: tags:
``` python
"React",
```
%% Output
('React',)
%% Cell type:code id: tags:
``` python
("Vue", )
```
%% Output
('Vue',)
%% Cell type:markdown id: tags:
Для создания пустого кортежа необходимо поставить скобки:
%% Cell type:code id: tags:
``` python
()
```
%% Output
()
%% Cell type:markdown id: tags:
Списки — очень близкие родственники кортежей, но они изменяемы. Для создания списка необходимо перечислить его элементы в квадратных скобках через запятую:
%% Cell type:code id: tags:
``` python
[4, 8, 15, 16, 23, 42]
['Rust', 'Haskell', 'Racket']
[-12, 'Farenheit', 451]
[]
```
%% Output
[]
%% Cell type:markdown id: tags:
Последний пример — создание пустого списка.
%% Cell type:markdown id: tags:
Для получения количества элементов в коллекции используется функция len:
%% Cell type:code id: tags:
``` python
len(['Rust', 'Haskell', 'Racket'])
```
%% Output
3
%% Cell type:markdown id: tags:
Для добавления элемента в список можно использовать метод append:
%% Cell type:code id: tags:
``` python
x = ['Harris', 'Summerfield']
x.append('Tanenbaum')
list.append(x, 'Ritchie')
print(x)
```
%% Output
['Harris', 'Summerfield', 'Tanenbaum', 'Ritchie']
%% Cell type:markdown id: tags:
Как и было сказано выше, у коллекций есть возможность обращаться к элементу по индексу:
%% Cell type:code id: tags:
``` python
x = ['Harris', 'Summerfield']
x[1]
```
%% Output
'Summerfield'
%% Cell type:markdown id: tags:
#### Логические операторы
Оператор тождественности (идентичности), или оператор is, проверяет, являются ли две сущности ссылками на один объект:
%% Cell type:code id: tags:
``` python
a = [451, "Farenheit"]
b = [451, "Farenheit"]
print(a is b)
b = a
print(a is b)
```
%% Output
False
True
%% Cell type:markdown id: tags:
Наиболее распространенный способ использования оператора is — сравнение со встроенным Null-объектом, None:
%% Cell type:code id: tags:
``` python
a = 100
b = None
print(a is None, b is None)
```
%% Output
False True
%% Cell type:markdown id: tags:
#### Операторы сравнения
В питоне присутствует вполне обычный набор операторов сравнения:
- < — меньше;
- <= — меньше или равно;
- == — равно;
- != — не равно;
- \>= — больше или равно;
- \> — больше.
%% Cell type:code id: tags:
``` python
2 < 3, 4 != 16, 1 >= 8, 8 > 12
```
%% Output
(True, True, False, False)
%% Cell type:markdown id: tags:
#### Оператор вхождения
Для типов данных, которые являются наборами данных, существует проверка на вхождение:
%% Cell type:code id: tags:
``` python
Nebuchadnezzar = ['Neo', 'Trinity', 'Morpheus', 'Mouse',
'Dozer', 'Tank', 'Cypher', 'Apoc', 'Switch']
print('Neo' in Nebuchadnezzar, 'Smith' in Nebuchadnezzar,
'V' in 'Vendetta', 'Я' in 'Команда')
```
%% Output
True False True False
%% Cell type:markdown id: tags:
#### Логические операторы
В Python есть следующие логические операторы:
- not — логическое НЕ;
- or — логическое ИЛИ;
- and — логическое И;
%% Cell type:code id: tags:
``` python
print(not False, not True)
print(False or False, False or True, True or True)
print(False and False, False and True, True and True)
```
%% Output
True False
False True True
False False True
%% Cell type:markdown id: tags:
#### Выражения, контролирующие порядок выполнения программы
Конструкции, которые мы изучили на данный момент, хоть и позволяют строить простейшие программы, но все же предоставляют весьма ограниченный инструментарий. Нам необходимы конструкции, которые позволяют анализировать ход выполнения программы и передавать управления тем или иным инструкциям. Сейчас мы рассмотрим ветвление, циклы и исключения.
##### Ветвление (if, if-else, if-elif, if-elif-else)
Конструкция ветвления if позволяет проверить выполнение условия и, в зависимости от того, является ли утверждение истинным, выполнить тот или иной блок операторов:
%% Cell type:code id: tags:
``` python
if 'PHP' is 'Viable Programming Language':
print('It must be snowing!')
else:
print("Don't worry, everythin is alright!")
```
%% Output
Don't worry, everythin is alright!
%% Cell type:markdown id: tags:
Обратите внимание, что вложенный блок отделяется четыремя пробелами. Так в Python форматируются все вложенные блоки, что позволяет писать крайне читаемый код без каких-либо фигурных скобок.
Конструкция if предусматривает использование без else. К тому же между if и else можно расположить любое количество elif (сокращенный вариант словосочетания "else if"). В таком случае также можно опустить последний else:
%% Cell type:code id: tags:
``` python
color = 'magenta'
if color == 'blue':
print('Color is blue!')
elif color == 'red':
print('Color is red!')
elif color == 'green':
print('Color is green!')
else:
print("I don't know that color!")
```
%% Output
I don't know that color!
%% Cell type:markdown id: tags:
##### Цикл с предусловием (while)
Конструкция while позволяет проверять на истинность некоторое выражение и выполнять некоторый блок кода, пока это выражение является истинным:
%% Cell type:code id: tags:
``` python
i = 1
while i < 100:
i += 1
print(i)
```
%% Output
100
%% Cell type:markdown id: tags:
##### Итеративный цикл (for ... in ...)
Итеративный цикл позволяет проходить все члены некоторой последовательности, например мы задались целью перечислить всех членов экипажа Навуходоносора:
%% Cell type:code id: tags:
``` python
Nebuchadnezzar = ['Neo', 'Trinity', 'Morpheus', 'Mouse',
'Dozer', 'Tank', 'Cypher', 'Apoc', 'Switch']
for crew_member in Nebuchadnezzar:
print(crew_member)
```
%% Output
Neo
Trinity
Morpheus
Mouse
Dozer
Tank
Cypher
Apoc
Switch
%% Cell type:markdown id: tags:
##### Обработка исключительных ситуаций
Python содержит в себе механизм исключений. Это специальный механизм, который позволяет обрабатывать исключительные ситуации, возникающие в ходе выполнения программы не вместе, где эта исключительная ситуация возникла, а там, где нам это удобно. Например, давайте попробуем привести пользовательский ввод к целому числу, а если не получится — сообщим ему, что именно нас не устраивает:
%% Cell type:code id: tags:
``` python
in_s = input("Введите целое число: ")
try:
i = int(in_s)
print("Все верно, введено число ", i)
except ValueError as e:
print("Не было введено целое число")
print(e)
```
%% Output
Введите целое число: 3.1415
Не было введено целое число
invalid literal for int() with base 10: '3.1415'
%% Cell type:markdown id: tags:
Пока остановися на такой базовой обработке исключений. Отметим, что ValueError — специальный класс исключений, предназначений для обработки ошибок значений, передаваемых в некоторую функцию. Более подробно исключения будут рассмотрены позже.
%% Cell type:markdown id: tags:
#### Арифметические операторы
Очевидно, в Python есть базовые арифметические операторы:
- \+ — сложение;
- \- — вычитание;
- \* — умножение;
- / — деление.
К тому же для каждого из этих операторов есть комбинированный оператор присваивания:
- += — присваивание с суммированием;
- -= — присваивание с вычитанием;
- \*= — присваивание с умножением;
- /= — присваивание с делением.
Есть и другие арифметические операторы, а также модуль math, содержащий много всего интересного, но пока мы остановимся на этом.
%% Cell type:code id: tags:
``` python
a = 5
b = 2
print(a + b)
print(a - b)
print(a * b)
print(a / b)
a += 6
print(a)
a -= 4
print(a)
a *= 10
print(a)
a /= 2
print(a)
```
%% Output
7
3
10
2.5
11
7
70
35.0
%% Cell type:markdown id: tags:
Хотелось бы отметить, что в отношении последовательностий операция + имеет смысл "конкатенации", а операция * — повторения. Например, рассмотрим на строках:
%% Cell type:code id: tags:
``` python
s = "I love " + "Python"
print(s)
s += " 3"
print(s)
s = "Python " * 2
print(s)
s *= 5
print(s)
```
%% Output
I love Python
I love Python 3
Python Python
Python Python Python Python Python Python Python Python Python Python
%% Cell type:markdown id: tags:
#### Ввод и вывод данных
Мы уже столкнулись с фукциями input и print, но давайте рассмотрим их подробно. Функция input может вызываться с аргументом или без аргументов. Смысл этого аргумента в том, что это будет строка подсказки при вводе. Например:
%% Cell type:code id: tags:
``` python
name = input('Как тебя зовут: ')
print('Приветствую тебя, ' + name + '!')
```
%% Output
Как тебя зовут: Семен
Приветствую тебя, Семен!
%% Cell type:markdown id: tags:
Функция считает строку с потока чтения, пока не встретит последовательность символов, означающую конец строки или символ конца файла (EOF)
Для вывода данных используется функция print, которой передается любое количество аргументов, которые будут приведены к строкам:
%% Cell type:code id: tags:
``` python
print(None, True, False, 12, 'Просто строка', ('Кортеж', 'из', '4', 'строк'))
```
%% Output
None True False 12 Просто строка ('Кортеж', 'из', '4', 'строк')
%% Cell type:markdown id: tags:
#### Написание и вызов функций
Функции предназначены для тех ситуациий, когда один и тот же участок программного кода необходимо выполнить, но с разными входными параметрами. Для определения функции используется конструкция def, после нее идет имя функции, потом в скобках ее аргументы и во вложенном блоке тело функции. Соединим все знания, которые мы получили за сегодня и напишем функцию, которая считывает целое число, ввобдимое пользователем. При этом в качестве аргумента мы ей передадим строку-подсказку. Если пользователь не вводит целое число, то мы выведем ему сообщение о том, что это необходимо. Наша функция будет выполняться, пока число не будет получено:
%% Cell type:code id: tags:
``` python
def get_int_from_input(message):
while True:
try:
i = input(message)
i = int(i)
return i
except ValueError as e:
print('Не было введено целое число!')
print(e)
doors = get_int_from_input('Введите количество дверей в вашем автомобиле: ')
print('Количество дверей равно ', doors)
```
%% Output
Введите количество дверей в вашем автомобиле: 3
Количество дверей равно 3
%% Cell type:markdown id: tags:
Обратите внимание, что для возвращения значения из функции используется конструкция return.
%% Cell type:markdown id: tags:
### Раздел 3. Домашнее задание
Прочитать первую главу Саммерфилда, выполнить упражения из нее.
Написать игру 'быки и коровы'.
Решить [задачу](https://lambda-it.ru/post/20).
Почитать на вики про циклы, рекурсию.
Найти информацию о классификациях языков программирования.
Поискать сравнительный анализ интерпретируемых, частично-интерпретируемых и компилируемых языков программирования.
Прочитать [PEP 8](https://www.python.org/dev/peps/pep-0008/?)
Дойти до нашего Slack. Задавать все вопросы мне, либо своим пирам (товарищам, проходящим этот курс), либо просто в канале #python. Не согласен с чем-то — напиши мне. Хочешь помочь — тоже пиши.
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment