01. Вводные курса. Установка ПО. Введение в Python.


Вводные курса

Страница курса

➡️ Открываем вики-страницу курса

💬 Чат в телеграме $-$ для общения и вопросов.
📢 Канал в телеграме $-$ для актуальных новостей.

Формула оценивания

$$О_{итог} = 0.4 * O_{семинары} + 0.6 * O_{ДЗ}$$

📚 В конце каждого семинара выполняются самостоятельные задания (есть бонусные задачи, они помечены звездочкой), которые можно дорешивать до +-следующего семинара (дедлайн всегда видно в контесте). Итоговая оценка за семинарскую часть по 10-ти балльной шкале вычисляется следующим образом:

$$(\text{набранные основные баллы + набранные дополнительные баллы} / \text{основная сумма баллов}) * 10 + 1.5$$

📝 Будет 3 домашних задания с равнозначным весом, на выполнения каждого дается около 3х недель

Пилотная группа

Желающим студентам предоставляется возможность сдать тестовое задание на знание программы курса и перейти в пилотную группу

📍 Мидтерм и экзамен $-$ очные контесты по алгоритмам
📍 Неоцениваемые задачи для самостоятельного изучения, по темам которых будут упомянутые контрольные
📍 Отказаться от перехода можно вплоть до конца первого модуля, тогда ему засчитываются пропущенные формы контроля (семинары, ДЗ1)
📍 Формула оценивания:

$$О_{итог} = 6 + 0.2 * O_{мидтерм} + 0.2 * O_{экзамен}$$

Установка ПО

ПОЖАЛУЙСТА, если у вас возникнут проблемы с какой-либо инструкцией, обратитесь за помощью к семинаристу (подняв руку на семинаре, подойдя после семинара, написав в телеграм) - мы поможем!

Jupyter Notebook

Jupyter Notebook (джупитер ноутбук, тетрадка, ноутбук, ипунб-файл) $-$ это программа для интерактивных вычислений. Тут можно писать текст, код на языке Python, выводить картинки, работать с командной строкой. Все семинары мы будем выдавать в виде таких тетрадок.

Например:

In [1]:
print('Hello World!')
Hello World!
In [2]:
!echo Hello World!
Hello World!

Инструкция по установке и запуску Jupyter Notebook

(0) Скачиваем Python
(1) Если на вашем компьютере стоит:

  • Windows 10:
  • Windows ниже 10й версии или не получается/не хочется работать с терминалом Ubuntu:
    • скачиваем и устанавливаем облегченную версию Анаконды - Миниконду
    • находим и открываем Anaconda Prompt терминал
  • Linux/Mac:
    • открываем терминал (Ctrl + Alt + T / Search)

(2) Вводим в терминале pip3 install notebook (или conda install notebook) и ждем окончания загрузки (возможно будет необходимо удовлетворить какие-то потребности системы, когда она например просит сделать apt-get update, apt-get install python3-pip и прочие сообщения от системы) (3) Перед полем ввода видим расположение, в котором "мы находимся" (например, C:\Users\User или ~ - корневая директория)
(4) Необходимо решить, где мы будем обычно хранить и открывать тетрадки. Я рекомендую перейти в корень диска, создать там новую папку (заменив (ваше имя пользователя) и NAME на любое удовлетворяющее название) и перейти в неё, то есть скопировать и выполнить следующую команду в терминале:

  • Windows 10 Ubuntu: cd /mnt/c/Users/<USERNAME> && mkdir NAME && cd NAME
  • Linux/Mac: cd /Users/<USERNAME> && mkdir NAME && cd NAME
  • Anaconda Prompt: cd C:\Users\<USERNAME> && md NAME && cd NAME

(cd - перейти в папку, mkdir - создать папку)

(5) Вводим jupyter notebook и в браузере открывается вкладка localhost:8888/tree (возможно снова придется удовлевторить какие-то потребности системы, например, когда она скажет сделать apt-get install jyputer-notebook и прочие сообщения от системы)

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

  1. Cкачать полную версию Anaconda, где есть Jupyter Notebook (запускается как программа), а так же есть Spyder (IDLE, аналог Pycharm)
  2. Онлайн: http://colab.research.google.com , http://repl.it (IDLE)

