pyth_01_calc
Заметка 1. Выражения и тип.
курса Математический практикум по Питону.
Шокуров Антон В.
shokurov.anton.v@yandex.ru
http://машинноезрение.рф
Версия 0.18

Аннотация

Вводятся базовые элементы питона (Python версии 3.xx): арифметические и логические выражения, понятие о типе и его преобразование.

Это предварительная версия! Любые замечания приветсвуются.

Простые вычисления

Вычисления как на калькуляторе

Работа с консолью.

Мы таким способом общаемся с компьютером. Все началось с консоли файловой системы, потом всякие мат программы.

Код программы предствляется в виде блоков, содержащиш некий код с пояснениями. Предполягается постепенное построение программы, т.е. не сразу все пишется, а за несколько этапов. Промежуточный результат выводится и на основании его пишется новый блок.

Далее идет пример блока (с коментарием).

In [1]:
# Замечания, пояснения в коде начинаются с символа решетка и идут до конца строки. Как, например, эта строка.
In [2]:
# Код может быть разбит на блоки. Это например новый блок кода. При выполнеии они нумеруются.

# Пустные строки ни на что не влияют.

Калькулятор

В питоне можно выолнять вычисления как на калькуляторе.

In [3]:
# Для этого необходимое выражение записывается в блоке
# и наживается клавиша воспроизведения (или shift-enter).
-5 + 9
# Отмечу, что последнее значение блока выводится в качестве результата блока.
Out[3]:
4
In [4]:
# Над числами доступны стандартные арифметические операции: +, -, * и /.
4 - 9 # Вычитание.
Out[4]:
-5
In [5]:
3 * 7 # Умножение.
Out[5]:
21
In [6]:
5/2 # Обычное деление. Дробная часть задается точкой (а не запятой).
Out[6]:
2.5

Также доступны вычисления над целыми числами.

In [7]:
# Целочисленное деление задается как:
5//2 # Отбросили дробную часть у 2.5
Out[7]:
2

Действует правило округление "вниз" (как и для положительных чисел) -- берется нижняя граница.

In [8]:
(-11)//2 # При обычном деление -5.5 => Внизу -6
Out[8]:
-6
In [9]:
# Можно несколько выражений одновременно вычислять.
(-5)/2, (-5)//2 # Выражения записываем через запятую.
#  -2.5 =>  -3.
Out[9]:
(-2.5, -3)
In [10]:
# Скорее даже это не округление, а наибольшее целое число меньшее отношения.
5/3, 5//3, 5/-3, 5//-3
Out[10]:
(1.6666666666666667, 1, -1.6666666666666667, -2)
In [11]:
# Можно также вычислить остаток от деления:
5%2 # Ищем остаток от деления 5 на 2.
Out[11]:
1

Пусть $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$. В согласии с данным:

In [12]:
7 % 5 # Это должно быть понятно.
# 7 = 2 + 1 * 5
Out[12]:
2
In [13]:
(-7) % 5 # Но и это: остаток всегда будет положительным.
# -7 = 3 + (-2) * 5
Out[13]:
3
In [14]:
(-5) % (-3) # Ну только, если сам делитель положительный. Иначе справедливо следующее.
# -5 = -2 + 1 * (-3).
Out[14]:
-2

В случае отрицательного делителя ($b < 0$), остаток, считается, тоже должен быть отрицательным, т.е. \begin{equation*} -b < r \leq 0. \end{equation*} Последнее связано с тем, что делитель определяет класс эквивалентности между целыми числами. Операция остаток отображает произвольное число на его класс.

In [15]:
5 % (-3) # Поэтому в данном случае остаток будет также как раз отрицательным.
# 5 = -1 + (-2) * (-3).
Out[15]:
-1

Деление с остатком традиционно вводят для целых чисел. Но ничто не мешает её определить аналогичным образом и для вещественных.

