1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Python: is. Равенство и эквивалентность

Python: is. Равенство и эквивалентность

is or == picture

Новички часто путаются в конструкциях is и == . Давайте разберемся, что к чему.

Сразу к сути: == (и его антагонист != ) применяются для проверки равенства (неравенства) значения двух объектов. Значение, это непосредственно то, что лежит в переменной. Значение числа 323235 – собственно число 323235. Тавтология. Но на примерах станет яснее.

Оператор is (и его антагонист is not ) применяются проверки равенства (неравенства) ссылок на объект. Сразу отметим то, что на значение (допустим 323235) может быть копировано и храниться в разных местах (в разных объектах в памяти).

Видите, значение переменных равны по значению, но они ссылаются на разные объекты. Я не случайно взял большое число 323235. Дело в том, что в целях оптимизации интерпретатор Python при старте создает некоторые количество часто-используемых констант (от -5 до 256 включительно).

Следите внимательно за ловкостью рук:

Поэтому новички часто совершают ошибку, считая, что писать == – это как-то не Python-way, а is – Python-way. Это ошибочное предположение может быть раскрыто не сразу.

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

Мы составили строку из двух частей и она попала в другой объект. Python не догадался (и правильно) поискать ее в существующих строках.

Суть is (id)

В Python есть встроенная функция id . Она возвращает идентификатор объекта – некоторое число. Гарантируется, что оно будет различно для различных объектах в пределах одного интерпретатора. В реализации CPython – это просто адрес объекта в памяти интерпретатора.

Это тоже самое, что:

И все! Пример для проверки:

Значения переменных равны, но их id – разные, и is выдает False . Как только мы к x привязали y , то ссылки стали совпадать.

Для чего можно применять is?

Если мы точно знаем уверены, что хотим проверять именно равенство ссылок на объекты (один ли это объект в памяти или разные).

Еще можно применять is для сравнения с None . None – это встроенная константа и двух None быть не может.

Также для Ellipsis:

Я не рекомендую применять is для True и False .

Потому что короче писать if x: , чем if x is True: .

Можно применять is для сравнения типов с осторожностью (без учета наследования, т. е. проверка на точное совпадение типов):

С наследованием может быть конфуз:

Не смотря на то, что Bar – наследник Foo , типы переменных foo и bar не совпадают. Если нам важно учесть наcледование, то пишите isinstance .

Нюанс: is not против is (not)

Важно знать, что is not – это один целый оператор, аналогичный id(x) != id(y) . А в конструкции x is (not y) – у нас сначала будет логическое отрицание y , а потом просто оператор is .

Сравнение пользовательских классов

Далее речь пойдет об обычных == и != . Можно определить магический метод __eq__ , который обеспечит поведение при сравнении классов. Если он не реализован, то объекты будет сравниваться по ссылкам (как при is ).

Если он реализован, то будет вызван метод __eq__ для левого операнда.

Метод __ne__ отвечает за реализацию != . По умолчанию он вызывает not x.__eq__(y) . Но рекомендуется реализовывать их оба вручную, чтобы поведение сравнения было согласовано и явно.

Вопрос к размышлению: что будет если мы сравним объекты разных классов, причем оба класса реализуют __eq__ ?

Что будет, если мы реализуем __ne__ , но не реализуем __eq__ ?

А еще есть метод __cmp__ . Это уже выходит за рамки статьи про is . Почитайте самостоятельно…

enter image description here

Затем вы можете выбрать типы функторов, которые подходят.

В качестве принятого ответа Джон Феминелла заявил, что:

Правильный способ проверить свойства объектов типа «утка» — это спросить их, если они крякают, а не посмотреть, помещаются ли они в контейнер размером с утку. Подход «сравните это напрямую» даст неправильный ответ для многих функций, например для встроенных.

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

Читайте так же:
Чем отличается ремень грм и ремень генератора?

«Утиная печать» является предпочтительным решением для общего назначения:

Что касается встроенной функции

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

Определите, если builtin function

Резюме

Используйте callable для проверки типа функции утки,
Используйте types.BuiltinFunctionType , если у вас есть дополнительные требования.

Поскольку классы также имеют метод __call__ , я рекомендую другое решение:

Обратите внимание, что классы Python также вызываются.

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

Вместо проверки на ‘__call__’ (что не является исключением для функций) вы можете проверить, имеет ли пользовательская функция атрибуты func_name , func_doc и т.д. Это не работает для методов.

