Осваиваем python: математические операции

Арифметические операции с целыми и вещественными числами

Все эксперименты будем производить в Python, запущенном в интерактивном режиме.

Сложение.

Складывать можно непосредственно сами числа…

>>> 3+2
5

либо переменные, но они должны предварительно быть проинициализированы.

>>> a = 3
>>> b = 2
>>> a + b
5

Результат операции сложения можно присвоить другой переменной…

>>> a = 3
>>> b = 2
>>> c = a + b
>>> print(c)
5

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

>>> a = 3
>>> b = 2
>>> a = a + b
>>> print(a)
5

сокращенная так

>>> a = 3
>>> b = 2
>>> a += b
>>> print(a)
5

Все перечисленные выше варианты использования операции сложения могут быть применены для всех нижеследующих операций.

Вычитание.

>>> 4-2
2
>>> a = 5
>>> b = 7
>>> a - b
-2

Умножение.

>>> 5 * 8
40
>>> a = 4
>>> a *= 10
>>> print(a)
40

Деление.

>>> 9  3
3.
>>> a = 7
>>> b = 4
>>> a  b
1.75

Получение целой части от деления.

>>> 9  3
3
>>> a = 7
>>> b = 4
>>> a  b
1

Получение остатка от деления.

>>> 9 % 5
4
>>> a = 7
>>> b = 4
>>> a % b
3

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

>>> 5 ** 4
625
>>> a = 4
>>> b = 3
>>> a ** b
64

Исключения и трассировка.

В Python также как и в алгебре деление на 0 запрещено.  При попытке выполнения такой операции  происходит исключение. Сообщая об исключение, Python выдает трассировку стека. В трассировке указано, что произошло исключение типа ZeroDivisionError, большая часть исключений заканчивается суффиксом Error. Ошибка division by zero — деление на ноль.

>>> 5 / 0Traceback (most recent call last):
  File «<stdin>», line 1, in <module>
ZeroDivisionError: division by zero

1. Установка Python 2. Выбор текстового редактора 3. Запуск программ Python в командной строке 4. Числа и арифметические операторы Python 5.Строки и функция Print в Python 6. Списки и кортежи в Python 7. Сегментация последовательностей в Python 8. Цикл for и функция range в Python 9. Команда if и функция input в Python 10. Словари в Python 11. Множества в Python 12. Цикл while в Python 13. Функции в Python 14. Классы в Python 15. Файлы и исключения в Python 16. Функции json. Сохранение данных Python 17.Тестирование функций и классов на Python>>> 5 -? 

Please enable JavaScript to view the comments powered by Disqus.

Сложение и вычитание

Операции сложения и вычитания в Python выполняются точно так же, как и в обычной математике. Вы даже можете использовать Python вместо калькулятора.

Например:

Также вы можете объявить переменные и указать их в функции print:

Целые числа бывают положительными и отрицательными. Попробуйте сложить следующие числа:

Числа с плавающей точкой складываются аналогичным образом:

В результате сложения чисел с плавающей точкой также получается число с плавающей точкой, потому Python выводит 8.0, а не 8.

Синтаксис вычитания отличается от сложения только оператором. Попробуйте отнять 32 из 75.67:

Примечание: Если в операции присутствует хотя бы одно число с плавающей точкой, в результате Python также выведет число с плавающей точкой.

Вещественные числа (float)

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

>>> 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1
0.9999999999999999

Для высокой точности используют другие объекты (например Decimal и Fraction)).

Также вещественные числа не поддерживают длинную арифметику:

>>> a = 3 ** 1000
>>> a + 0.1
Traceback (most recent call last):
  File "", line 1, in
OverflowError: int too large to convert to float

Простенькие примеры работы с числами:

>>> c = 150
>>> d = 12.9
>>> c + d
162.9
>>> p = abs(d - c)  # Модуль числа
>>> print(p)
137.1
>>> round(p)  # Округление
137

Стандартный Set

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

Но хэш-таблица не позволяет выполнить операцию или подобные, поэтому придётся использовать другие структуры данных.

Создание произвольных последовательностей

