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'а, каков его смысл, цель???

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

Хором говорят, что не нужен. Но никто так ни разу и не аргументировал.

Сказали же, есть if-elif-else. Делает тоже самое, но не стреляет в ногу брейком.

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

Нет, switch и if имеют совершенно разные юзкейсы, только питонисты не видят очевидного. Конечно сишный switch такое себе, но можно и более продвинутое сопоставление с образцом запилить, как в руби например.

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

switch-case - его нет

Что тебе даёт switch-case, чего нет в if-elif-else? Кроме геморроя с брейками.

многопроцессность != многопоточность.

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

наследование и переопределение для слабаков

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

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

Нет, switch и if имеют совершенно разные юзкейсы, только питонисты не видят очевидного.

Аргументация будет или что? Я не умею в руби.

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

Нет, switch и if имеют совершенно разные юзкейсы

Ну тогда есть еще варианты с dictionary вроде:

def case_a(x):
    print "This is a case"
    return 1


def switch(x):
    default = 100
    return {
        'a': case_a(x),
        'b': 2,
    }.get(x, default)


print switch('a'), switch('z')
alx777 ()
Ответ на: комментарий от Ford_Focus

нужен switch-case - его нет

switch-case считается плохой практикой, способствующей ошибкам — пропущеный break легко не заметить. При этом обычная пачка if-ов, даже без else, этой проблемы не имеет, потому что все условия выписаны явно. Если же switch-case вводить в язык без break-а, то он вообще ничем не будет отличаться от if-elif-else.

Если очень хочется, его можно сделать. Но можно хотя бы отдалённо реальный пример, когда switch-case лучше чем if-elif?

многопроцессность != многопоточность.

Многопоточность нужна зачем? Для параллельных вычислений? Параллельные вычисления в питоне есть и делаются легко: последовательный алгоритм превращается в параллельный парой строк. Стандартная библиотека позволяет даже распараллелить вычисления по сети.

наследование и переопределение для слабаков

Не помогает для приватных переменных же, ну!

type hints - не типизация
примеры нормальной реализации инкапсуляции и полиморфизма есть даже на wiki
cоглашение это не модификатор доступа.

Прекратите придираться к словам. А в питоне есть множественное присваивание, распаковка аргументов, lists comprehension и фиг знает что ещё. Ну. И. Что?

Вы, что, выбираете язык, в котором больше страшных слов? А не язык, на котором удобнее решать задачи? Так почему же вы меряетесь страшными словами, а не задачами?

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

Ну тогда есть еще варианты с dictionary вроде:

Варианты с dictionary называются lookup table и имеют своё применение и в других языках. А в примере таки говнокод.

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

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

Как это? Можно пример? Скажем, в коде, без self:

class A:
    ...
    def f(x):
        ...
        a = x+1
        ...
что мы только что присвоили — self.a или локальную переменную a?

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

Вообще-то, это читерство.

Ничего читерского. Мне лень реальные либы искать, питоноскрипт тоже какие-то там свои либы использовал.

Простой структурный код на питоне, и асинхронные вызовы с map-ами и лямбдами на js.

На пистоне тоже, внезапно, лямбды с мапами. Чем тебе там мешают асинхронные вызовы, если их засунули за await? У тебя вкусовщина короче.

Таки да, написанный по-быстрому код на питоне получился как минимум не хуже (даже ещё недописанного) кода на js.

Да ты что.

Что и требовалось доказать.

Кому это требовалось? Я сразу сказал, что на чём угодно другом будет примерно тоже самое. Это ты что-то начал про примеры.

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

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

А что бы написать

a,b,c,d,e,f,g,h,j,k,l,i,u,y,t,e = 1,2,3,5,76,7,3,5,2,4,5,6,3,1,1,2,2
Вообще стараться не надо. И так само выйдет.

В целом, да, из-за его синтаксиса и стиля. И эта «вера» подтверждается примерами.

Да, понятно уже все и с синтаксисом с со стилем. Сделали отступы, чтобы было понятно, сделали множественное наследование, чтобы было просто и не понятно.

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

Я не понял, ты выясняешь что круче топор или пила?

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

Что тебе даёт switch-case, чего нет в if-elif-else? Кроме геморроя с брейками.

В приличных языках break нет.

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

Динамическая типизация нужна чтобы получать боллее компактный код. Так?

Нет, конечно. Динамическая типизация - результат непонимания и/или невежества.

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

Это уже 4 переменные. То есть против того, что одна переменная лучше десятка возражений нет?

Не знаю. Это тебя надо спрашивать. Лично я предпочитаю не использовать переменные по нескольким назначениям (даже одного типа) без очень веских на то причин.

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

Динамическая типизация - результат непонимания и/или невежества.

Но как решать задачи, где нет чётких входных или выходных структур без ДТ? Велосипедить ДТ на Map?

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

В приличных языках break нет.

В приличных языках и switch-case нет, но вопрос стоял подругому.

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

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

для этого есть repl, что гораздо удобнее

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

RPerl замечательный проект, но ты что-то глупое сморозил.

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

