Python — язык с динамической типизацией, что означает, что мы не определяем тип объекта, но это не значит, что мы не можем объявлять типы как форму аннотаций ради документирования нашего кода. Документы Python называют это подсказками типов. Смотри документы здесь.
Иногда при анализе данных и построении/оценке моделей машинного обучения в блокноте Jupyter мы заканчиваем тем, что пишем функции, чтобы сэкономить время и нервы. Ведь зачем писать
(var1 + var2 + var3 + var4 + var5) / 5
когда мы могли просто создать повторно используемую функцию:
Конечно, с пакетом научных вычислений Numpy мы можем просто сказать:
np.mean([10,15,25,30,35,40])
Но что, если мы не знаем, как работает причудливая функция Numpy, какие значения мы должны передавать ей и как?
Что ж, во многих IDE вы можете получить подсказку о том, как работает функция. В Jupyter Notebook вы можете просто нажать Shift+Tab курсором в круглых скобках вызова функции, и, как вы видите на изображении слева, мы получаем быстрый просмотр сигнатуры функции. Если мы расширим это, мы получим довольно значительное объяснение сигнатуры функции, что она делает, ее параметры, возвращаемое значение и т. д. и т. д. Внезапно мы понимаем: «Эй, эта средняя функция Numpy может сделать немного больше, чем наша. ” Наш метод вообще не принимает во внимание ось или тип данных.
Что здорово, так это то, что мы можем сделать это с помощью наших собственных функций.
В качестве тривиального примера предположим, что нам нужно перебрать несколько функций набора данных (столбцы фрейма данных в этом примере) и увидеть подсчет их уникальных значений. Для меня, по крайней мере, было бы раздражающим набирать несколько строк кода и смотреть на все по отдельности. Поэтому вместо этого я напишу код многократного использования:
Пример:
Выше мы видим в определении функции, что мы указываем тип аргумента columns
как List
, а тип аргумента df
как Pandas.DataFrame
. -> None
после скобок аргумента означает, что тип возвращаемого значения отсутствует — в этом случае мы ничего не возвращаем; скорее, мы просто выведем строку на стандартный вывод.
Так какая тут отдача?
Ну, для начала, мы довольно явно комментируем наш код, предоставляя в коде подсказки типов. Если кто-то еще работает с нашей кодовой базой или записной книжкой Jupyter, нет никакой двусмысленности в отношении того, что делает наша функция.
Во-вторых, и потенциально более полезной является возможность различных IDE и REPL отображать подсказки и документацию для функций. Как мы упоминали ранее, Jupyter Notebook (iPython) может показать нам:
- сигнатура функции
- строка документации — в нашем случае мы указываем входные параметры и возвращаемое значение (или другой вывод)
Ознакомьтесь с полным примером кода (Github Gist) -> здесь ‹-
Это круто; что еще у тебя есть?
Что ж, раз вы спросили, вы также можете определить то, что известно как «псевдоним типа».
Что мы сделали выше, так это определили новую переменную Vector
, которая назначается как псевдоним List[np.int64]
, и мы обозначаем это в наших аргументах как: columns: Vector
. Это в основном сообщает разработчику, что columns
представляет собой List
значений, которые представляют собой numpy int64. Мы также могли бы просто сказать int
здесь.
Примечание:
- IDE = интегрированная среда разработки и
- REPL = Read Evaluate Print Loop (т. е. интерактивные оболочки некоторых языков программирования)