LINUX.ORG.RU

Зачем Python?

 , ,


5

5

Обычно, ЯП - это инструмент, заточенный для решения задач в какой-то определенной сфере. У создателей ЯП была для него ЦЕЛЬ, которая наполняла смыслом бытие ЯП. Или же ЯП оказался обладателем таких характеристик, которые позволили эффективно решать определенные задачи, даже если изначально на него были другие планы. Это также объясняет необходимость существования ЯП.

Что-то низкоуровневое - Си, Rust, Ada; сервер - PHP, Go (а где-то Java, JS); клиент - JavaScript; энтерпрайз - C#, Java; скрипты для CLI - bash, lua (хотя сойдут PHP или JS); математика - R, Fortran; мобильные приложения - Java, Kotlin, Swift; начальное обучение - Basic, Pascal (можно Lisp, но лучше не стоит). Всё ясно, понятно.

А какие специфические задачи решает Python? В чём его смысл? Вот в (https://youtu.be/KnFrdzG79ak?t=532) МФТИ на информатике говорят, что Python - это классная штука, так как на нём можно всё (и в web, и в смартфон), мол универсальный. Но, имхо, это скорее минус, чем плюс. Это как швейцарский нож - может многое, но всё не очень качественно. В (https://youtu.be/bX3jvD7XFPs) MIT'e перевели обучение с эльфийского (Scheme) на Python. Ну для педагогических целей, для первокурсников, может Python и выглядит лучше. Хотя как аргумент в его пользу - ну так себе.

Пока я вижу, что в реальном мире Python (объективно) нужен для двух задач:

1. Поддержка legacy-кода, уже написанного адептами Python'а. Например, какие-нибудь скрипты для иксов, скрипты для сис.админов и т.п.
2. ML. Просто потому, что под ML были написаны нужные библиотеки (в нужном кол-ве и кач-ве) именно на Python. По неизвестным причинам написаны.

Сфера для (эффективного) применения Python'а очень мала, или мне показалось?

При этом, повсеместно говорят о популярности Python, как это модно-молодежно, его мол и учите. Закрадываются подозрения. А не является ли широкая популярность (или слухи о ней) Python исключительно маркетинговым явлением, когда ЯП, опять же по неясным причинам, проталкивают сверху? Если это так, то для чего это делают? А если не так, и он объективно эффективно решает какие-то задачи (почему его добрые люди и советуют), то объясните какие это задачи, какова целевая сфера применения Python'а, каков его смысл, цель???



Последнее исправление: Edward_I (всего исправлений: 3)
Ответ на: комментарий от no-such-file

Должно-то работать безотносительно чего я хочу, или не хочу.

Поржал. Гениально.

anonymous
()
Ответ на: комментарий от no-such-file

Во-первых пролюбить отступ при копипасте можно (и очень просто), а символ невозможно.

Т.е. вставить закрывающую скобку IDE автоматически может, а отступы обрезать так, чтобы вставляемый тобой кусок начинался с позиции, где курсор стоит — не может. Ну ок, значит посчитать кол-во табов до первого другого символа, и обрезать такое же количество табуляций в остальных строках — непосильная задача.

Проблемы начинаются когда код нужно двигать

Никаких проблем. Блок сдвигается влево\вправо на раз.

скобочки не теряются

4.2

mogwai ★★★★★
()
Последнее исправление: mogwai (всего исправлений: 1)
Ответ на: комментарий от anonymous

Вот для интереса - напишите на Python эквивалент этой маленькой и простой перловке: `blabla | perl -pe «s/foo/bar/g»'`.

Я в таких случаях предпочитаю sed, но если очень хочется:

blabla | pyp 'p.replace(«foo»,«bar»)'

Теперь твоя очередь, перепиши на перле:

python -c 'print((lambda o:(lambda a:list(filter(None,(list(map(lambda i:list(map(lambda x:a.__setitem__(x,0),range(2*i,o,i))),range(2,o))),a)[1]))[1:])(list(range(o))))(99999))'
(алгоритм неоптимальный, но итак работает достаточно быстро)

На питоне тоже можно писать рабочее хрен-пойми-что. Но код на питоне автоматически получается хорошим. И чтобы код стал нечитаемым, надо очень постараться. А на перле всё наоборот — надо стараться, чтобы код был читаемым.

pynonymous
()
Ответ на: комментарий от mogwai

вставить закрывающую скобку IDE автоматически может

Нет не может. Но я могу её поставить, а если не поставлю, то не «скомпиляется».

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

Да. Ибо вставляться может невалидный код, который становится валидным только после вставки (а то и небольшого допила руками). Т.е. нужно сначала вставить а потом форматировать, но отступы уже профукаются к этому моменту. Ты можешь только сам, понимая код, разрулить руками что куда.

посчитать кол-во табов до первого другого символа

Это не работает, т.к. код который вырезан может быть невалидный, т.е. там может быть всякая дичь и что-то там считать бессмысленно.

На самом деле проблема лежит ещё глубже, чем профукивание выравнивания. Суть в том, что питон требует от программиста следить за выравниванием кода всегда, в т.ч. на промежуточных этапах. Т.е. тут нельзя скопипастить, отредактировать и автовыровнять. Нет ты скопипасть, сначала выровняй (и внимательно проследи чтобы ничего непрофукалось и не склеилось в один блок), потом отредактируй и снова выровняй. Если нужно скпопиастить 10 кусков, то повторяй это развлечение на каждой вставке. Просто накидать 10 кусков, отредактировать и в конце автовыровнять нельзя (ибо сам не поймёшь что к чему относится).

no-such-file ★★★★★
()
Ответ на: комментарий от pynonymous

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

ЛОЛ.

И чтобы код стал нечитаемым, надо очень постараться

Чё там стараться, парочка трёхэтажных comprehensions, как любят питонисты (выразительный язык, чо, надо выражаться) и приехали.

no-such-file ★★★★★
()
Ответ на: комментарий от mogwai

Присоединяюсь к высказыванию анонимуса

Ты примеры потыкал, чтобы присоединятся?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Т.е. тут нельзя скопипастить, отредактировать и автовыровнять. Нет ты скопипасть, сначала выровняй (и внимательно проследи чтобы ничего непрофукалось и не склеилось в один блок), потом отредактируй и снова выровняй. Если нужно скпопиастить 10 кусков, то повторяй это развлечение на каждой вставке. Просто накидать 10 кусков, отредактировать и в конце автовыровнять нельзя (ибо сам не поймёшь что к чему относится).

Нельзя просто десять раз закопипастить. Беда-беда, стековерфлоу-программисты в пролёте.

anonymous
()
Ответ на: комментарий от pawnhearts

Тот код с MRO я только что запустил на интерпретаторе python3, похоже в тетей версии выкинули legacy MRO.

Python 3.5.2

class A: x = 'a'

class B(A): pass

class C(A): x = 'c'

class D(B, C): pass

D.x # вернет 'c'

Python 2.7.12

D.x # вернет 'a', С.x окажется скрыт

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

Aber ★★★★★
()
Последнее исправление: Aber (всего исправлений: 1)
Ответ на: комментарий от Aber

В питоне много всего можно делать с self помимо получения его полей. Может ты хочешь делать self(something) или self[something] или self > obj или setattr(self, something, val)

pawnhearts ★★★★★
()
Ответ на: комментарий от no-such-file

И чтобы код стал нечитаемым, надо очень постараться

Чё там стараться, парочка трёхэтажных comprehensions, как любят питонисты (выразительный язык, чо, надо выражаться) и приехали.

Например? Можно увидеть пример кода на питоне и пример такого же кода на любом другом языке для сравнения?

pynonymous
()
Ответ на: комментарий от anonymous

Нельзя просто десять раз закопипастить. Беда-беда

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

no-such-file ★★★★★
()
Ответ на: комментарий от Aber

Мне непонятно как отличать локальные переменные от аттрибутов объекта, особенно, учитывая что ты можешь динамически аттрибуты в этот объект добавлять, их может возвращать какой-нибудь __getattr__, даже сам тип объекта может быть тоже сконструирован динамически. И как это все будет выглядеть в байткоде?

pawnhearts ★★★★★
()
Ответ на: комментарий от pynonymous

пример кода на питоне и пример такого же кода на любом другом языке для сравнения

Любая трансформация массива, например. Там где в «любом другом языке» пишут map и лямбду - в питоне какая-то срань со своим ублюдочным спецсинтаксисом.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Любая трансформация массива, например. Там где в «любом другом языке» пишут map и лямбду - в питоне какая-то срань со своим ублюдочным спецсинтаксисом.

Так и скажи что не осилил.

anonymous
()
Ответ на: комментарий от pawnhearts

Я подразумевал что self мог бы быть опциональным, неявно присутствовать, но его можно было бы явно прописать в коде в случае необходимости (например если локальная переменная перекрывает поле класса, или в тех случаях которые ты привел). Но чем больше я думал про то как выкинуть self из python тем больше мне становилось ясно, что это повлекло бы значительные изменения в синтаксисе языка, в частности нужно было бы вводить ключевое слово для декларирования локальных переменных, это был бы уже не python. Так что мои претензии к питон тут не совсем адекватны, получается что я недоволен python тем, что он python :)

