Вводная лекция

Кто я такой

  • Магистр кафедры генетики и биотехнологии СПбГУ
     
  • Биоинформатик-аналитик (по факту скорее разработчик ПО) в Parseq Lab
     
  • Пользуюсь js/kotlin/python/java

 

Каналы общения

Домашние задания

1 дедлайн. После него домашние задания принимаются только в случае опоздания по обстоятельствам непреодолимой силы. Непреодолимость оцениваю я.

 

Qui damnare potest, is absolvendi quoque potestatem habet. Julius Paulus

 

За списыванием следует 

о

для обеих сторон

Домашние задания

Пропуск нескольких домашек может и не сказаться на ваших оценках, все зависит от вашей активности

 

Будут бонусные задания

Домашние задания

  • Не надо ничего настраивать
  • Поддержка пакетных менеджеров
  • Автоформатирование по PEP-8
  • Много полезных инспекций
  • Debugging
  • Если вы мне покажете не работающий код в PyCharm я гораздо быстрее разберусь что с ним не так

Почему используем PyCharm

Альтернативы

VSCode

  • Надо настраивать

  • Не знаю как там с инспекциями

  • Пытался несколько раз им пользоваться, но из-за различия раскладок горячих клавиши прочих мелких различий так и не слез с 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)

Некоторые инструкции могут включать в себя выражения или являться выражением

Выражение - что-то что можно вычислить

statement
expression
a =
1 + 1
print(
2 + 3
)
  • Все есть объект
     
  • Объект - сгруппированный набор данных, над которым объект умеет совершать какие-то действия
     
  • У объекта есть тип/класс
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
Вот тут можно тоже в общих словах почитать

Почему так? Плюсы

  • Не нужно писать типы руками и создателям интерпретатора вывод типов реализовывать

     

  • Duck typing. Тип объекта не важен, если у него есть метод или атрибут с таким же названием

     

  • И другие преимущества...

Почему так? Минусы

  • Чем раньше мы узнаем об ошибках, тем лучше.
    e.g. у нас может быть кусок кода срабатывающий раз в месяц, пока он не сработает, мы не узнаем есть в нем проблема или нет

     

  • Страшнее изменять код. Пока не запустишь не узнаешь, где что-то отвалилось

Control flow

    if <expr>:
        <stmt_list>
    (elif <expr>:
        <stmt_list>)*
    (else:
        <stmt_list>)?
                        

Написали мы программу, что с ней дальше делать?

  • Использовать в личных целях, никому не показывать

     

  • Поделиться с окружающими

Колхозная система контроля версий

                final_final_program.py
                final_program.py
                first_version.py
                program_v3.py
                second_version.py
                
Но ионгда это работает - статья на хабре
Система контроля версий
"Провайдеры"
Если ты не программист, то пайтон тебе нужен только для правильного парсинга
Сначала я чувствовал себя говном. Потом говном, которое что-то умеет
Made with Slides.com