Другой способ проверки — использовать метод isfunction() из модуля inspect .

Чтобы проверить, является ли объект методом, используйте inspect.ismethod()

Любая функция — это класс, поэтому вы можете взять имя класса экземпляра x и сравнить:

Решения с использованием hasattr(obj, ‘__call__’) и callable(.) , упомянутые в некоторых ответах, имеют главный недостаток: оба возвращают True для классов и экземпляров классов с помощью метода __call__() . Например.

Один правильный способ проверить, является ли объект определяемой пользователем функцией (и ничего, кроме этого), использовать isfunction(.) :

Если вам нужно проверить другие типы, просмотрите проверить — проверить живые объекты.

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

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

Различные математические функции в Python

Все ключевые математические функции подробно описаны ниже,

1. Константы

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

Значение константы, возникающей «естественно» и делающей константу «интересной», со временем становится необходимым, и ряд математических констант более важен для хронологических оснований, чем для их фундаментального математического интереса. Наиболее любимые константы были изучены на протяжении веков и вычислены для множества десятичных знаков.

КонстантыОписание
число Пивозвращает 3.141592
Евозвращает 0, 718282
бабушкаНе число
инфбесконечный

Пример :

import math
print( "CONSTANTS IN PYTHON")
print(" PI value : ", math.pi)
print(" E value : ", math.e)
print(" nan value : ", math.nan)
print(" E value : ", math.inf)

Выход :

2. Логарифмические функции

Обратное для возведения в степень называется логарифмом. Для любого заданного числа x для определения его соответствующего логарифмического значения вычисляется показатель степени другого фиксированного числа с основанием b. В более простом случае логарифм вычисляет или подсчитывает числовые вхождения одного и того же фактора при повторном умножении;

Пример: 1000 = 10 × 10 × 10 = 103, тогда «логарифм по основанию 10» из 1000 равен 3. Логарифм по x к основанию b обозначается как logb (x).

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

Пример: 82 = 8 × 8 = 64

Словом, представление 82 можно было бы назвать «8 в степени 2» или просто как «8 в квадрате». С другой стороны, показатель числа означает число раз, которое число используется в коэффициенте умножения.

функцияОписание
ехр (х)Возвращает е ** х
expm1 (х)Возвращает е ** х — 1
log (x (, base))х к основному логарифму возвращается
log1p (х)Base1 логарифм значения х возвращается
log2 (х)Base2 логарифм значения х возвращается
log10 (х)Base10 логарифм значения х возвращается
Пау (х, у)Возвращает x в степени y
SQRT (х)Возвращается квадратный корень для х

Пример:

import math
#variable declaration and assignation
Number_1 = 1
Number_2 = 2
Number_3 = 3
Number_4 = 4
# Applying exp() function
print(" EXPONENT VALUE ")
print(" Exponent value: ", math.exp(Number_1))
print(" n ")
# Applying Base1 logarithm function
print(" BASE1 LOGARITHM " )
print(" BASE1 LOGARITHM VALUE of 2 : ", math.log1p(Number_2))
print(" n " )
# Applying Base2 logarithm function
print(" BASE2 LOGARITHM " )
print(" BASE2 LOGARITHM VALUE of 2 : ", math.log2(Number_2))
print(" n " )
# Applying Base10 logarithm function
print(" BASE10 LOGARITHM " )
print(" BASE10 LOGARITHM VALUE of 2 : ", math.log10(Number_2))
print(" n " )
# Applying x to power of Y
print(" X^Y" )
print(" X^Y Value : ", math.pow(Number_3, Number_4))
print(" n " )
# Applying square root determination
print(" SQUARE ROOT " )
print(" SQUARE ROOT of 4 : ", math.sqrt(Number_4))
print(" n " )

Читайте так же:
Где лучше посадить гранат?

Выход :

3. Числовые функции

Числовые функции позволяют вычислять все математические значения.