Aber ★★★★★
()
Последнее исправление: Aber (всего исправлений: 2)
Ответ на: комментарий от anonymous

Для тебя

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

no-such-file ★★★★★
()
Ответ на: комментарий от Aber

На самом деле, something= и есть такое ключевое слово. В противном случае переменная будет искаться в замыкании и дальше в глобальном скоупе. Работа с глобальными переменными намного медленней, чем с локальными.

bar = 11
In [1]: def foo():
   ...:     x = bar / 2
   ...:     bar = 1
   ...:
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-3-c19b6d9633cf> in <module>
----> 1 foo()

<ipython-input-1-2fa1feb12b2a> in foo()
      1 def foo():
----> 2     x = bar / 2
      3     bar = 1
      4

UnboundLocalError: local variable 'bar' referenced before assignment

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

pawnhearts ★★★★★
()
Ответ на: комментарий от no-such-file

Любая трансформация массива, например. Там где в «любом другом языке» пишут map и лямбду - в питоне какая-то срань со своим ублюдочным спецсинтаксисом.

Это всё слова. А по факту может оказаться, что такой код на питоне в 5 раз короче и в 2 раза понятнее.

Потому я и прошу — пример кода в студию!

PS: А, что, код на питоне с map-ами и лямбдами кажется очень понятным?

