О мерзостях Питона
Приобрёл дневник из змеиной кожи. Теперь я тоже буду писать на Питоне. (С)
Абсолютно не ново, но как-то наболело, много видел 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 (если Вы маньяк)
22.12.2023, 17:55 [166 просмотров]