Cоздать новую тетрадку: New -> Python3

Открыть готовую тетрадку: скачиваем/переносим тетрадку в ту папку, из которой запускаем Джупитер и открываем ее в меню

Создать ячейку какого-то типа: кнопка + и выпадающее меню справа для выбора типа ячейки, горячие клавиши A, B, Y, M, R (см. Help -> Keyboard Shortcuts)

Запуск/компиляция ячейки: Shift + Enter

PyCharm

Обычно программируют не в ноутбуке, а в средах разработки для Python, одна из самых популярных - Pycharm. Её нужно скачать тут: https://www.jetbrains.com/pycharm/download/

В Pycharm проще создавать проекты и выполнять домашние задания, впрочем как и семинарские задачи тоже.

Подробнее как работать в Pycharm - читайте туториал от разработчиков и задавайте вопросы семинаристам.

Yandex Contest

Семинарские задачи будут сдаваться на платформе Яндекс.Контест - сервис для онлайн-проверки заданий по программированию. Можете попробовать сдать свой пробный контест по ссылке.

GitHub

Материалы мы выкладываем тут: https://github.com/svdcvt/math_python_hse_2020

Чтобы скачать семинарскую тетрадку, необходимо сделать следующее:

Простой способ (не требует работы с терминалом)

  1. Открываем страницу с интересующей тетрадкой
  2. Нажимаем кнопку Raw
  3. Правой кнопкой мыши нажимаем на возникший "код" и выбираем "Сохранить страницу как..."
  4. Сохраняем туда, где мы решили запускать Джупитер и ОЧЕНЬ ВАЖНО сохранить с расширением .ipynb, хотя система захочет сохранить файл с расширением .txt. Поменять расширение можно:
    • при сохранении убрать лишнее расширении в имени и выбрать тип файла "Все файлы"
    • поменяв имя файла уже после сохранения в файловом менеджере (если получится)
    • поменяв имя файла уже после сохранения в открытом Джупитере (надо выбрать галочку около названия файла и сверху нажать Rename)

Правильный способ (придется поразбираться с командой git если будут возникать проблемы)

  1. В терминале открыть папку, в которой решили открывать Джупитер
  2. Ввести команду git clone https://github.com/svdcvt/math_python_hse_2020.git (или sudo git clone https://github.com/svdcvt/math_python_hse_2020.git, будет запрошен пароль пользователя компьютера) - таким образом вы скопируете с Гитхаба репозиторий курса, т.е. то куда мы выкладываем материалы курса
  3. Ввести команду cd math_python_hse_2020 чтобы перейти в папку скопированного репозитория
  4. На каждом семинаре вводить команду git pull из этой папки, чтобы подгрузить новый файлы. На этом шаге могут возникать проблемы и несовместимости файлов, если вы меняли какие-то файлы, но в целом должно быть все в порядке.

ПОЖАЛУЙСТА, если у вас возникли проблемы с какой-либо инструкцией, обратитесь за помощью к семинаристу (подняв руку на семинаре, подойдя после семинара, написав в телеграм) - мы поможем!


Введение в Python

Функция print()

Для печати значений в Питоне есть функция print(). Внутри круглых скобок через запятую мы пишем то, что хотим вывести. Вот программа, которая делает несколько выводов и вычислений:

In [3]:
print('Hi!')
print('Второй hi!')                 # каждый print выводится на новой строке
print('fisrt'), print('second')     # даже если написать так
print('🙂')                         # да даже смайлики можно!
Hi!
Второй hi!
fisrt
second
🙂
In [4]:
print('А еще умею считать, вот, например, 2х2 =', 2 * 2) 
print('2 в степени 10 равно', 2**10)  # две звёздочки означают возведение в степень
А еще умею считать, вот, например, 2х2 = 4
2 в степени 10 равно 1024