pynonymous
()
Ответ на: комментарий от WitcherGeralt

Ну у них выбора нет. Или питон или жаба. Теперь вот го и раст появились ещё.

D мог ещё влезть туда, но не смог.

RazrFalcon ★★★★★
()
Ответ на: комментарий от crutch_master

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

А разве это плохо? По-моему код, в котором нужно помнить только одну переменную i, читается легче, чем код, в котором нужно помнить значения a, b, c, p, k, i, j, u и v.

Отступы не делают никакой погоды. Это меньшее, с чем могут быть проблемы.

Отступы — это мелочь, да. Другая мелочь: вместо специальных конструкций и символов ?#*~$@? используются обычные слова, которые читать всё-таки легче, чем однострочники на перле. А ещё питон не даёт записывать длинный код в одну строку, это сразу заставляет его структурировать, тоже делая его более читаемым. Питон сразу даёт высокоуровневые структуры, позволяя не отвлекаться на низкоуровневую реализацию, и сосредоточиться на хорошей высокоуровневой архитектуре. И так далее.

Всё по отдельности — это мелочи. Но вместе эти мелочи и делают код сразу неплохим. Синтаксис питона этому способствует.

Дальше код можно улучшить, или ухудшить, это уж на усмотрение автора. Например, тот скрипт можно сократить, выкинув строк 5, почти без потери читаемости. А можно записать и весь в одну строку, сделав полностью нечитаемым.

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

Потом прокомментирую это «не так и плохо».

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

pynonymous
()
Ответ на: комментарий от pynonymous

чтобы код стал нечитаемым, надо очень постараться

Достаточно посадить писать код нулёвую макаку. Питон позволяет слишком многое.

WitcherGeralt ★★
()
Ответ на: комментарий от no-such-file

Для меня это больше не проблема,

То есть ты зашёл посраться о проблеме, которой нет. Ясно.

anonymous
()
Ответ на: комментарий от crutch_master

В питоне ничего не мешает использовать одну переменную для всего