КонстантыОписание
CEIL (х)Наименьшее целое число, которое намного больше или равно значению x, возвращается
Copysign (х, у)Используя знак y, возвращается значение для x
FABS (х)абсолютное значение для х возвращается
факториала (х)факториальное значение х возвращается
пол (х)возвращается наибольшее целое число, которое намного меньше или равно значению x
fmod (x, y)остаток от деления x на значение y возвращается
frexp (х)Возвращает мантиссу и показатель степени x как пару (m, e)
Fsum (итерация)Возвращает точную сумму значений с плавающей точкой в ​​итерируемом
isfinite (х)если x не является бесконечностью или Nan, тогда возвращается булево значение true
isinf (х)если x содержит положительную или отрицательную бесконечность, возвращается true
IsNaN (х)Возвращает True, если x является NaN
жк (х, у)для значений x и y возвращается наибольшее значение общего делителя
остаток (х, у)Найдите остаток после деления x на y.

Пример :

import math
#variable declaration and assignation
Number_1 = 10.5
Number_2 = 20
Number_3 = -30
Number_4 = -40.24566
Number_5 = 50
Number_6 = 60.94556
Number_7 = 70
Number_8 = 80
# Applying Ceil() function
print( " CEIL : Smallest integer which is very much greater than or equal to the x value is returned ")
print( " CEIL value : ", math.ceil(Number_1))
print( " n " )
# Applying Copysign() function
print( " COPYSIGN : Smallest integer which is very much greater than or equal to the x value is returned ")
Temp_var1 = math.copysign(Number_2, Number_3)
print(" VALUE AFTER COPY SIGN : ", Temp_var1)
print(" n ")
# Applying fabs() function
print( " FABS : absolute value for the x is returned ")
print(" ABSOLUTE VALUE FOR 40.24566 : ", math.fabs(Number_4))
print(" n ")
# Applying Factorial() function
print(" FACTORIAL : factorial value of x is returned ")
print(" Factorial value for 50 : ", math.factorial(Number_5))
print(" n ")
# Applying Floor() function
print(" FLOOR : largest integer which is very much less than or equal to the x value is returned " )
print(" Floor : ", math.floor(Number_6))
print(" n ")
# Applying Fmod() function
print(" FMOD : remainder of divinding x by y value is returned ")
print(" Remainder : ", math.fmod(Number_6, Number_5))
print(" n ")
# Applying Frexp() function
print( " FREXP : Returns the mantissa and exponent of x as the pair (m, e) " )
print(" MANTISSA EXPONENT : ", math.frexp(Number_7))
print( " n " )
# Applying isfinite() function
print(" isfinite : if x is not an infinity or a Nan then boolean value true is returned ")
print(" Infinite or Nan (produces boolean output): ", math.isfinite(Number_8))
print(" n ")

Выход:

4. Тригонометрические функции

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

функцияОписание
грех (х)определяется значение синуса х в радианах
сов (х)значение косинуса х в радианах должно быть определено
тангенс (х)значение тангенса х в радианах должно быть определено
градусов (х)радиан в градусах
радиан (х)степень в радианах

Пример :

import math
print(" n ")
print(" TRIGNOMETRIC FUNCTION USAGE " )
print(" n ")
print(' The value of Sin(90 degree) : ' + str(math.sin(math.radians(90))))
print(' The value of cos(90 degree) : ' + str(math.cos(math.radians(90))))
print(' The value of tan(pi) : ' + str(math.tan(math.pi)))
print(" n ")

Читайте так же:
Как по номеру авто узнать страховку?

Выход :

Вывод — математические функции в Python

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

Рекомендуемые статьи

Это руководство по математическим функциям в Python. Здесь мы обсуждаем различные математические функции в Python с примерами. Вы также можете просмотреть наши другие предлагаемые статьи —

Как определить функцию в Python?

В этом уроке мы познакомимся с функциями.

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

Ранее мы уже знакомились с функциями в Питоне. Например, print () – это функция. Только ее программный код написан внутри самого языка Питон. А программист в любой удобный момент вызывает эту функцию, просто указав ее имя — print () .

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

Как создать свою функцию в Питоне 2.7?

  1. Существует специальная команда def . С помощью нее программисты и создают пользовательские функции. Для этого надо прописать def nazvanie_funktii ():
  2. Название функции следует писать на латинице, нельзя начинать с цифры.
  3. Если в названии два слова, их соединяют нижним подчеркиванием.
  4. В скобках указывают аргументы, или параметры. Это данные, с которыми и работает функция.
  5. В конце строки ставим кавычки.
  6. Тело самой функции следует писать со следующей строки, отступив слева 4 пробела.
  7. Программисты говорят так: аргументы передаются, а функция их принимает.

Практический пример

Создаем на рабочем столе файл test18.py Пишем в него следующий программный код:

Краткое пояснение к коду

В начале нашего кода мы пишем команду def , таким образом Питон знает, что мы сейчас будем писать собственную функцию. Называем эту функцию именем funktia1 . В скобках названия функции прописываем, что мы будем использовать любые аргументы, характеризующие данную функцию — (*arguments) . Здесь «звездочка» как раз и означает «любое количество аргументов».

Далее прописываем сами аргументы, только пишем их в виде переменных — klub1, klub2.

Далее – вывод на печать этих аргументов.

В самом низу кода – вызываем функцию. То есть вводим название этой функции и в скобках указываем названия аргументов (в данном случае спортивные клубы Спартак и Динамо).

Главная ошибка

Часто Питон выдает нам ошибку выполнения программы: IdentationError: unexpected indent

Эта ошибка означает, что мы при написании кода функции не сделали отступ в 4 пробела, а просто нажали на enter. Внимание: вы должны поставить курсор на начало строки и отступить пробелом 4 раза, и только после этого печатать код функции. Вы также можете покопаться в настройках Notepad++ и убрать возможность переноса строки TABом. То есть чтобы курсор при нажатии на enter опять возвращался в крайнее левое положение, а не перескакивал на уровень предыдущей строки.

Этот код немного похож на выполнение функции argv, которую мы разбирали ранее ЗДЕСЬ и ЗДЕСЬ.

Теперь открываем программу PowerShell и прописываем команду: python desktop/test18.py

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

Видите главное отличие функции? Мы прописали только название функции и название аргументов, а Питон нам выдал полный текст, с использованием переменных и названиями аргументов.

Домашнее задание

1. Попробуйте изменить запись аргументов со звездочки на перечисление, и посмотрите, что получилось. Например, вот так:

2. Попробуйте изменять количество аргументов в функции. Например, пропишите только один аргумент, как здесь:

3. Попробуйте совсем без аргументов, посмотрите, что получилось, как здесь.

4. Попробуйте поменять название функции, название аргументов.

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

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

  • Вы здесь:  
  • Главная />
  • Python 2.7 с нуля />
  • Урок 22. Что такое функция в Python 2.7

Оператор прерывания в Python

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

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

Синтаксис прерывания приведен ниже.

Пример: оператор break с циклом while

Полный код

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

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

Теперь рассмотрим случай, когда существует только одно решение (или двойное решение, когда дискриминант равен 0):

И, наконец, вариант, в котором не существует реального решения, потому что дискриминант отрицательный:

Лучшие инструменты проверки типа данных

Mypy может считаться самым первым инструментом проверки типов данных для Python. Работа над библиотекой началась в 2012 году, и её до сих пор активно развивают. Mypy стала прототипом для других подобных сторонних библиотек в Python, хотя с тех пор появилось и немало новых инструментов, расширивших её функции.

Инструмент Mypy можно запустить отдельно или из командной строки. Его также можно сделать частью редактора или встроить в IDE в роли средства контроля кода (линтера).

Поддержка

Многие IDE и редакторы имеют встроенную поддержку Mypy. Модуль Python для Visual Studio Code тоже может работать с системой напрямую. При запуске Mypy создаёт отчёт о согласованности кода на основе почерпнутой из него информации о типах данных.

Если код не поддерживает аннотации типов, Mypy не выполнит львиной доли проверок из своего арсенала. Но инструмент можно также использовать, чтобы сделать определение типа без аннотации. Сделать это можно с помощью нескольких степеней строгости проверки на тип данных, в зависимости от целей.

Принципы работы

Если начинать базу исходного кода с нуля и превентивно следовать жёсткой стратегии линтинга (статистического анализа кода), опция « —strict » не разрешит любой код без типизации.

Но предположим, что мы работаем с унаследованным кодом, в котором объявлений типов немного. Тогда подойдут более мягкие варианты. Например, можно запретить только определения функций без объявления типа, используя опцию « —disallow-untyped-defs » и допуская другой нетипизированный код. Кроме того, всегда можно оградить отдельные строки от проверки внутристрочными комментариями вида « # type: ignore ».

Файлы заглушки

Mypy позволяет задействовать stub-файлы (заглушки), предусмотренные документом PEP 484, и использовать аннотации типов для публичных интерфейсов модулей. К тому же, в Mypy доступен специальный плагин stubgen. Этот инструмент автоматически создаёт stub-файлы на основе имеющегося кода.

