Найти в Дзене
ZDG

Языки программирования 7: Python

Оглавление

Питон часто называют "лёгким языком для новичков", но это впечатление на самом деле поверхностное.

Предыдущая часть:

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

Он был создан относительно недавно, в 1991 году, и как пишут, "хотя его название похоже на большую змею, на самом деле оно происходит от шоу Монти Пайтона". Но ирония заключается в том, что название шоу "Монти Пайтон" в свою очередь происходит как раз от названия большой змеи.

Язык для новичков?

Что от него требуется? Низкий порог входа. То есть сел и сразу написал программу, не тратя время на изучение формальностей, вроде #include <stdio.h> или void main(int argc, char** argv).

Питон отлично справляется с этой задачей. Давайте я дальше буду притворяться новичком. Можно сразу написать:

print ('Hello World')

Я сразу увидел результат и почувствовал себя хакером. Но... что дальше с этим делать? Дальше надо учить всё остальное.

Конкатенация строк? Прекрасно. Что дальше?

-2

Оппа... Учитель, у меня тут какие-то непонятные буквы!

-3

Нельзя сложить строку и число? А почему? Новичок должен это понимать?

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

-4

Операция умножения, хорошо.

-5

Что это? Строку нельзя сложить с числом, но можно умножить на число? Почему?

А вот кортеж (в Питоне это список-константа) из элементов 1, 2, 3 умножается на 5:

-6

Может, это векторное умножение и получится 5, 10, 15? Нет, получится 1,2,3,1,2,3,1,2,3,1,2,3...

-7

Ой, а что тут у нас? Ненавистные многим += и == из Си, но как же так, как они попали в язык для новичков? А что такое elif? Разве не понятнее будет else if?

Кстати, а почему if пишется без скобок, а print со скобками?

И, как говорится, тогдалие.

Отступы

Питон это такой редкий язык, где функциональные блоки оформляются не фигурными скобками {...}, и не begin..end, а отступами, заданными с помощью табов или пробелов.

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

К примеру, посмотрим на код подпрограммы из проекта "Питон на Питоне":

-8

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

-9

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

-10

Циклы for

Ранее мы выяснили, что конструкция for в Паскале является чистым счётчиком для ровно одной задачи – считать количество повторений цикла, в то время как в C эта конструкция может делать всё что угодно, хоть всю программу в ней пиши. В Питоне это ни то, ни другое. Выглядит она так:

-11

Cлово range это не элемент синтаксиса языка, а функция, которая порождает объект-коллекцию, или последовательность целых чисел от 0 до 10. Причём она начинается с 0, а доходит только до 9. Значение 10 туда не входит. Конструкция for это на самом деле итератор, который перебирает элементы списка и присваивает переменной i очередной элемент.

Теперь попробуйте всё это объяснить новичку.

-12

Проходить итератором можно по разным коллекциям, в том числе например по строкам, перебирая каждый символ. В целом концепт полезный и распространённый для работы с коллекциями. Скажем, перебирать карту пар "ключ-значение" можно только итераторами, потому что там нет последовательных индексов, как в массиве.

Можно, конечно, сделать и обычный цикл while:

-13

Объекты

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

-14

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

Далее мы создаём объект этого класса obj, а в этом объекте создаём свойство test. А потом удаляем его. Так что несмотря на явно указанный класс объекта, набор его свойств может быть любым.

Подробнее про ООП в Питоне я писал здесь:

ООП в Python: особенности реализации
ZDG10 октября 2020

Математика

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

Кроме того, есть даже поддержка комплексных чисел.

Ну и конечно, Питон в наши дни поднялся благодаря своим многочисленным библиотекам, в частности для работы с нейросетями и массивами данных.

Собственно поэтому, когда вы видите рекламу "Пишем 9 нейросетей за 3 дня", это значит, что вы там не будете писать никаких нейросетей. Вы будете писать просто вызовы уже готовых библиотек.

Производительность

Питон остаётся сравнительно очень медленным языком, но это компенсируется тем, что самые тяжеловесные вещи (читай: нейросетки) находятся в библиотеках, написанных на C, а Питону остаётся лишь их вызывать. Плюс к этому есть JIT-компиляторы, ускоряющие исполнение Python-программ до уровней, соответствующих лидерам индустрии.

Заключение

  • Питон не такой уж язык для новичков, особенно если заходить дальше чем Hello World
  • Оформление кода отступами – зло, но имеет поклонников
  • Широкие возможности для тех, кто занимается наукой и обсчитывает много данных

Читайте дальше:

Наука
7 млн интересуются