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


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

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

QR Code to Wiki ➡️ Открываем [wiki.cs.hse.ru](http://wiki.cs.hse.ru)
 ➡️ Курсы в рамках проекта Data Culture
  ➡️ Основы программирования на Python-1


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

Формула оценивания
$$О_{итог} = 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 [ ]:
print('Hello World!')
In [ ]:
!echo 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. В Pycharm проще создавать проекты и выполнять домашние задания, впрочем как и семинарские задачи тоже. Pycharm нужно скачать тут: https://www.jetbrains.com/pycharm/download/

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

Yandex Contest

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

GitHub

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

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

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

  1. Открываем страницу с интересующей тетрадкой
  2. Нажимаем кнопку Raw, правой кнопкой мыши нажимаем на возникший "код" и выбираем "Сохранить страницу как..."
  3. Сохраняем туда, где мы решили запускать Джупитер и ОЧЕНЬ ВАЖНО сохранить с расширением .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 [ ]:
print('Hi!')
print('Второй hi!')                 # каждый print выводится на новой строке
print('fisrt'), print('second')     # даже если написать так
print('🙂')                         # да даже смайлики можно!
In [ ]:
print('А еще умею считать, вот, например, 2х2 =', 2 * 2) 
print('2 в степени 10 равно', 2**10)  # две звёздочки означают возведение в степень

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

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

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

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

Арифметика

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

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

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

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

Функция

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

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

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

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

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

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

Функция `input()`

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

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

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

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

In [ ]:
something = input('Введите что-нибудь с клавиатуры: ')
print('А я запомнил, вы ввели сейчас следующее: ', something)

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

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

In [ ]:
print = 1

one = 1
_hello_ = 'hello'
1plus2 = 1 + 2

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

In [ ]:
# попробуем вывести переменную one
print(one)

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

Тип данных

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

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

In [ ]:
a = input()
b = input()
print(a + b)

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

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

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

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

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

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

In [ ]:
'abc' * 10

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

In [ ]:
'abc' * 'def'
In [ ]:
'abc' - 'a'
In [ ]:
'abc' / 2
In [ ]:
'abc' / 'a'

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

In [ ]:
1 + 2
3 ** 2
In [ ]:
'Эту строку мы не увидим'
'А эту увидим'
In [ ]:
a, b

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

Число 9 представляется объектом «число 9»

Слово 'Hello' – это объект «строка 'Hello'»

В ячейке выше видно, что содержимое переменных a и b заключено в кавычки, это значит что они типа «строка».

Функция `type()`

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

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

In [ ]:
type('hello'), type(1), type(1.25)

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

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

In [ ]:
type('356'), type(int('356'))
In [ ]:
a = int('9')
a / 2

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

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

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

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

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

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

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

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

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

In [ ]:
pi = 3.14159265359
print(type(pi))
print(int(pi))
int(3.7)

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

In [ ]:
round(3.12), round(3.5), round(4.5)

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

In [ ]:
type(5 // 2), type(pi // 3)

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

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

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

In [ ]:
1, 1. , 1.0, 1.25, 1e5, 1e-2, 2e2, 2.99E-3, float('-1e4'), float(1)

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

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

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

In [ ]:
# равно 1.0
0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
In [ ]:
from decimal import Decimal
print(Decimal(0.1))
In [ ]:
print(float(0.1))
In [ ]:
a = Decimal('0.1')
print(a)
print(float(a + a + a + a + a + a + a + a + a + a))

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

In [ ]:
a = 3 ** 1000
a + 0.0001

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

In [ ]:
import math

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

На этом на сегодня все! Спасибо за внимание!

По абсолютно любым вопросам не стесняйтесь писать семинаристам или спрашивать их на семинарах!