Для нетипизированного кода stub-файлы будут содержать универсальные типы (дженерики), которые затем можно разметить нужным образом.

Pytype

Инструмент Pytype, созданный Google, отличается от Mypy использованием так называемого «вывода типов» (inference), вместо обычного дескрипторов типа. Это значит, что Pytype пытается определить типы путём анализа потока кода, а не полагается исключительно на аннотации.

Принципы работы

Везде, где это имеет смысл, Pytype проявляет снисходительность. Если есть операция, которая при выполнении нормально работает и не противоречит аннотациям, то Pytype не будет препятствовать процессу.

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

Читайте так же:
Что такое та в магнитоле?

Функционал

Для добавления в код аннотации типов особенно пригодится такая функция Pytype, как « reveal_type ». Если добавить в код выражение « reveal_type(expr) », то Pytype установит тип «e xpr » и выдаст предупреждение, в котором он будет указан.

Обращаем внимание. Некоторые характеристики Pytype управляются вставкой атрибутов в сам код. Например, чтобы Pytype прекратил жалобы на отсутствующие динамические атрибуты или модули, нужно не менять что-то в метаданных конфигурации, а добавить атрибут «_HAS_DYNAMIC_ATTRIBUTES = True» в нужные классы или модули.

Pyright

Pyright — средство проверки типов данных для Python от Microsoft. Он присутствует в Visual Studio Code как часть Pylance — бесплатного модуля языкового сервера Python. Этот многофункциональный инструмент Python — проверка типов сочетается в нём с линтингом кода.

Принципы работы

Как и Pytype, Pyright может работать с базами исходного кода, которые не имеют информацию о типах. В таких случаях Pyright постарается выполнить вывод «используемых типов» (type inference).

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

Функционал

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

В VS Code «рабочие области» (workspace) с несколькими корневыми каталогами могут использовать отдельные конфигурации Pyright, если разные части проекта требуют особой настройки линтинга.

Ещё можно определить внутри проекта несколько «сред выполнения» (execution environment). Каждая получит своё «виртуальное окружение» (venv) или «путь импорта» (import path).

Pyre создан разработчиками Facebook и Instagram. По сути, это два инструмента в одном:

  • система проверки типов (Pyre);
  • средство статистического анализа кода (Pysa).

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

Принципы работы

Подход Pyre аналогичен Pytype и Mypy. С кодом без типизации данных программа обращается снисходительней, чем с типизированным. Поэтому можно взять нетипизированный код и добавлять в Python аннотации пошагово: функцию за функцией, модуль за модулем.

Если включить «строгий режим» (strict mode), Pyre отметит все пропущенные аннотации. Можно также выставить строгий режим по умолчанию, отключая его на уровне модулей. Pyre работает и со stub-файлами в формате «.pyi».

Функционал

У Pyre есть мощная функция для миграции баз исходного кода в типизированный формат. С опцией командной строки « infer » программа берёт файл или каталог, делает эмпирические предположения об использованных типах и применяет полученные аннотации к файлам.

Но перед этим стоит сделать их резервную копию. Если нужна информация о типах для выполняемой программы Python, у Facebook/Instagram есть для этого другой сервис — MonkeyType.

Особенности Pysa

По функциям инструмент Pyre аналогичен другим рассмотренным пакетам, но Pysa имеет свои уникальные преимущества. Этот модуль проверки выполняет для кода taint-анализ — ищет возможные проблемы безопасности. Pysa использует библиотеку потокового анализа определённых программных компонентов, после чего отмечает потенциально уязвимый код.

Всё, что связано с этим кодом, будет отмечено как «загрязнённое» (tainted). Впрочем, можно указать компоненты, которые обеспечат безопасность данных, убрав такие данные из «диаграммы загрязнения» (taint graph).

Недостаток в том, что библиотека Pysa для taint-анализа сторонних компонентов всё ещё мала. Поэтому может потребоваться создание собственной модели.

Однако, в этой библиотеке уже содержатся модели taint-анализа наиболее распространённого ПО. Например, в этот перечень входит веб-фреймворк Django, ORM-библиотека SQL Alchemy, библиотека анализа данных Pandas.

Нужна надёжная база для разработки программных продуктов? Выбирайте виртуальные сервера от Eternalhost с технической поддержкой 24/7 и бесплатной защитой от DDoS!

голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector