Математический практикум по Питону.
Вводятся базовые элементы питона (Python версии 3.xx): арифметические и логические выражения, понятие о типе и его преобразование.
Это предварительная версия! Любые замечания приветсвуются.
Работа с консолью.
Мы таким способом общаемся с компьютером. Все началось с консоли файловой системы, потом всякие мат программы.
Код программы предствляется в виде блоков, содержащиш некий код с пояснениями. Предполягается постепенное построение программы, т.е. не сразу все пишется, а за несколько этапов. Промежуточный результат выводится и на основании его пишется новый блок.
Далее идет пример блока (с коментарием).
# Замечания, пояснения в коде начинаются с символа решетка и идут до конца строки. Как, например, эта строка.
# Код может быть разбит на блоки. Это например новый блок кода. При выполнеии они нумеруются.
# Пустные строки ни на что не влияют.
Калькулятор
В питоне можно выолнять вычисления как на калькуляторе.
# Для этого необходимое выражение записывается в блоке
# и наживается клавиша воспроизведения (или shift-enter).
-5 + 9
# Отмечу, что последнее значение блока выводится в качестве результата блока.
# Над числами доступны стандартные арифметические операции: +, -, * и /.
4 - 9 # Вычитание.
3 * 7 # Умножение.
5/2 # Обычное деление. Дробная часть задается точкой (а не запятой).
Также доступны вычисления над целыми числами.
# Целочисленное деление задается как:
5//2 # Отбросили дробную часть у 2.5
Действует правило округление "вниз" (как и для положительных чисел) -- берется нижняя граница.
(-11)//2 # При обычном деление -5.5 => Внизу -6
# Можно несколько выражений одновременно вычислять.
(-5)/2, (-5)//2 # Выражения записываем через запятую.
# -2.5 => -3.
# Скорее даже это не округление, а наибольшее целое число меньшее отношения.
5/3, 5//3, 5/-3, 5//-3
# Можно также вычислить остаток от деления:
5%2 # Ищем остаток от деления 5 на 2.
Пусть $a, b \in \mathbb{Z}$(множество целых чисел). Напомню, что если $r \in \mathbb{Z}$ остаток от деления $a$ на $b$, то имеет место представление: \begin{equation*} a=r + k*b, \end{equation*} где $k \in \mathbb{Z}$. Также должно быть выполнено: \begin{equation*} 0 \leq r < b. \end{equation*} При этом пока считается, что $b > 0$. В согласии с данным:
7 % 5 # Это должно быть понятно.
# 7 = 2 + 1 * 5
(-7) % 5 # Но и это: остаток всегда будет положительным.
# -7 = 3 + (-2) * 5
(-5) % (-3) # Ну только, если сам делитель положительный. Иначе справедливо следующее.
# -5 = -2 + 1 * (-3).
В случае отрицательного делителя ($b < 0$), остаток, считается, тоже должен быть отрицательным, т.е. \begin{equation*} -b < r \leq 0. \end{equation*} Последнее связано с тем, что делитель определяет класс эквивалентности между целыми числами. Операция остаток отображает произвольное число на его класс.
5 % (-3) # Поэтому в данном случае остаток будет также как раз отрицательным.
# 5 = -1 + (-2) * (-3).
Деление с остатком традиционно вводят для целых чисел. Но ничто не мешает её определить аналогичным образом и для вещественных.
# Можно даже так.
2.5 % 2.1 # 2.5 = 0.4 + 1.2.1.
# Компьютер испытывает проблемы с представлением дробных чисел...
Возведение в степень.
# Возведение в степень задается двойной звездочкой, т.е. 3 в степени 2 записывается как:
3 ** 2
# Степень конечно может быть и дробной:
32 ** (1/5) # т.е. корень пятой степени из 32.
# Проверим:
2.0 ** 5
Сложные выражения
# Можно использовать и сложные выражения.
2 + 3*5
# В частости, использовать скобки.
2.0 + 3.5 * ( 5 - 3.)
Упр. Найди корни квадратного уравнения.
Тип выражения
С каждым выражением связан его тип. В зависимости от него могут вариьероваться поведение других частей программы.
type( 5 ) # Тип выражения с целым числом. У числа нет точки.
# Тип выражения с вещественным числом.
type( 5.1 ) # Число с робной частью.
# Число с точкой (хоть без фактической дробной части).
type( 5. ) # Нужно быть предельно аккуратным.
Фактически сначала вычисляется зачение выражение, что определяет его тип.
# Входные два числа имеют целый тип.
type( 5/2 ) # Результат вычисления же имеет вещественный тип.
# У сложного выражения тоже есть тип.
type( 5 + 3*2 ) # По аналогии. Значение будет целым.
type(type(int)) # У выражения равного типу тоже есть тип.
Можно принудительно (явно) изменить тип выражения.
Обычно выполняется неявное преобразование типа.
# Входные числа целые, выходное вещественное.
5/3, type(5/3)
Можно выполнить явное преобразование типа.
# Целое число и оно же в вещественном представлении.
5
5, type( 5 )
# Необходимый тип пишем до скобок.
float(5) # Тип берется от числа.
# Появилась точка и дробная часть равная 0!
# Замечу точку, она обозначает вещественный тип.
type( float( 5 ) )
Можно наоброт. Из вещественного получить целое.
# Фактически отбросили дробную часть.
int(5.0), int(5.1), int(5.9), int(-4.9), int(-4.1)
Замечу что:
51//10, 59//10, (-49)//10, (-41//10) # Здесь идетречь об округлении вниз.
Для выражений ествественно тоже можно сделать преобразование типа. Фактически сначала будет вычислено значение выражение, а потом оно будет преобразовано.
5/2 # Тип вещественный.
# Фактически тип берется от выражения.
int(5/2)
# Отбрасываем дробную часть.
int(-11/2) # -11/2=-5/5 => -5
# Целочисленное деление.
-11//2
Вприципе этого должно быть достаточно. И любое вычисление можно сделать. Например, для вычисления синуса вспоимнить нужный ряд и вычислить. Последнее не очень продуктивно. Зачем так поступать? Ведь скорее всего код для вычисления синуса уже кем-то написан. Лучше воспользоватся чем-то готовым.
Библиотечные функции
Для расширения возможностей ествественно необходимо применять сторонний код, а именно библиотеки. В следующем блоке показано как это делается (вызываются библиотечные функции). Одна из самых известных математических библиотек в питоне -- numpy: это библиотека для работы с векторами, матрицами. Она же применяется для вычисления стандартных функций: тригонометрических, экспонента, логарифм, степень и др.
# Для использования готовых библиотек достаточно их загрузить в среду питона:
import numpy # Загрузили библиотеку numpy.
# Теперь можно вычислить например:
2.2 * numpy.sin( 1.1 )
Следует отметить, то как функция называется: не сама по себе (sin), а с префиксом "numpy.". Последнее связано с тем, что функция sin из библиотеки numpy. Последнее сделано, чтобы функции из разных библиотек не перепутались: не перекрыли друг друга при одинаковом названии.
В языках программирования, в частности, в питоне применение функции называется вызывом.
Имеется множество библиотечных функций.
# Арксинус.
2*numpy.arcsin( -1 ) # Ответ похож на значение числп пи.
Но, название numpy длинное. Есть расширение даннной команды для загрузки библиотеки и присвоение ей сокращенного имени.
# Данная строчка загружает библиотеку numpy и дает ей сокращенное название np.
import numpy as np
Теперь можно использовать сокращенное название np вместо полного numpy.
2.2 * np.sin( 1.1 ) # Применили функцию синус (np.sin).
Используется префикс np так как она была загружена в систему с сокращенным названием np. Поэтому такое обозначение.
Итого, в numpy существуют тригонометрические функции: sin, cos, tan, и их обратные: arcsin, arccos, np.arctan. Полный список можно посмотреть в документации.
# Ествественно в качестве аргумента функции можно исользовать не только число, но и целое выражение
np.sqrt( 4**2 + 3**2 )
Вызов по значению
При вызове функции сначала вычисляются значения всех её аргументов, а потом эти значения подаются вызываемой функции. Отсуюда термин "вызов по значению". Подчеркну, что сами выражения не доступны вызываемой функции. Доступно только значение.
# Если вдруг не понятно, на всякий случай упомину и случай функция от фукнции:
np.arcsin( np.sin(0.5) )
# Доступны и константы
np.pi # Например, число пи.
np.e # e, натуральное
np.sin( np.pi*3.5 )
Упр. Реши уравнение sin(ax+b)=c.
К вычислимым выражениям относятся не только арифметические, но и логичекие.
Неравенства
Например, можно сложить два числа, а можно вычислить истинность утверждения, что первое число больше второго.
# Сложим два числа. Оба целые.
10 + 5 # Результат тоже целый.
Проверяем истинность того, что первое число больше второго.
# Входные числа имеют целый тип, а результат булевый (истина ли ложь).
10 > 5 # True -- истина.
# Данное утверждение ложное.
10 > 15 # False -- ложь.
# Выводим тип результирующего выражения.
type( 10 > 5 ) # Видим что тип bool, булевский.
type( True ) # Можно сразу взять одно из значений истинности.
Помимо строгих неравенств имеются и нестрогие.
# Соответственно меньше равно и больше равно.
3 <= 3, 5 >= -1
Сложные логические выражения
Над логическими значениями доступны свои операции. Они менее известны, поэтому дадим некоторое пояснение. Следующие операции дву-арные (т.е. имеют два аргумента)
# Можно явно использовать значения типа bool.
True and True # Ясно что будет Истина.
# Раз один из аргументов ложь то,
True and False # итог ложный.
# Проверяем операцию И в разных комбинациях:
True and True, False and True, False and False
# По аналогии проверяем операцию ИЛИ.
True or True, False or True, False or False
Для вычисления над логическими выражениями существует и унарная операция:
not True, not False
С арифметическими выражениями
Итого, можно применить их с арифметическими выражениями.
5 < 11 and 12 < 20
# Соответственно доступно следующее выражение.
(10 > 5) and ( 111 < 200 ) # True and True
# и такие
(10 < 5) or (3 < 5), (10 < 5) or (3 > 5)
# Более практичные примеры связаны с проверкой принадлежности числа интервалу
5 < 7 and 7 < 10 # Проверка принадлежности числа 7 интервалу [5,10].
# Аналогично.
5 < 4 and 4 < 10 # Проверка принадлежности числа 4 интервалу [5,10]
# Внимание!!
# В отличие от многих языков программировния питон поддерживает сложные логические неравенства.
5 < 6 > 5.9 # Подразумевается операция И между всеми неравенствами.
# Последнее эквивалентно.
5 < 6 and 6 > 5.9
# В соответствие с этим, принадлежность интвервалу записывается как
5 < 7 < 10 # Проверка принадлежности числа 7 интервалу [5,10].
not (5 < 3) # Отрицание от ложного неравенства.
Приоритет операций
У арифметических операций (+,-,*,/) тоже есть приоритет. Но он проходится в школе.
# Так в выражении
2 + 3 * 5 # Сначала *, а потом +.
# А не наоборот.
(2 + 3) * 5 # Это не правильное понимание приоритета.
# Можно явно применить скобки.
2 + (3 * 5) # Тогда слова про приеритет теряют смысл.
Как и всегда для выражений между операциями существуют приоритеты (У И выше приоритет чем у ИЛИ). Но лучше всегда ставить скобки.
5 < 6 and 13 < 11 or 5 < 7
(5 < 6 and 13 < 11) or 5 < 7
5 < 6 and 13 < 11 or 8 < 7
(5 < 6 and 13 < 11) or 8 < 7
Преобразование типа
# А можно и из булевского получить целое. Есть соглашение на данный счет.
int(True) # Истина преобразуется в 1.
int(5 < 3) # а ложь в ноль.
# Благодаря этому например можно такие вычисления делать.
int( 5 < 4 ) + int( 5 < 5 ) + int( 5 < 6 ) + int ( 5 < 7 ) # Количество чисел больше 5.
# Но и у число можно превратить в булевское значение.
bool(0), bool(0.1), bool(-0.5), bool(10) # Считается, что нулевое значение это ложь, остальные истина.
Упражнения. 1) Как вычислить абсолютное значение числа использую спесь логических и арифметических выражений.