Магия контейнеров

  • Возвращает количество элементов в контейнере. Часть протоколов для изменяемого и неизменяемого контейнеров.

  • Определяет поведение при доступе к элементу, используя синтаксис . Тоже относится и к протоколу изменяемых и к протоколу неизменяемых контейнеров. Должен выбрасывать соответствующие исключения: если неправильный тип ключа и если ключу не соответствует никакого значения.

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

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

  • Должен вернуть итератор для контейнера. Итераторы возвращаются в множестве ситуаций, главным образом для встроенной функции и в случае перебора элементов контейнера выражением . Итераторы сами по себе объекты и они тоже должны определять метод , который возвращает .

  • Вызывается чтобы определить поведения для встроенной функции . Должен вернуть обратную версию последовательности. Реализуйте метод только если класс упорядоченный, как список или кортеж.

  • предназначен для проверки принадлежности элемента с помощью и . Вы спросите, почему же это не часть протокола последовательности? Потому что когда не определён, Питон просто перебирает всю последовательность элемент за элементом и возвращает если находит нужный.
  • используется при наследовании от . Определяет поведение для для каждого случая, когда пытаются получить элемент по несуществующему ключу (так, например, если у меня есть словарь и я пишу когда не является ключом в словаре, вызывается ).

Bintrees

Так есть же модуль bintrees! Это же то, что нам нужно? И да, и нет. Его разработка была приостановлена в 2020 году со словами .

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

Название говорит само за себя, — красно-чёрное дерево, — несбалансированное двоичное дерево, префикс означает реализацию на (соответственно, необходимо наличие , если используется на Windows).

Задача AVLTree FastAVLTree RBTree FastRBTree BinaryTree FastBinaryTree
Добавление 21.946 2.285 20.486 2.373 11.054 2.266
Проверка на наличие 5.86 2.821 6.172 2.802 6.775 3.018
Цикл по всем элементам 0.935 0.297 0.972 0.302 0.985 0.295
Удаление 12.835 1.509 25.803 1.895 7.903 1.588

Результаты тестирования отчётливо показывают нам, почему использовать деревья поиска на Python — плохая идея в плане производительности. А вот в интеграции с всё становится намного лучше.

Оказывается, эта структура и очень похожи по производительности. Все 3 Fast версии структур достаточно близки, поэтому будем считать, что оттуда мы используем .

Задача SortedSet FastAVLTree
Добавление 3.924 2.285
Проверка на наличие 1.198 2.821
Цикл по всем элементам 0.162 0.297
Получение индексов 3.959 n/a
Получение значений по индексам 4.909 n/a
Удаление 2.933 1.509

Как мы видим, AVL в полтора раза быстрее в скорости добавления элементов и почти в 2 раза быстрее в операциях удаления. Но он в те же 2 раза медленнее в проверке на наличие и цикле по всем элементам. К тому же не стоит забывать, что 2 операции он выполнять не умеет, то есть не является тем , что мы ищем.

Использование:

9 ответов

Лучший ответ

Это самое простое и наиболее питонное решение, которое я могу придумать:

Если входные данные очень большие, то решение итераторов должно быть более удобным:

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

51

fortran
29 Июл 2009 в 16:10

Множественное число индекса — это индексы. Идем для простоты / читабельности.

-1

anthony
29 Июл 2009 в 07:56

Вот еще один ответ.

Поддерживает отрицательные показатели и тому подобное.

Steve Losh
29 Июл 2009 в 16:31

2

anthony
30 Сен 2009 в 20:26

Это все, что я мог придумать

Il-Bhima
29 Июл 2009 в 08:18

Мое решение похоже на решение Il-Bhima.

Альтернативный подход