In [16]:
# Можно даже так.
2.5 % 2.1 # 2.5 = 0.4 + 1.2.1.
# Компьютер испытывает проблемы с представлением дробных чисел...
Out[16]:
0.3999999999999999

Возведение в степень.

In [17]:
# Возведение в степень задается двойной звездочкой, т.е. 3 в степени 2 записывается как:
3 ** 2
Out[17]:
9
In [18]:
# Степень конечно может быть и дробной:
32 ** (1/5) # т.е. корень пятой степени из 32.
Out[18]:
2.0
In [19]:
# Проверим:
2.0 ** 5
Out[19]:
32.0

Сложные выражения

In [20]:
# Можно использовать и сложные выражения.
2 + 3*5
Out[20]:
17
In [21]:
# В частости, использовать скобки.
2.0 + 3.5 * ( 5 - 3.) 
Out[21]:
9.0

Упр. Найди корни квадратного уравнения.

Тип выражения

С каждым выражением связан его тип. В зависимости от него могут вариьероваться поведение других частей программы.

In [22]:
type( 5 ) # Тип выражения с целым числом. У числа нет точки.
Out[22]:
int
In [23]:
# Тип выражения с вещественным числом.
type( 5.1 ) # Число с робной частью.
Out[23]:
float
In [24]:
# Число с точкой (хоть без фактической дробной части).
type( 5. ) # Нужно быть предельно аккуратным.
Out[24]:
float

Фактически сначала вычисляется зачение выражение, что определяет его тип.

In [25]:
# Входные два числа имеют целый тип.
type( 5/2 ) # Результат вычисления же имеет вещественный тип.
Out[25]:
float
In [26]:
# У сложного выражения тоже есть тип.
type( 5 + 3*2 ) # По аналогии. Значение будет целым.
Out[26]:
int
In [27]:
type(type(int)) # У выражения равного типу тоже есть тип.
Out[27]:
type

Можно принудительно (явно) изменить тип выражения.

Обычно выполняется неявное преобразование типа.

In [28]:
# Входные числа целые, выходное вещественное.
5/3, type(5/3) 
Out[28]:
(1.6666666666666667, float)

Можно выполнить явное преобразование типа.

In [29]:
# Целое число и оно же в вещественном представлении.
5
Out[29]:
5
In [30]:
5, type( 5 )
Out[30]:
(5, int)
In [31]:
# Необходимый тип пишем до скобок.

float(5) # Тип берется от числа.

# Появилась точка и дробная часть равная 0!
# Замечу точку, она обозначает вещественный тип.
Out[31]:
5.0
In [32]:
type( float( 5 ) )
Out[32]:
float

Можно наоброт. Из вещественного получить целое.

In [33]:
# Фактически отбросили дробную часть.
int(5.0), int(5.1), int(5.9), int(-4.9), int(-4.1) 
Out[33]:
(5, 5, 5, -4, -4)

Замечу что:

In [34]:
51//10, 59//10, (-49)//10, (-41//10) # Здесь идетречь об округлении вниз.
Out[34]:
(5, 5, -5, -5)

Для выражений ествественно тоже можно сделать преобразование типа. Фактически сначала будет вычислено значение выражение, а потом оно будет преобразовано.

In [35]:
5/2 # Тип вещественный.
Out[35]:
2.5
In [36]:
# Фактически тип берется от выражения.
int(5/2) 
Out[36]:
2
In [37]:
# Отбрасываем дробную часть.
int(-11/2) # -11/2=-5/5 => -5
Out[37]:
-5
In [38]:
# Целочисленное деление.
-11//2 
Out[38]:
-6

Математические функции

Вприципе этого должно быть достаточно. И любое вычисление можно сделать. Например, для вычисления синуса вспоимнить нужный ряд и вычислить. Последнее не очень продуктивно. Зачем так поступать? Ведь скорее всего код для вычисления синуса уже кем-то написан. Лучше воспользоватся чем-то готовым.

Библиотечные функции

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