Также у функции есть два полезных параметра: sep (separator) и end (на самом деле если они не указываются в коде, то они равны пробелу и переносу строки по дефолту, но о таком свойстве функций мы позже поговорим).

In [5]:
print('Aa', end='!')
print('Bb', end='~')
print('Cc', end='...')
Aa!Bb~Cc...
In [6]:
print(1, 2, 3, 4, sep=' + ', end=' = ')
print(1 + 2 + 3 + 4)
1 + 2 + 3 + 4 = 10

В Питоне есть два специальных символа, которые могут быть полезны:

In [7]:
print('\tслева от меня таб \nа вот я уже на другой строке!')  
# специальный символ \t заменяет таб, 
# \n означает перенос строки, сами они не выводятся
	слева от меня таб 
а вот я уже на другой строке!

Арифметика

+ сложение - вычитание
* умножение ** возведение в степень
/ деление // целочисленное деление
% остаток abs() модуль

В начале выполняются операции с большим приоритетом. Приоритеты операций в порядке убывания: **; * / // %; + -.

In [8]:
# Чему будет равно выражение?
1 - 2 ** 2 * 5
Out[8]:
-19

В ячейке выше мы видим текст внутри кода, так называемый комментарий, для начала комментария есть специальны символ - решетка. Комментарий может стоять на отдельной строчке или после строчки кода.

Функция

Что же такое функция в Питоне?

Функция в программировании $-$ отдельный участок кода, который вызывают обратившись к нему по имени. При вызове происходит выполнение команд функции, которыми она определена. Главное отличие функции от других объектов Питона это круглые скобки, которые ставятся после названия функции.

Функции можно сравнить с небольшими подпрограммами, которые часто встраиваются в общую программу. Функции получает входные данные (аргументы функции) и возвращает выходные данные (вывод функции).

Функция может принимать произвольное количество аргументов или не принимать их вовсе. Часто у функции бывают именованные аргументы, например, sep и end у функции </code>print()</code>.

Функции бывают:

  • встроенные в Питон, например print(), input(), int(), float(), str(), type() . С первой мы уже познакомились, с остальными познакомимся сейчас.
  • дополнительные, которые необходимо "подгружать" в программу, можно определять новые функции самому $-$ но об этом всём мы поговорим подробнее позже, через пару уроков.

Функция input()

А что если хочется ввести какие-то данные не в самом коде, а уже при запуске кода пользователем?

Есть функция input(), которая считывает одну строку (пока не нажмешь Enter). Вот программа, которая считывает имя пользователя и приветствует его:

In [9]:
print('- Как тебя зовут?') # этот принт опицональный
name = input()
print('- Привет,', name)
- Как тебя зовут?
Монти
- Привет, Монти

На самом деле можно даже убрать первый print(). В документации Питона написано следующее: https://docs.python.org/3.7/library/functions.html#input.

Документация это такая книжка-руководство по всему, абсолютно всему, что существует в языке Питон.

Мы советуем как можно чаще использовать Google, чтобы что-либо узнать по поводу того как функция работает или существует ли функция которая что-то тебе нужное делает.

In [10]:
something = input('Введите что-нибудь с клавиатуры: ')
print('А я запомнил, вы ввели сейчас следующее: ', something)
Введите что-нибудь с клавиатуры: ╰( ͡° ͜ʖ ͡° )つ──☆*:・゚
А я запомнил, вы ввели сейчас следующее:  ╰( ͡° ͜ʖ ͡° )つ──☆*:・゚

Практически всегда программа (код) решает какую-то задачу на основе считанных данных и выводит ее результат. Попробуем разобраться с этим на простом примере.

Задание переменной

Оператор присвоения = "кладет" какое-то значение в переменную. От него слева ставится имя переменной, cправа значение.

In [11]:
print = 1

one = 1
_hello_ = 'hello'
1plus2 = 1 + 2
  File "<ipython-input-11-7359ca3028db>", line 5
    1plus2 = 1 + 2
         ^