Если вы хотите немного изменить способ ввода индексов, с абсолютных индексов на относительные (то есть с на , то нижеприведенное также даст вам желаемый результат, хотя это не так. создать списки посредников.

7

Cide
29 Июл 2009 в 10:11

Мне было бы интересно увидеть более Pythonic способ сделать это также. Но это дерьмовое решение. Вам необходимо добавить проверку для пустого списка индексов.

Что-то вроде:

Производит

9

john gonidelis
17 Дек 2018 в 14:02

Maxima mea culpa: он использует оператор , и он не использует такие штуковины, как itertools, zip (), None в качестве стража, списки, …

😉

5

John Machin
30 Июл 2009 в 03:32

Cide’s создает три копии массива: + копии индексов, ( + индексы) + [] копии снова, а индексы будут копироваться в третий раз. Ил-Бхима делает пять экземпляров. (Я не считаю возвращаемое значение, конечно.)

Их можно уменьшить (izip, islice), но вот версия с нулевой копией:

Конечно, копии массивов довольно дешевы (нативный код) по сравнению с интерпретируемым Python, но у этого есть еще одно преимущество: его легко использовать повторно и напрямую изменять данные:

(Вот почему я передал индексы в iterate_pairs. Если вас это не волнует, вы можете удалить этот параметр и просто сделать так, чтобы в последней строке было указано «yield prev, None», а это все, что нужно для partition ().)

Glenn Maynard
29 Июл 2009 в 08:20

Приоритет

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

  • Мы можем создать группу выражений, используя круглые скобки. Выражение в скобках сначала вычисляется, прежде чем они смогут участвовать в дальнейших вычислениях.
  • Некоторые операторы имеют одинаковый уровень приоритета. В этом случае выражение оценивается слева направо.

В таблице ниже перечислены приоритеты операторов в порядке убывания.

Приоритет
** (экспонента)
~ (Дополнение к единицам)
*, /, //, % (Умножение, Деление, Операторы Модуля)
+, – (Сложение, Вычитание)
<<, >> (операторы сдвига вправо и влево)
& (побитовый AND)
|, ^ (побитовый OR, XOR)
==, !=, >, <, >=, <= (сравнения)
=, +=, -=, *=, /=, //=, %= (присваивания)
is, is not (идентификации)
in, not in (принадлежности)
not, and, or (логические)

И как же оно работает?

На странице пакета мы можем прочитать, что реализована структура не так, как мы предполагали в начале статьи.

Из-за особенностей реализации языка Python, в нём быстро работают , а также (найти бинарным поиском за место, куда нужно вставить элемент, а потом вставить его туда за ). работает достаточно быстро на современных процессорах. Но всё-таки в какой-то момент такой оптимизации не хватает, поэтому структуры реализованы как список списков. Создание или удаление списков происходит достаточно редко, а внутри одного списка можно выполнять операции даже за быструю линию.

Если говорить кратко, то принцип действия похож на корневую оптимизацию.

Конструирование и инициализация.

Это первый метод, который будет вызван при инициализации объекта. Он принимает в качестве параметров класс и потом любые другие аргументы, которые будут переданы в . используется весьма редко, но иногда бывает полезен, в частности, когда класс наследуется от неизменяемого (immutable) типа, такого как кортеж (tuple) или строка. Я не намерен очень детально останавливаться на , так как он не то чтобы очень часто нужен, но этот метод очень хорошо и детально описан в .

Инициализатор класса. Ему передаётся всё, с чем был вызван первоначальный конструктор (так, например, если мы вызываем , получит и в качестве аргументов. почти повсеместно используется при определении классов.

Если и образуют конструктор объекта, это его деструктор. Он не определяет поведение для выражения (поэтому этот код не эквивалентен ). Скорее, он определяет поведение объекта в то время, когда объект попадает в сборщик мусора. Это может быть довольно удобно для объектов, которые могут требовать дополнительных чисток во время удаления, таких как сокеты или файловыве объекты. Однако, нужно быть осторожным, так как нет гарантии, что будет вызван, если объект продолжает жить, когда интерпретатор завершает работу. Поэтому не может служить заменой для хороших программистских практик (всегда завершать соединение, если закончил с ним работать и тому подобное)

Фактически, из-за отсутствия гарантии вызова, не должен использоваться почти никогда; используйте его с осторожностью!Замечание от переводчика: svetlov , что здесь автор ошибается, на самом деле всегда вызывается по завершении работы интерпретатора.

Комплексные числа (complex)

В Python встроены также и комплексные числа:

>>> x = complex(1, 2)
>>> print(x)
(1+2j)
>>> y = complex(3, 4)
>>> print(y)
(3+4j)
>>> z = x + y
>>> print(x)
(1+2j)
>>> print(z)
(4+6j)
>>> z = x * y
>>> print(z)
(-5+10j)
>>> z = x  y
>>> print(z)
(0.44+0.08j)
>>> print(x.conjugate())  # Сопряжённое число
(1-2j)
>>> print(x.imag)  # Мнимая часть
2.0
>>> print(x.real)  # Действительная часть
1.0
>>> print(x > y)  # Комплексные числа нельзя сравнить
Traceback (most recent call last):
  File "", line 1, in
TypeError: unorderable types: complex() > complex()
>>> print(x == y)  # Но можно проверить на равенство
False
>>> abs(3 + 4j)  # Модуль комплексного числа
5.0
>>> pow(3 + 4j, 2)  # Возведение в степень
(-7+24j)

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

Спецификация оператора for/in/else:

for_stmt :: = "for" target_list "in" expression_list ":" suite
              "else" ":" suite

Список выражений для перебора инструкцией вычисляется один раз и должен давать объект поддерживающий итерацию. Итератор создается для результата . Каждый элемент из в свою очередь присваивается целевой переменной , значение которой передается в блок кода внутри инструкции . Затем код блока выполняется один раз для каждого элемента. Когда элементы исчерпаны, что происходит сразу же, когда последовательность пуста или итератор вызывает исключение , выполняется набор в предложении , если он присутствует, и цикл завершается.

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

Применим оператор и в коде и посмотрим на их поведение. Будем создавать список четных чисел из последовательности чисел от 0 до 14.

lst = []
for item in range(15) 
    # если число 10 есть в списке
    if 10 in lst
        # прерываем цикл, при этом блок else не выполнится
        break
    # остаток от деления элемента списка
    a = item % 2
    # если элемент списка не четный или равен 0
    if a !=  or item == 
        # пропускаем оставшийся код
        continue
    # добавление числа в список
    lst.append(item)
else
    print ("Напечатает, если убрать условие с break")

print(lst)
# Код выведет:
2, 4, 6, 8, 10

Цикл выполняет назначения переменным в целевом списке. Это перезаписывает все предыдущие назначения этим переменным, включая те, которые были сделаны в блоке :

Пример:

for i in range(10):
    print(i)
    i = 5
    # это не повлияет на цикл for так как переменная i
    # будет перезаписана следующим итерируемым элементом

Имена в целевом списке не удаляются, когда цикл завершен, но если последовательность пуста, то код внутри цикла не будет выполнен.

Подсказка: встроенная функция возвращает итератор целых чисел, подходящий для эмуляции эффекта языка Pascal например, возвращает список .

Обратите внимание. Существует тонкость, когда последовательность, по которой проходит итерация, пытаются изменить внутри цикла

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

Аналогично, если код внутри цикла вставляет элемент в последовательность перед текущим элементом. Текущий элемент будет обработан снова на следующем этапе итерации. Это может привести к неприятным ошибкам, которых можно избежать, сделав временную копию с использованием фрагмента всей последовательности.

b = a
for item in b
    if item <  
        a.remove(item)

Целые числа и числа с плавающей запятой

Python имеет три встроенных числовых типа данных: целые числа, числа с плавающей запятой и комплексные числа. В этом разделе вы узнаете о целых числах и числах с плавающей запятой, которые являются двумя наиболее часто используемыми типами чисел. Вы узнаете о комплексных числах в следующем разделе.

Целые числа

Целое число – это целое число без десятичных знаков. Например, 1 – целое число, а 1.0 – нет. Имя для целочисленного типа данных – , которое вы можете увидеть с помощью :

Вы можете создать целое число, набрав желаемое число. Например, следующее присваивает переменной целое число 25:

Когда вы создаете такое целое число, значение 25 называется целочисленным литералом, потому что целое число буквально вводится в код.

Возможно, вы уже знакомы с тем, как преобразовать строку, содержащую целое число, в число с помощью . Например, следующее преобразует строку «25» в целое число 25:

не является целочисленным литералом, потому что целое значение создается из строки.

Когда вы пишете большие числа от руки, вы обычно группируете цифры в группы по три, разделенные запятой или десятичной точкой. Число 1000000 читать намного легче, чем число 1000000.

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

Нет предела тому, насколько большим может быть целое число, что может быть удивительно, учитывая, что компьютеры имеют конечный объем памяти. Попробуйте ввести наибольшее число, которое вы можете придумать, в интерактивном окне IDLE. Python справится с этим без проблем!

Числа с плавающей запятой

Число с плавающей запятой(floating-point number) или сокращенно с плавающей запятой(float) – это число с десятичной запятой. 1.0 – это число с плавающей запятой, как и -2.75. Имя типа данных с плавающей запятой – float:

Как и целые числа, числа с плавающей запятой можно создавать из литералов с плавающей запятой(floating-point literals) или путем преобразования строки в число с плавающей запятой с помощью функции :

Есть три способа представить литерал с плавающей запятой. Каждое из следующих действий создает литерал с плавающей запятой со значением один миллион:

Первые два способа аналогичны двум методам создания целочисленных литералов. Третий подход использует нотацию E для создания литерала с плавающей запятой.

Чтобы написать литерал с плавающей запятой в нотации E, введите число, за которым следует буква e, а затем другое число. Python берет число слева от e и умножает его на 10, возведенное в степень числа после e. Итак, эквивалентно 1 × 10⁶.

Python также использует нотацию E для отображения больших чисел с плавающей запятой:

Число с плавающей запятой 200000000000000000.0 отображается как . Знак указывает, что показатель степени является положительным числом. Вы также можете использовать отрицательные числа в качестве показателя степени:

Литерал интерпретируется как в степени , что составляет 1/10000 или 0,0001.

В отличие от целых чисел, числа с плавающей запятой имеют максимальный размер. Максимальное число с плавающей запятой зависит от вашей системы, но что-то вроде должно выходить за рамки возможностей большинства машин. составляет 2 × 10⁴⁰⁰, что намного больше, чем общее количество атомов во Вселенной!

Когда вы достигнете максимального числа с плавающей запятой, Python вернет специальное значение с плавающей запятой, :

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

Python также использует , что означает отрицательную бесконечность и представляет собой отрицательное число с плавающей запятой, которое превышает минимальное число с плавающей запятой, разрешенное на вашем компьютере:

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

На равные части из n элементов

Список может быть разделен на основе размера определенного фрагмента. Это означает, что мы можем определить размер данной части. Если подмножество списка не вписывается в размер определенного фрагмента, заполнители должны быть вставлены вместо пустых держателей элементов. В этих случаях я буду использовать функцию None.

Давайте создадим новый файл и начнем программирование:

Приведенная выше функция func_chunk принимает аргументы: lst для списка и chunk_size для числа, на которое его нужно разделить. Функция выполняет итерацию по списку с приращением размера фрагмента n.

Ожидается, что каждый фрагмент будет иметь размер, заданный в качестве аргумента. Если элементов недостаточно для разделения на один и тот же размер, оставшиеся неиспользуемые элементы заполняются None.

Вывод программы:

Список был разделен на равные части по 3 элемента в каждой.

Python имеет утилиты для упрощения этого процесса. Мы можем использовать функцию из itertools для упрощения предыдущей функции.

Давайте создадим новый файл и напишем следующий код:

Этот код повторяет элементы и возвращает фрагмент желаемой длины на основе предоставленных вами аргументов.

Мы поместили в коде 4 аргументf i_. Функция zip_longest агрегирует и возвращает элементы из каждой итерации. В этом случае она будет агрегировать элементы из списка, который повторяется 4. Затем создается множество итераторов, содержащих 4 последовательных элементов, которые после преобразуются в список и возвращаются.

Открой для себя мир моментальных анонсов новых статей. Подпишись на мой канал в Telegram.

Вывод программы будет таков:

Эта более короткая функция приводит к тому же выводу программы. Однако этот метод более ограничен, так как нам приходится вручную писать, сколько элементов мы хотим в коде, и немного неудобно просто помещать кучу i_ в вызов zip_longest.

Лучшим решением было бы использование генераторов. Давайте создадим новый файл:

Этот генератор дает подсписок, содержащий n элементов. В конце концов, это дало бы подсписок для каждой части.

Вывод программы:

Этот метод работает лучше всего, если вам не нужно заполнение кода с помощью None или иным образом.

Проверьте свое понимание

Отобразите валюту

Выведите число 150000 в виде валюты с тысячами, сгруппированными через запятую. Валюта должна отображаться с двумя десятичными знаками и начинаться с символа доллара США.

Решение

Давайте постепенно наращивать нашу f-строку.

Во-первых, f-строка, которая отображает значение 150000 без какого-либо форматирования, выглядит так:

Это может показаться странным, но заставляет вас добавить спецификаторы форматирования.

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

По умолчанию Python отображает число с точностью до шести десятичных знаков. Валюта должна иметь только два десятичных знака точности, поэтому вы можете добавить между и :

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

Наконец, добавьте знак доллара () в начало строки, чтобы указать, что значение указано в долларах США:

F-строки – это всего лишь один из способов форматирования чисел для отображения.

Когда будете готовы, можете переходить к следующему разделу.

Деление (/)

Сложение, вычитание и умножение тривиальны, а вот с делением не всё так просто. В Python существует три вида деления и столько же разных операторов. Начнём с истинного деления, за которое отвечает оператор «». Его главным отличием является то, что, вне зависимости от типов операндов, будет возвращен вещественный результат ().

Этот вид деления наиболее близок к обычному и знакомому нам математическому. И здесь тоже нельзя делить на ноль:

Немного истории. В старых версиях Питон оператор «/» выполнял операцию классического деления: т.е. он делил целочисленно и усекал дробную часть в том случае, когда делимое и делитель были целыми. Если же операнды принадлежали к множеству вещественных чисел, то проводилось деление с сохранением дробной части, и результат был float.

Разработчики отказались от классического деления в Python 3.0 и вместо него добавили истинное деление. Архитекторы языка пошли на такой шаг по той причине, что в предыдущей модели классического деления результаты напрямую зависели от типов операндов. Из-за этого возникали трудности с их предварительной идентификацией и оценкой, что было особенно критично для Питона, как для языка с динамической типизацией.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector