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)
Ответ на: комментарий от Aber

Обязательное self для обращения к членам экземпляра класса. Создается впечатление что ООП только что добавили в язык.

self не только в питоне есть.

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

В коммерческих проектах отлично все вываливается и на C# и на TS

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

Ну все кто пишет на python2 знают что надо писать A(object). Но вообще у тебя такой код сломается на первом же super.

>>> class Foo:
...   def __init__(self):
...     super(Foo, self).__init__()
...
>>> Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __init__
TypeError: must be type, not classobj

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

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

Но питон тебя форсирует явно указывать ссылку на this, представь если бы тебе в CPP обязательно нужно было в методах класса при обращении к полю этого же класса писать this->m_value = 10. Есть такая идея что полезного/значимого кода очень мало, а вся обвязка вокруг логики которая делает полезную операцию мешает восприятию кода человеком, в новых языках от синтаксического шума пытаются избавиться, отсюда вывод типов, избавление от точек с запятой в конце каждой строки и т.д.

Но тут мы обсуждали legacy Method Resolution Order и я начал понимать, что в python3 многое сохранили из-за обратной совместимости. Так что ладно, раз не смогли убрать, ну значит просто такой язык.

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

Что я обожаю в perl’e, так это переменные по умолчанию. Это как контекст в естественном языке. Зачем повторять то, о чем и так понятно что говорим. Вкупе с свободной формой, можно писать так:

split //g for @_;

Это означает, что в твоём примере, $_ избыточен. split и так работает с переменной по умолчанию. К тому же, он и так разбивает строку на атомы, зачем там /g? Можно сразу perl -ple '$_ = join "", reverse split //'

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

Есть такая идея что полезного/значимого кода очень мало

А я считаю что это прекрасно.

Инкапсуляция без скрытия и все эти конвенции на основе одинарных и двойных нижних подчеркиваний для обозначения области видимости.
m_value

/0

Вот для этого и нужен this/self.

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

Во-первых, пролюбить отступ сложнее, чем символ

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

можешь ошибиться и не там закрывающую скобку поставить?

Речь об этом не идёт. Когда ты пишешь код с нуля отступы или скобочки - без разницы. Проблемы начинаются когда код нужно двигать.

исправить неправильный отступ можно в одно нажатие

Нет нельзя, нужно вникать что должно быть на самом деле. С неправильными скобочками тоже, но см.п.1 (скобочки не теряются).

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

Опиши мне тип дикт в котором values будет list в котором будут лежать дикты, в которых values будут другие дикты (дерево) в котором листья будут списками строк.

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

вспомнил, вот с чем имел дело:

примерный код:


def main():
    ...
    for i in range(700):
        t = threading.Thread(target=func,
                             args=(arg,))

        t.daemon = True
        t.start()

def func(arg):
    ...
    if something:
        with open('log.txt', 'a') as log:
            log.write("error\n")
        os._exit(1)

без log.close() в log.txt появляется мусор, вроде нескольких записей error\n.

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

Можно же

Там суть была в другом, что переменные живут в отдельном неймспейсе, т.е. можно не парится на счёт того что имя переменной совпадёт со служебным словом или именем функции. В общем lisp-1 vs lisp-2. Я за lisp-2.

Вот if - нельзя

А вот в пыхе $if можно.

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

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

Во-первых ты слился это доказать.

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

Опиши мне тип дикт в котором values будет list в котором будут лежать дикты, в которых values будут другие дикты (дерево) в котором листья будут списками строк.

Перестань.

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

другие дикты (дерево) в котором листья будут списками строк.

Из твоей задачи выходит, что глубина дерева определяется в рантайме, как на такую структуру я задам статический тип? На том же TypeScript я пишут приложение с Redux где есть глобальный State всего приложения, это древавидная структура, она прекрасно описывается статической типизацией, но только там вся структура заранее известна.

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

Считаю, этим несчастным нужно помочь, создать новый ЯП definitely-not-a-python, который в точности python3, но со скобками.

golang же :)

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

Ты кто такой Вася? Залогинься для начала.

Какое дело имеет моя личность, к тому, что ты вякаешь?

Ты вчера говорил про 100500 костылей необходимых для правильной вставки. Я жду.

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

Какое дело имеет моя личность, к тому, что ты вякаешь?