SyntaxError: invalid syntax

Видим ошибку SyntaxError. Возникла она потому что нельзя начинать имя переменной с цифры и символов !"№;%:?*()@#$^&[]{}|/><,.=+ (кроме нижнего подчеркивания!)

In [12]:
# попробуем вывести переменную one
print(one)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-12-be2c868f09e2> in <module>
      1 # попробуем вывести переменную one
----> 2 print(one)

NameError: name 'one' is not defined

Но как же так! Мы же ее выше обозначили... А все потому, что в той "ячейке" возникла ошибка, из-за нее не было выполнено ни одной операции. Попробуем заново, убрав ошибочную строчку кода.

Тип данных

Так как данные бывают абсолютно разные (в основном числа, набор чисел, текст), то и в Питоне они представляются по-разному. Посмотрим поподробнее.

Попробуем вычислить сумму двух чисел, введенных пользователем:

In [14]:
a = input()
b = input()
print(a + b)
12
34
1234

Странно получилось.

На самом деле Питон «сложил» две строки, а не два числа.

Строка (string, str) - набор символов внутри кавычек.

Сложение строк происходит так - к первой строке в конце приписывается вторая:

In [15]:
'Строка 1' + 'Cтрока 2'
Out[15]:
'Строка 1Cтрока 2'

Строки можно умножать на число:

In [16]:
'abc' * 10
Out[16]:
'abcabcabcabcabcabcabcabcabcabc'

Друг на друга умножать нельзя, так же как и вычитать или делить (следующие строчки кода выдадут ошибки):

In [17]:
'abc' * 'def'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-106b9cc1ebcc> in <module>
----> 1 'abc' * 'def'

TypeError: can't multiply sequence by non-int of type 'str'
In [18]:
'abc' - 'a'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-bbbf64f0c152> in <module>
----> 1 'abc' - 'a'

TypeError: unsupported operand type(s) for -: 'str' and 'str'
In [19]:
'abc' / 2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-a431fa05cfcf> in <module>
----> 1 'abc' / 2

TypeError: unsupported operand type(s) for /: 'str' and 'int'
In [20]:
'abc' / 'a'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-3eaf69b6a735> in <module>
----> 1 'abc' / 'a'

TypeError: unsupported operand type(s) for /: 'str' and 'str'

Обратим внимание, что в джупитер-ноутбуке необязательно всегда что-то печатать с помощью print(). В этой среде автоматически выводится значение переменной или просто содержимое последней строчки в ячейке. Например:

In [21]:
1 + 2
3 ** 2
Out[21]:
9
In [22]:
'Эту строку мы не увидим'
'А эту увидим'
Out[22]:
'А эту увидим'
In [23]:
a, b
Out[23]:
('12', '34')

В Питоне всё является объектом

Число 9 представляется объектом «число 9», слово 'Hello' – это объект «строка 'Hello'», в ячейке выше видно, что содержимое переменных a и b заключено в кавычки, это значит что они типа «строка».

Функция type()

Строки хранятся в объектах типа str (string), целые числа в объектах типа int (integer), числа с запятой (вернее точкой), т.е. вещественные, в объектах типа float (floating point).

Функция type() принимает на вход объект и выдает её тип:

In [24]:
type('hello'), type(1), type(1.25)
Out[24]:
(str, int, float)

Преобразование типов

С разными типами объектов можно проделывать разные операции! Нельзя перемножить строки, но можно числа. Однако можно преобразовывать типы объектов. Чтобы превратить что-то в «строку», воспользуемся функцией str(), чтобы строку, обозначающую число, превратить в «число», то int().

In [25]:
type('356'), type(int('356'))
Out[25]:
(str, int)
In [26]:
a = int('9')
a / 2
Out[26]:
4.5

Функция input() всегда считывает с клавиатуры именно строки! Исправим нашу программу, где мы не смогли сложить a + b:

In [27]:
# мы исправили код разными способами

