Вводная лекция
Кто я такой
- Магистр кафедры генетики и биотехнологии СПбГУ
- Биоинформатик-аналитик (по факту скорее разработчик ПО) в Parseq Lab
- Пользуюсь js/kotlin/python/java
Каналы общения
-
sl.aleksandr28@gmail.com
Домашние задания
1 дедлайн. После него домашние задания принимаются только в случае опоздания по обстоятельствам непреодолимой силы. Непреодолимость оцениваю я.
Qui damnare potest, is absolvendi quoque potestatem habet. Julius Paulus
За списыванием следует
о
для обеих сторон
Домашние задания
Пропуск нескольких домашек может и не сказаться на ваших оценках, все зависит от вашей активности
Будут бонусные задания
Домашние задания
- Не надо ничего настраивать
- Поддержка пакетных менеджеров
- Автоформатирование по PEP-8
- Много полезных инспекций
- Debugging
- Если вы мне покажете не работающий код в PyCharm я гораздо быстрее разберусь что с ним не так
Почему используем PyCharm
Альтернативы
-
Надо настраивать
-
Не знаю как там с инспекциями
-
Пытался несколько раз им пользоваться, но из-за различия раскладок горячих клавиши прочих мелких различий так и не слез с PyCharm
-
Очень удобный текстовый редактор в принципе
-
Если надо что-то очень быстро написать, и лень ждать пока PyCharm откроется и проиндексируется
-
Тоже есть куча каких-то плагинов, их не пробовал
-
Когда я его видел в последний раз, выглядел отвратительно
-
Не пользовался, поэтому по сути предъявить нечего
-
Поддержка этих Jupyter ноутбуков есть в PyCharm
-
Нет инспекций и прочей интересной фигни
-
Кэширует результаты исполнения фрагментов
кода, часто можно отстрелить себе ногу
-
Возможно для Data Science он и хорош, но мы тут программированием попробуем заняться
-
Настоятельно прошу не использовать его для нашего курса (за пределами сколько угодно)
Стандартные моменты, вызывающие возмущение
и мои нелепые отмазки
Я хочу, чтобы мне все рассказали, а меня документацию заставляют читать
-
Времени мало, тем много
-
А потом вам кто рассказывать будет
-
Гораздо лучше попробовать понять материал самому, а потом просто уточнить непонятные моменты
-
Объясняющему полезно - лучше поймет во время объяснения
-
Плюс его объяснение может быть проще, так его бэкграунд гораздо ближе к вашему
Попросили другого студента, что-то объяснить
Зачем мне слушать студента, он же ничего не понимает как и я
Обсуждение чужих решений
-
Любой код - чужое решение
-
Пальцами мы ни на кого показывать не будем
-
Удобные и реальные примеры для иллюстрации некотрых моментов
-
Я тоже пишу говнокод, стыдного в этом ничего нет
-
Проверять домашки, которые приходят в разное время тяжело
-
Пояснять их тоже тяжело, так как идет запоздание в 2 недели
-
Плюсов от этого мало, все равно все всё делают в последний день
Один дедлайн
Много сложных заданий, мало простых
-
Простых заданий много в интернете, было бы желание их решать
Применение в биоинформатике
-
Простые приложения, типа работы с биоинформатическими форматами данных мы рассмотрим
-
Будут задачи связанные с тем, что вы на дискретной математике проходите
-
Для остального есть проекты
-
Цель курса научиться программировать в целом, как вы потом приложите свои знания зависит от вас
-
Реальные задачи - редкие и сложные
Зачем нам нужно программирование?
Автоматизация задач
Задачи могут быть разными, начиная от парсинга файлов, заканчивая созданием машин, управляемых искусственным интеллектом
Задачи могут быть сложными, наша цель как программистов в первую очередь решить их максимально понятно для людей
Programming has to become the act of reducing complexity to simplicity
Неплохая книжка про то как надо подходить к программированию, мысли верные, но обещанного научного подхода я в ней не увидел.
Хорошо хоть короткая
Все круто:
-
больше думаем/планируем
-
меньше пишем
-
общаемся с коллегами
Но есть ньюанс...
Надо все как-то обяснить компьютеру
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;string to be printed
len equ $ - msg ;length of the string
По большому счету он умеет только двигать байты между регистрами и производить над ними арифметические операции (очень грубо)
К счастью для нас был придуман ряд абстракций в виде языков программирования, скрывающих от
нас низкоуровневые детали,
но есть нюанс...
И сказал Господь: вот, один народ, и один у всех язык; и вот что начали они делать, и не отстанут они от того, что задумали делать; сойдем же и смешаем там язык их, так чтобы один не понимал речи другого (Бытие:11 6-7)
В чем различия?
-
Близость к железу (ручному копанию в памяти компьютера) - низко/высокоуровневость
-
Типизация - статическая/динамическая, строгая/слабая
-
Способ трансляции в машинный код - компилируемый/интрепретируемый
-
Богатство экосистемы
-
Понятность простым смертным
Python our savior
-
Высокоуровневый
-
Динамически типизированный
-
Интерпретируемый*
-
Много бибилиотек
Создан в 1991
Назван в честь шоу Monty Python
Две основные версии - 2 и 3
Наконец-то 2 версия отдает концы (в конце этого года)
Еще немного общей информации
Guido van Rossum. Python's
Benevolent Dictator For Life*
Где применяется питон
- Data science
- Backend
- Desktop apps
- Mobile apps*
- Game development*
Компьютер воспринимает все команады однозначно, поэтому у языков программирования все немного строже, чем у обычных языков
Синтаксис - определяет из каких наборов символов в каком порядке может состоять программа
Семантика - определяет к каким действиям приведет наш набор символов
print('Hello world')
console.log('Hello world')
fun main() {
println("Hello world")
}
print("Hello world")
#include <stdio.h>
void main()
{
printf("Hello world\n");
}
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
------.--------.>+.>.
Синтаксис
На ассемблере вы уже видели
Кто задает семантику?
У питона строгой спецификации нет. Реализации могут отличаться
- СPython - основная имплементация
- PyPy - написан на python
- Jython - написан на Java
Синтаксически верная программа
a = "Hello"
b = "World"
print(a / b)
Из чего состоят программы на питоне
Lines
Identifiers
Keywords
Literals
Operators
Identifiers
# identifier := _A-Za-z[_A-Za-z0-9]* - Упрощенно, 3 версия питона понимает и юникод, но не весь
π = 3.14159
jalapeño = "a hot pepper"
ラーメン = "delicious"
# ☃ = "brrr!" эмодзи, например, нельзя
_one = 1
__two = 2
_4ever = 0
snake_case = "python variables"
camelCase = "not python"
CamelCase = "python classes"
AAAAA_AAAAA = "constant varibles"
False await else import pass
None break except in raise
True class finally is return
and continue for lambda try
as def from nonlocal while
assert del global not with
async elif if or yield
Keywords
Operators & Delimiters
+ - * ** / // % @
<< >> & | ^ ~
< > <= >= == !=
( ) [ ] { }
, : . ; @ = ->
+= -= *= /= //= %= @=
&= |= ^= >>= <<= **=
Literals
Константные значения некоторых встроенных типов
- Целые числа
- Строки
- Числа с плавающей точкой
Вот тут можно про все это почитать самому
Expressions & Statements
Вся программа состоит из инструкций (statements)
Некоторые инструкции могут включать в себя выражения или являться выражением
Выражение - что-то что можно вычислить
- Все есть объект
- Объект - сгруппированный набор данных, над которым объект умеет совершать какие-то
действия
- У объекта есть тип/класс
b = 42 # type: int
c = 6.022e23 # type: float
d = False # type: bool
e = b"W3C" # type: bytes
a = "Why do I exist?" # type: str
g = 1, 2, 4 # type: tuple
h = 1, # type: tuple
f = [1, 2, 4] # type: list
k = {1, 2, 3} # type: set
q = {"dog": "god", "artist": "behemoth"} # type: dict
x = print # type: callable
Зачем нам тип объекта?
Тип описывает какие данные должны лежать в объекте и что с ними можно сделать
Откуда питон знает какого типа данные лежат в переменной?
Пришло время поговорить об алгоритме Хиндли для вывода типов
На самом деле никакого вывода типов в питоне нет.
Питону в приницпе без разницы какой тип данных лежит в переменной. Он достанет значение, попробует сделать то, что вы ему сказали, и сдохнет если не сможет
dynamic typing: pic.twitter.com/QnRBFxB2fh
— Vanessa McHale (@vamchale) August 23, 2019
Почему так? Плюсы
- Не нужно писать типы руками и создателям интерпретатора вывод типов реализовывать
-
Duck typing. Тип объекта не важен, если у него есть метод или атрибут с таким же
названием
- И другие преимущества...
Почему так? Минусы
- Чем раньше мы узнаем об ошибках, тем лучше.
e.g. у нас может быть кусок кода срабатывающий раз в месяц, пока он не сработает, мы не узнаем есть в нем проблема или нет - Страшнее изменять код. Пока не запустишь не узнаешь, где что-то отвалилось
Control flow
if <expr>:
<stmt_list>
(elif <expr>:
<stmt_list>)*
(else:
<stmt_list>)?
Написали мы программу, что с ней дальше делать?
- Использовать в личных целях, никому не показывать
- Поделиться с окружающими
"Software being "Done" is like lawn being 'Mowed'." - Jim Benson
— Programming Wisdom (@CodeWisdom) August 1, 2019
Колхозная система контроля версий
final_final_program.py final_program.py first_version.py program_v3.py second_version.py
Если ты не программист, то пайтон тебе нужен только для правильного парсинга
Сначала я чувствовал себя говном. Потом говном, которое что-то умеет
deck
By Aleksandr Slepchenkov
deck
- 439