Одна из причин существования динамической типизации. Офигеть претензия. Предъяви сливному бачку за то, что воду льёт.

WitcherGeralt ★★
()
Ответ на: комментарий от no-such-file

Конечно, а что ещё делать на ЛОРе?

Сраться о реальных проблемах.

anonymous
()
Ответ на: комментарий от no-such-file

Должно-то работать безотносительно чего я хочу, или не хочу.

Кроме тебя кажется у всех все нормально работает...

dem ★★
()
Ответ на: комментарий от pawnhearts

А если я не знаю что там за тип будет? Я пишу либу...

dem ★★
()
Ответ на: комментарий от pawnhearts

Так в том, то и дело, что я просто не пишу тип (any или в C# народ все в variant пихает...), а человек на TS 3 дня описывает тип (и кстати на продакшн прилетает что то другое и оно даже не падает иногда), для таких случаев я детектил JsonSchema, что чувак на Go не делал и получал panic 'internal_error' что было прекрасно БЕЗ эксепшна...

dem ★★
()
Ответ на: комментарий от anonymous

В общем это уютное, безопасное место.

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

~~@~~

anonymous
()
Ответ на: комментарий от WitcherGeralt

Побыстрее этих ваших растов.

На доли процентов.

А надёжность зависит от кривизны рук разраба

Количество ежегодно находимых в Linux CVE говорит о том, что от инструмента таки тоже зависит.

~~@~~

anonymous
()
Ответ на: комментарий от anonymous

Там вообще речь про Go была. Но мне уже запруфили, что больше это не так. В прочем, во многих реальных задачах, где важнее всего ввод/вывод, Go и на уровне C не теряется.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

> Ругаются, что нет генериков. Как переиспользовать одну процедуру для разных типов?

Лично я очень доволен, что их нет. Пока их нет, в Go нет и трудно читаемого Java-трешака.

Спойлер: дженерики бывают разные. В том числе и лучше, чем в Java. В том числе и в мейнстримных языках.

~~@~~

anonymous
()
Ответ на: комментарий от anonymous

В Go с дженериками с самого начала лезли джаверы и они хотели как в Java.

WitcherGeralt ★★
()
Ответ на: комментарий от pynonymous

PS: А, что, код на питоне с map-ами и лямбдами кажется очень понятным?

Нет. Но в Python и нет итераторов с удобным интерфейсом для чейнинга методов.

~~@~~

anonymous
()

Единственное для чего хорош Python на мой взгляд - это одноразовые скрипты и обучение. Для написания чего-то более-менее серьёзного он не предназначен, так как производительность CPython просто никакая, GIL, жадный до памяти, отсутствие нормальной статической типизации. Сюда же можно добавить отсутствие нормальной поддержки лямбд, но это чисто мои хотелки.

Что касается читаемости, то тут я тоже не согласен - динамическая типизация делает код короче (не всегда), но читать такой код гораздо сложнее, так как не понятно сразу что у нас лежит в переменной. Для динамических языков делать IDE гораздо сложнее.

anonymous
()
Ответ на: комментарий от pynonymous

2.Питон делает длинный код коротким: нет закрывающих скобок (меньше строк)

Пункт номер 2 в пользу Python'a, при ответе на вопрос о сфере его применения. Нет скобочек => «меньше» кода!

)))

Edward_I
() автор топика

а что насчёт benchmarks ?

Здесь уже несколько раз прозвучал Web, как одна из сфер применения. Мол, Python - он для Web'a.

При этом, мифические отказники от PHP отказываются. В параллельной вселенной всё может быть. А в реальном мире такого не замечал.

Но ради объективности можно бенчи посмотреть. Ну не будут же люди переходить с быстрого языка, с относительно нормальным ООП (в отличии от), с Си-like синтаксисом, с ЯП под который написанно много, если не всё, для Web'a, на... на что-то не столь подходящее для Web'a ?

PHP 7.3.0 Vs Python 3.7.1

regex-redux
--------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
--------------------------------------------------
|PHP 	  |2.61|270552|816|2.44|79% 40% 40% 42% |
--------------------------------------------------
|Python 3 |16.98|445760|512|31.44|28% 74% 47% 38% |
--------------------------------------------------

