БлогNot. О мерзостях Питона

О мерзостях Питона

Приобрёл дневник из змеиной кожи. Теперь я тоже буду писать на Питоне. (С)

Абсолютно не ново, но как-то наболело, много видел subj в декабре. Возможно, будет пополняться. Главная диверсия - subj не первый год уже в ЕГЭ, в компании Гиениального (в статье от 2022-го мёртвый с середины "нулевых" Delphi всё ещё "постепенно уходит").

Тезисы даны вразнобой, по мере наслаждения образцами.

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

2. Собственно, вторая проблема тоже связана с большими проектами. Python едва ли пригоден для них (как и Ruby, PHP и иже с ними - из-за низкой скорости работы, динамической типизации и динамической области видимости, то есть, перед выполнением операций с любым объектом интерпретатор проверяет его тип). Для работы больших систем по-прежнему "рулят" Java, С, C++.

3. Плохая производительность Python "зашита" в самой его архитектуре. Низкая скорость выполнения программы (в 10+ раз медленнее С++), а также ошибки, которые появляются только в Runtime. Как для любого интерпретатора, приходится тратить гораздо больше времени на тестирование.

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

5. Про совместимость вообще помолчим. Даже 3.8 проекты не совместимы с 3.7, далее по линейке.

6. На Питоне трудно подсчитать что-то нормальное без написанной на C и Fortran (да-да) библиотеки Numpy :)

7. Оптимизации векторизации в Питоне тоже не работают. Скажем, обычный массив вида [100, 200, 300, 400, 500] на самом деле хранит не целые числа, а указатели на объекты типа int, каждый из которых хранит указатель на область памяти, в которой записано соответствующее ему число. Даже один косвенный указатель ломает векторизацию, а тут для доступа к информации о числе нужно пройтись, как минимум, по двум.

8. Код на Питоне в принципе плохо оптимизируем - из-за той же динамической типизации (переменная, объявленная в этом языке, не имеет привязанного к ней типа, то же касается сигнатур функций и полей классов), во вторых, переменная, будучи объявленной, в Питоне не обязана прекращать существование после выхода из родного блока отступов. В-третьих, динамическое создание классов "на лету". Все эти создаёт практическую невозможность предоставления статических гарантий относительно поведения кода.

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

9. Использование лямбд в Python ограничено. Они могут быть только выражениями (expressions), но не инструкциями (statements). С другой стороны, объявления переменных и statements и есть инструкции. Проще говоря, добавление statements сделает лямбду многострочной, а синтаксис Python не позволяет этого сделать. Такое различие между expressions и statements довольно произвольно, и не встречается в других языках.

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

10. Делать мобильную разработку в Kivy - это... "миллионы мух не могут ошибаться".

11.

a if condition else b

- это тернарная операция в Питоне. Без комментариев.

12. Там нет нормальных инкремента и декремента (++ и --).

13. Там нет цикла с постусловием do-while. да, циклы взаимозаменяемы и можно заменить диковатым костылём, но смысл?!

14. В объявлении конструктора класса нужно указывать ссылку self. Но при вызове такой аргумент передавать не нужно. Чтобы распечатать экземпляр класса, нужно догадайтесь что? Определить в нём метод __str__ с таким же аргументом. Всё удобно и логично, даже круче PHP. :)

class Person:
 def __init__(self, name, age):
  self.name = name
  self.age = age
 def __str__(self):
  return format(f"{self.name}, {self.age}")

person = Person("Name", 33)
print(person)

Кстати, чтобы сделать свойство приватным, нужно... поставить перед его именем два символа подчёркивания! А уж @property и @свойство.setter это вообще песня.

15. Повторение строки (и не только) операцией умножения - это круто.

print("a" * 3)  # aaa

Не путайте с

a = "aaa"
print(*a)

- ничего общего.

16. Некий переключатель switch появился аж в версии 3.10 и называется... match, видимо, намекают на многопоточность или регулярки? :)

17. "Простое замещение xrange на range обеспечит совместимость вашего кода с Python 3." И так у них всё, гораздо больше, чем в любом другом языке.

Что поставить для поддержки Питона в Visual Studio (если Вы маньяк)
Что поставить для поддержки Питона в Visual Studio (если Вы маньяк)

22.12.2023, 17:55 [110 просмотров]


теги: список программирование python

К этой статье пока нет комментариев, Ваш будет первым