Варианты с dictionary называются lookup table и имеют своё применение и в других языках

Ну так значительная часть switch/case юзкейсов в С что я видел lookup table и реализуют

А в примере таки говнокод

Согласен, выше уже писали что «switch-case считается плохой практикой»

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

В приличных языках и switch-case нет, но вопрос стоял подругому.

Из контекста очевидно, что вопрос был в обощенном операторе выбора из нескольких вариантов (обязательное наличие идиосинкразий Си не требовалось). Этот оператор был обозначен как switch-case только потому, что всем понятно, о чем речь.

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

Ну и питон старше всего тобой перечисленного

шштоааа? Питон старше чевоаааа? Старше си, паскаля, ады и фортрана? Твои представления о старшинстве специфичны. «Больной обгвидок...» (с)

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

Но как решать задачи, где нет чётких входных или выходных структур без ДТ?

Задачи, где нет четких входных и выходных структур, лучше не решать, пока они не прояснятся.

Велосипедить ДТ на Map?

Если твои входные и выходные структуры - это Map, то используй Map, в чем проблема? В остальном, никто не мешает сделать в статически типизированном языке аналог opDispatch.

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

в чем проблема?

Ну муторно же. Будешь сидеть это всё описывать вместо того, чтобы программировать. А потом переписывать. Хотя все равно на ДТ надо валидацию как-то делать.

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

1. Множественное наследование.

Полезная возможность.

2. Однострочные лямбды

А вот тут у них недоделка.

Остальное — вкусовщина.

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

До 10000-ного знака?

зачем тебе это? ты же никак не сможешь это использовать

а, вообще, для этого есть:

package require math::bigfloat
math::bigfloat::tostr [math::bigfloat::pi 10000]
anonymous ()
Ответ на: комментарий от tailgunner

Вопрос был поставлен русским по лору, ты на него не ответил. Что за контекст ты нарисовал себе в голове и почему он не даёт тебе ответить на поставленный вопрос — никому не очевидно. Для внешнего наблюдателя твоё поведение выглядит как юление жопой.

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

Это вообще не аргумент. Циклы тоже не нужны если есть goto по твоей дебильной логике. И goto не стреляет в ногу брейком.

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

как ни странно о докере большинство разработчиков не знают либо наслышаны. я более приземленный пример приводил для адептов линупса. тем более пакетный менегер - это ключевая вещь для любого дистрибутива, которые по сути отличаются лишь набором пакетных менеджеров и средой для рабочего стола. у go я так и не понял есть ли нормальные треды (вроде нет), а значит он не годится, например, для создания сервисов по конвертации изображений/музыки либо выдирания звуковой дорожки из видео на ютубе. а в питоне есть тредпулэкзекутор. мало того тот же aiohttp его использует для cpu bound операций типа сжатия. но для линуксовых утилит это не принципиально им хватит и одного ядра. да он и не призван вытеснить тот же python или сделать ненужными C/C++. по мне это убийца прожорливой java.

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

В Go, например, свитч работает от обратного, там не нужны брейки, но нужен fallthrough. Так что реализовать можно по-разному. Мне больше нравится классический вариант.

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

Всё программирование можно объявить плохой практикой, ибо легко ошибиться.

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

В смысле? Гвидо сделал в питоне динамическую типизацию просто потому, что был тупой?

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

пропущеный break легко не заметить

И тут я понял, зачем в питоне выкинули скобочки... Дети часто пропускали и не замечали.

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

Чем паскаль лучше си в обучении?

начинается «Дискотека 80-х» , блин!

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

адепты статической типизации забывают про динамический lisp, который старше c на на 15 лет. первым программистам на первом уже больше 80 лет!

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

Что тебе даёт switch-case, чего нет в if-elif-else? Кроме геморроя с брейками.

В Go, например, свитч работает от обратного, там не нужны брейки, но нужен fallthrough.

Зачем ты отвечаешь на уточнение вместо вопроса?

Кто-нибудь из питонохейтеров мне скажет, что даёт switch-case, чего нет в if-elif-else?

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

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

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

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

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

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

Это вообще не аргумент. Циклы тоже не нужны если есть goto по твоей дебильной логике. И goto не стреляет в ногу брейком.

Циклы нужны, чтобы не писать запутаную лапшу. Зачем нужен switch-case не один из вас ответить не осилил. Моя логика — дебильная, ага.

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

Ответ же очевиден.

Очевидно, что мне и куче питонистов во главе с гвидо это неочевидно. Давай примеры.

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

В плюсах приватные поля «недоступны», потому что мы договорились

Советую изучить азы языка, прежде чем такой бред писать.

И что за паттерн такой?

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

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

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

И на нём уже написали ядро операционки.

На JS тоже. И?

родным асинхронном

В го есть async/await?

без ограничений в многопоточности

И с гонками данных.

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

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

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

В го есть async/await?

Зачем нужны async/await, если есть сопрограммы?

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

А что у питонистов какое-то своё определение?

Нет, просто из твоих слов следует, что у тебя есть какое-то своё определение.

anonymous ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)