In [39]:
# Для использования готовых библиотек достаточно их загрузить в среду питона:
import numpy # Загрузили библиотеку numpy.
In [40]:
# Теперь можно вычислить например:
2.2 * numpy.sin( 1.1 )
Out[40]:
1.9606561921351582

Следует отметить, то как функция называется: не сама по себе (sin), а с префиксом "numpy.". Последнее связано с тем, что функция sin из библиотеки numpy. Последнее сделано, чтобы функции из разных библиотек не перепутались: не перекрыли друг друга при одинаковом названии.

В языках программирования, в частности, в питоне применение функции называется вызывом.

Имеется множество библиотечных функций.

In [41]:
# Арксинус.
2*numpy.arcsin( -1 ) # Ответ похож на значение числп пи.
Out[41]:
-3.141592653589793

Но, название numpy длинное. Есть расширение даннной команды для загрузки библиотеки и присвоение ей сокращенного имени.

In [42]:
# Данная строчка загружает библиотеку numpy и дает ей сокращенное название np.
import numpy as np

Теперь можно использовать сокращенное название np вместо полного numpy.

In [43]:
2.2 * np.sin( 1.1 ) # Применили функцию синус (np.sin).
Out[43]:
1.9606561921351582

Используется префикс np так как она была загружена в систему с сокращенным названием np. Поэтому такое обозначение.

Итого, в numpy существуют тригонометрические функции: sin, cos, tan, и их обратные: arcsin, arccos, np.arctan. Полный список можно посмотреть в документации.

https://numpy.org/doc/1.17/reference/routines.math.html

In [44]:
# Ествественно в качестве аргумента функции можно исользовать не только число, но и целое выражение
np.sqrt( 4**2 + 3**2 )
Out[44]:
5.0

Вызов по значению

При вызове функции сначала вычисляются значения всех её аргументов, а потом эти значения подаются вызываемой функции. Отсуюда термин "вызов по значению". Подчеркну, что сами выражения не доступны вызываемой функции. Доступно только значение.

In [45]:
# Если вдруг не понятно, на всякий случай упомину и случай функция от фукнции:
np.arcsin( np.sin(0.5) )
Out[45]:
0.5
In [46]:
# Доступны и константы
np.pi # Например, число пи.
Out[46]:
3.141592653589793
In [47]:
np.e # e, натуральное
Out[47]:
2.718281828459045
In [48]:
np.sin( np.pi*3.5 )
Out[48]:
-1.0

Упр. Реши уравнение sin(ax+b)=c.

Логическое выражение

К вычислимым выражениям относятся не только арифметические, но и логичекие.

Неравенства

Например, можно сложить два числа, а можно вычислить истинность утверждения, что первое число больше второго.

In [49]:
# Сложим два числа. Оба целые.
10 + 5 # Результат тоже целый.
Out[49]:
15

Проверяем истинность того, что первое число больше второго.

In [50]:
# Входные числа имеют целый тип, а результат булевый (истина ли ложь).
10 > 5 # True -- истина.
Out[50]:
True
In [51]:
# Данное утверждение ложное.
10 > 15 # False -- ложь.
Out[51]:
False
In [52]:
# Выводим тип результирующего выражения.
type( 10 > 5 ) # Видим что тип bool, булевский.
Out[52]:
bool
In [53]:
type( True ) # Можно сразу взять одно из значений истинности.
Out[53]:
bool

Помимо строгих неравенств имеются и нестрогие.

In [54]:
# Соответственно меньше равно и больше равно.
3 <= 3, 5 >= -1
Out[54]:
(True, True)

Сложные логические выражения

Над логическими значениями доступны свои операции. Они менее известны, поэтому дадим некоторое пояснение. Следующие операции дву-арные (т.е. имеют два аргумента)

  • and -- И -- истино тогда и только тогда, когда истины оба аргумента.
  • or -- Или -- истино тогда и только тогда, когда истино хотя бы один из аргументов.