a = int(input()) # сразу преобразовали строку в число
b = int(input())
print(a + b)
12
34
46
In [28]:
a = input()
b = input()
inta = int(a) # создали новые переменные с числовыми значениями
intb = int(b)
print(inta + intb)
12
34
46
In [29]:
a = input()
b = input()
print(int(a) + int(b)) # преобразовали строки в числа "на месте", 
                       # но сами переменные останутся строками!
12
34
46

Подробнее про типы данных

Строки обычно заключаются в одинарные кавычки (в последнее время), но их так же можно заключать в двойные кавычки. Так же если кавычки это часть строки, то надо использовать разные виды кавычек.

In [30]:
print("string", 'string', 'it is "string"', "it is 'string'", sep='\n')
string
string
it is "string"
it is 'string'
In [31]:
print("it's a code")
it's a code

Строки так же могут быть многострочными, в таком случае нужны тройные кавычки (подходят как одинарные, так и двойные)

In [32]:
print('''первая строка
вторая строка
третья строка
    со сдвигом''')
первая строка
вторая строка
третья строка
    со сдвигом

Если применить int() к вещественному числу, то просто отбросится дробная часть:

In [33]:
pi = 3.14159265359
print(type(pi))
print(int(pi))
int(3.7)
<class 'float'>
3
Out[33]:
3

Есть функция округления round() (обратите внимание, что число вида x.5 округляется в сторону ближайшего четного числа):

In [2]:
round(3.12), round(3.5), round(4.5)
Out[2]:
(3, 4, 4)

Целочисленное деление возвращает тот тип, который был у делимого:

In [35]:
type(5 // 2), type(pi // 3)
Out[35]:
(int, float)

Деление всегда возвращает float:

In [36]:
type(5 / 2), type(4 / 2), type(pi / 3)
Out[36]:
(float, float, float)

Следующие числа будут типа float:

In [37]:
1, 1. , 1.0, 1.25, 1e5, 1e-2, 2e2, 2.99E-3, float('-1e4'), float(1)
Out[37]:
(1, 1.0, 1.0, 1.25, 100000.0, 0.01, 200.0, 0.00299, -10000.0, 1.0)

Как работает e-float число?

Такое вещественное число состоит из двух частей $-$ то, что стоит слева от буквы, и то, что стоит справа. Представим это так: leftEright. Тогда число будет равно left * 10 ** right. Левая часть (мантисса) может быть int и float, правая (порядок) только int (оба как положительные, так и отрицательные). Пробелы между ними не ставятся.

Из-за представления чисел в компьютере вещественные числа неточны, и это может привести к ошибкам (для высокой точности используют другие объекты, например, Decimal и Fraction):

In [38]:
# равно 1.0
0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
Out[38]:
0.9999999999999999
In [39]:
from decimal import Decimal
print(Decimal(0.1))
0.1000000000000000055511151231257827021181583404541015625
In [40]:
print(float(0.1))
0.1
In [41]:
a = Decimal('0.1')
print(a)
print(float(a + a + a + a + a + a + a + a + a + a))
0.1
1.0

Также вещественные числа не поддерживают длинную арифметику (целая часть числа настолько длинная, что хранить то, что после запятой, не получается):

In [42]:
a = 3 ** 1000
a + 0.0001
---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
<ipython-input-42-2d26bbada7af> in <module>
      1 a = 3 ** 1000
----> 2 a + 0.0001

OverflowError: int too large to convert to float

Для проведения вычислений с действительными числами язык Питон содержит много дополнительных функций, собранных в библиотеку (модуль), которая называется math (больше тут https://docs.python.org/3.8/library/math.html).

In [43]:
import math

print('sin(3) =', math.sin(3))
print('Округление вверх', math.ceil(3.14))
print('Округление вниз ', math.floor(3.999))
sin(3) = 0.1411200080598672
Округление вверх 4
Округление вниз  3

На этом материао первого занятия заканчивается.
По абсолютно любым вопросам не стесняйтесь писать семинаристам или спрашивать их на семинарах!