spectral-norm
----------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
----------------------------------------------------
|PHP  	  |38.56|20848|1152|153.24|99% 100% 99% 99% |
----------------------------------------------------
|Python 3 |182.12|52752|443|705.87|96% 96% 96% 100% |
----------------------------------------------------


n-body
-------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
-------------------------------------------------
|PHP  	  |333.78|9400|1082|333.7|44% 30% 1% 27% |
-------------------------------------------------
|Python 3 |850.24|7916|1242|850.06|0% 0% 0% 100% |
-------------------------------------------------


fannkuch-redux
----------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
----------------------------------------------------
|PHP  	  |227.59|35536|1160|906.63|100% 99% 99% 100% |
----------------------------------------------------
|Python 3 |507.56|50988|950|1998.88|99% 99% 97% 99% |
----------------------------------------------------

mandelbrot
-------------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
-------------------------------------------------------
|PHP  	  |118.28|139504|875|472.05|100% 100% 100% 100% |
-------------------------------------------------------
|Python 3 |263.04|51780|688|1050.8|100% 100% 100% 100% |
-------------------------------------------------------

k-nucleotide 
---------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
---------------------------------------------------
|PHP  	  |41.29|250628|1079|134.2|74% 78% 90% 90% |
---------------------------------------------------
|Python 3 |72.8|189720|1967|276.09|95% 96% 98% 94% |
---------------------------------------------------

pidigits 
---------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
---------------------------------------------------
|PHP  	  |2.15|10932|399|2.15|100% 2% 1% 0% |
---------------------------------------------------
|Python 3 |3.47|10364|386|3.47|0% 1% 100% 0% |
---------------------------------------------------

binary-trees
---------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
---------------------------------------------------
|PHP  	  |58.93|765500|868|214.32|90% 98% 92% 90% |
---------------------------------------------------
|Python 3 |83.95|451732|589|290.57|88% 87% 87% 97% |
---------------------------------------------------

reverse-complement 
---------------------------------------------------
|source   |secs |mem |gz |cpu |cpu load |
---------------------------------------------------
|PHP  	  |12.54|513344|438|7.51|59% 6% 61% 28% |
---------------------------------------------------
|Python 3 |16.03|1007016|814|19.29|18% 59% 44% 23% |
---------------------------------------------------

Edward_I
() автор топика
Ответ на: комментарий от pawnhearts

И в чет куцость?

  • модификаторов доступа нет
  • статической типизации (даже намёков на неё) нет
  • многомерные массивы объявляются очень странно
  • switch-case

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

если не привязываться к синтаксису - многопоток и уродливый ооп.

чего-то типа sqlalchemy или ponyorm там просто не сделать.

чем они лучше Doctrine и/или Eloquent?

Ford_Focus ★★★★★
()
Последнее исправление: Ford_Focus (всего исправлений: 2)
Ответ на: комментарий от WitcherGeralt

Возможно был кривой бенчмарк. Но rust всегда был на уровне C/C++. Как минимум начиная с 1.0

RazrFalcon ★★★★★
()
Ответ на: комментарий от Ford_Focus

модификаторов доступа нет, статической типизации (даже намёков на неё) нет, многомерные массивы объявляются очень странно, switch-case, многопоток и уродливый ооп

Намёки на типизацию есть, вместо switch-case есть более универсальный if-elif-else, да и в питоне есть неплохой многопоток через Pool.map, например. А в остальном отличный список... только... можно теперь всё то же самое с примерами? А особенно:

уродливый ооп

Как это проявляется в коде? Что такого ООПшного можно сделать на других языках, но нельзя на питоне? Пример кода, пожалуйста!

А то на словах я тоже могу сочинять... Допустим... Меня достали эти дурацкие модификаторы вроде private. Из-за них, когда автор либы не сделал геттер к приватному полю, мне приходится лезть через интроспекцию в яве или паттерном «паблик морозов» в плюсах. А вот в питоне этой проблемы нет.

А все эти описания типов только замусоривают код. Зачем мне эти типы? Они нужны компилятору. А зачем мне при чтении кода лицезреть их в каждой строке по несколько штук? Среди этой кучи типов теряется сам код, фактические действия, которые он выполняет. Без них код смотрится чище и понятнее.

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

pynonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.