Такое что требуешь доказательств. Я не собираюсь доказывать что-то безымянному васяну. Внезнапно да? А теперь давай-ка закатывай сюда доказательства, что ты попробовал мои примеры и у тебя всё работает. Скринкасты, или иди в жопу. Вася.

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

Такое что требуешь доказательств. Я не собираюсь доказывать что-то безымянному васяну. Внезнапно да?

Внезапно лоровец — балабол с завышенным чсв? Нет, я уже привык.

Такое что требуешь доказательств. Я не собираюсь доказывать что-то безымянному васяну. Внезнапно да?

Я без понятия что ты там проверял и куда добавить отступы. Посреди условия что-ли? Давай подробней, как воспроизвести.

Тебе что-то не ясно?

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

Вот для этого и нужен this/self.

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

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

За исключением перегрузки операторов и вообще ООП.

Ещё питономазахистам придётся страдать от отсутсвия GIL и наличия многопоточности. Отсутствия необходимости городить костыли и на каждом шагу прикручивать что-то через ffi они, наверняка, не переживут.

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

балабол

Нет ты.

Давай подробней, как воспроизвести.

Ты сначала воспроизведи, что уже написано. С пруфами, как ты любишь.

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

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

Два вопроса.

Как работается без исключений? В го вроде ошибки как в c возвращают через return. На c меня выводило из себя, что у разных функций тысяча разных вариантов сигнализации ошибки. Там 0, сям -1, ещё где-то INT_MAX.

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

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

Ну в нормальных языках поля классов обычно подсвечивают IDE

Ну так и в питоне IDE и будет подсвечивать. Но от ошибки это не спасёт. Поэтому лучше явный self.

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

Ты сначала воспроизведи, что уже написано. С пруфами, как ты любишь.

Сколько раз я должен написать «как?», чтобы ты перестал балаболить и таки сказал как?

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

Я жабокодер и когда-то давно, когда я начинал работать, меня приучили к префиксам - my для полей класса, our для статических полей. И я эту фигню нес еще пару лет после ухода из того места где мне это привили, а правда была в том, что в Java это не проблема. Никто никогда не допускал ошибок и опечаток от которых спасали бы эти префиксы, т.е. префиксная запись не несла ценности, а просто добавляла шум в именовании. Может быть это не случай python и this/self избавляет от частных ошибок. Я не кодировал ничего значимого на python, опыта у меня нет, я просто написал, что мне в питон не понравилось при первом взгляде. И наверное я не смогу поменять свою точку зрения пока не начну кодить на python.

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

Ага. Я эту структуру не знаю и дефакто я просто передаю ее дальше...

dem ★★
()

Зачем Python

Зачем тупые оффтоперы, у мамки своей спроси зачем ты появился на свет.
А Python не трожь, bitch

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

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

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

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

Она нужна, потому что когда-то может и имело смысл, сейчас никто не помнит зачем это было нужно, но это бэстпрактис и вообще энтерпрайзно. Ну или просто когда-то зачем-то решил, что так будет удобнее.

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

В Go ошибка — одно из возвращаемых значений определённого типа, всё в порядке.

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

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

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

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

Sublime отлично вставляет на тот же уровень

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

Чего угодно. Например, дженериков:

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

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

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

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

Чего там осиливать? Оно просто нинужно в том виде, что их пытаются протолкнуть.

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

Только в самых худших случаях придётся использовать пустой интерфейс с последующим кастом типа, либо разводить копипасту.

Аналог List<String> придумали, или можно в коллекции пихать всё подряд?

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

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

97% дженерики в java читаемые и помогают, просто всегда есть некоторый процент случаев когда это не так. Сложно и не очевидно может получится когда дженерики активно используется в иерархиях классов. Но в том же TypeScript еще более запутанная система типов и дженерики становится по мне так очень сложными, но видно нет пределов человеческому мозгу.

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

Потому что ты хотел чтобы вставилось.

Можно и бейцы дверью прищемить. Если ты не хотел чтоб вставилось - чего ты ноешь, что оно не вставилось...

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

Если ты не хотел чтоб вставилось - чего ты ноешь, что оно не вставилось...

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

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

Первая ссылка очень похоже. Только, по-моему, оно было на отдельном домене.

Ты уверен, что за несколько лет ничего не изменилось? Интересно бы сравнение старых версий посмореть. Я точно помню, что очень удивилися, ибо тогда считал, что Go относительно медленный, и из-за стрёмного синтаксиса даже не смотрел в его сторону.

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