In [55]:
# Можно явно использовать значения типа bool.
True and True # Ясно что будет Истина.
Out[55]:
True
In [56]:
# Раз один из аргументов ложь то,
True and False # итог ложный.
Out[56]:
False
In [57]:
# Проверяем операцию И в разных комбинациях:
True and True, False and True, False and False
Out[57]:
(True, False, False)
In [58]:
# По аналогии проверяем операцию ИЛИ.
True or True, False or True, False or False
Out[58]:
(True, True, False)

Для вычисления над логическими выражениями существует и унарная операция:

  • not -- Не -- истино тогда и только тогда когда ложен аргумент.
In [59]:
not True, not False
Out[59]:
(False, True)

С арифметическими выражениями

Итого, можно применить их с арифметическими выражениями.

In [60]:
5 < 11 and 12 < 20
Out[60]:
True
In [61]:
# Соответственно доступно следующее выражение.
(10 > 5) and ( 111 < 200  ) # True and True
Out[61]:
True
In [62]:
# и такие
(10 < 5) or (3 < 5), (10 < 5) or (3 > 5)
Out[62]:
(True, False)
In [63]:
# Более практичные примеры связаны с проверкой принадлежности числа интервалу
5 < 7 and 7 < 10 # Проверка принадлежности числа 7 интервалу [5,10].
Out[63]:
True
In [64]:
# Аналогично.
5 < 4 and 4 < 10 # Проверка принадлежности числа 4 интервалу [5,10]
Out[64]:
False
In [65]:
# Внимание!!
# В отличие от многих языков программировния питон поддерживает сложные логические неравенства.
5 < 6 > 5.9 # Подразумевается операция И между всеми неравенствами.
Out[65]:
True
In [66]:
# Последнее эквивалентно.
5 < 6 and 6 > 5.9
Out[66]:
True
In [67]:
# В соответствие с этим, принадлежность интвервалу записывается как
5 < 7 < 10 # Проверка принадлежности числа 7 интервалу [5,10].
Out[67]:
True
In [68]:
not (5 < 3) # Отрицание от ложного неравенства.
Out[68]:
True

Приоритет операций

У арифметических операций (+,-,*,/) тоже есть приоритет. Но он проходится в школе.

In [69]:
# Так в выражении
2 + 3 * 5 # Сначала *, а потом +.
Out[69]:
17
In [70]:
# А не наоборот.
(2 + 3) * 5 # Это не правильное понимание приоритета.
Out[70]:
25
In [71]:
# Можно явно применить скобки.
2 + (3 * 5) # Тогда слова про приеритет теряют смысл.
Out[71]:
17

Как и всегда для выражений между операциями существуют приоритеты (У И выше приоритет чем у ИЛИ). Но лучше всегда ставить скобки.

In [72]:
5 < 6 and 13 < 11 or 5 < 7
Out[72]:
True
In [73]:
(5 < 6 and 13 < 11) or 5 < 7
Out[73]:
True
In [74]:
5 < 6 and 13 < 11 or 8 < 7
Out[74]:
False
In [75]:
(5 < 6 and 13 < 11) or 8 < 7
Out[75]:
False

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

In [76]:
# А можно и из булевского получить целое. Есть соглашение на данный счет.
int(True) # Истина преобразуется в 1.
Out[76]:
1
In [77]:
int(5 < 3) # а ложь в ноль.
Out[77]:
0
In [78]:
# Благодаря этому например можно такие вычисления делать.
int( 5 < 4 ) + int( 5 < 5 ) + int( 5 < 6 ) + int ( 5 < 7 ) # Количество чисел больше 5.
Out[78]:
2
In [79]:
# Но и у число можно превратить в булевское значение.
bool(0), bool(0.1), bool(-0.5), bool(10) # Считается, что нулевое значение это ложь, остальные истина.
Out[79]:
(False, True, True, True)

Упражнения. 1) Как вычислить абсолютное значение числа использую спесь логических и арифметических выражений.