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

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

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

Нефик туда вообще лезть.

Среди этой кучи типов теряется сам код, фактические действия, которые он выполняет.

Где это вы такой код видели? В большинстве современных языков со строгой типизацией есть вывод типов, поэтому 4.2

RazrFalcon ★★★★★ ()
Ответ на: а что насчёт benchmarks ? от Edward_I

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

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

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

Это бенчи вычислительной производительности. Они не оценивают ни удобство языка, ни простоту решения, ни наличие библиотек, только вычислительную скорость. Для веба это не важно. Веб редко оптимизируют по вычислительной скорости.

Но почему бы и нет... Давайте посмотрим бенчи. Где у нас питон больше всего тормозит? n-body? Скачиваем несколько тестов на разных языках и запускаем на своей машине:

$ time ./nbody-go-3 5000000              -- 5,158s
$ time php nbody-php-3.php 5000000       -- 42,105s
$ time python nbody-python3-2.py 5000000 -- 163,714s

Всё сходится, питон втрое отстаёт от php и почти на два порядка от Go.

Но теперь мы применим особую питоновую магию!

$ time pypy nbody-python3-2.py 5000000   -- 5,634s

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

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

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

А ведь можно пойти дальше, расставить типы, пройтись cython-ом, и получить код, по скорости равный от сишному.

Да ты же гуру оптимизации хеловордов!

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

В большинстве современных языков со строгой типизацией есть вывод типов

В каком из них не надо писать какой-нибудь auto или var?

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

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

Нет, это то самое, что превращает средненький язык в убогонький недоязычок. И дело тут не во вкусовщине. Это фундаментальная «фича», порождающая целый букет проблем. Хотя для одноразовых задач как то: пример в учебнике, лаба, расчетная программка о сотне строк, такой синтасис уместен.

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

проще сразу писать хорошую архитектуру

На языке с динамической типизацией? Лул.

RazrFalcon ★★★★★ ()
Ответ на: а что насчёт benchmarks ? от Edward_I

Но php не ооп язык ни разу. Это процедурный язык в который добавили сбоку классы со второй попытки, если не с третьей. При этом сами классы уже объектом не являются, как и все остальное. Метаклассов тоже нет. Что-то сложнее примеров собачка->гав придется делать кодогенерацией.

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

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

ЛОЛ.

Я продемонстрирую.

Вот, читаю я те бенчмарки, и стало мне интересно, как именно в pidigits считаются эти цифры числа пи?

Открываем исходник на Go. Код, вроде, неплохой, разбит на функции, осмысленные названия... Минут пять прыгаем глазами из одной функции в другую, пытаясь удержать в голове, какая функция какие глобальные (!) переменные меняет... Фух... надоело. Глянем другой язык.

В коде на питоне всё ещё хуже. Пол сотни строк сплошного кода, куча однобуквенных переменных... Похоже, код скопипастили с Си...

Это никуда не годится, на питоне так не пишут. Засовываем весь код в функцию, заменяем всякие «add» и «mul» на «+» и «*», выкидываем промежуточные переменные — на питоне они не нужны, т.к. есть множественное присваивание. И код превращается...

import sys, gmpy2

def getpi(N):
    n1, n2, d, k, i, result = gmpy2.mpz(4), gmpy2.mpz(3), gmpy2.mpz(1), 1, 0, []

    while i < N:
        c = n1//d
        if c == n2//d:
            result.append(chr(48+c))
            i += 1
            if i % 10 == 0:
                result.append("\t:%d\n" % i)

            n1, n2 = (n1%d)*10, (n2%d)*10
        else:
            n1, n2, d, k = n1*(k*2-1)+(n2<<1), n1*(k-1)+n2*(k+2), d*(k*2+1), k+1

    if i % 10 != 0:
        result.append( "%s\t:%d\n" % (' '*(10-(i%10)), N) )

    return "".join(result)

if __name__ == "__main__":
    sys.stdout.write(getpi(int(sys.argv[1])))

Это просто преобразование кода. Я всё ещё не знаю, что значат все эти однобуквенные переменные. Но уже прорисовывается общий алгоритм: есть две переменные n1 и n2, и их делитель d (какие-то дроби?). Они как-то итеративно меняются, и k, очевидно, счётчик этих итераций. А когда их целые части равны (n1/d==n2/d) — из них достаётся очередная цифра.

Вот! Переписывание кода в python-style делает его понятнее!

Причём этот код по скорости не уступает оригиналу, да и чего б он уступал, всю работу выполняет libgmp, не важно из какого языка она вызывается.

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

модификаторов доступа нет

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

статической типизации (даже намёков на неё) нет

https://docs.python.org/3/library/typing.html во втором питоне типы аргументов и возвращаемых значений описывались в docstring и ide это понимают

многомерные массивы объявляются очень странно

ты про numpy.array или что? что с ним странного? а списки - не массивы.

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

Да всем. На алхимии можно практически любой запрос описать. Включая поддержку дб-специфических штук https://docs.sqlalchemy.org/en/latest/dialects/postgresql.html

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

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

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

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

Среди этой кучи типов теряется сам код, фактические действия, которые он выполняет.

Где это вы такой код видели?

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

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

Нефик туда вообще лезть.

Нужен пример? Допустим, есть либа-интерфейс, она сама поддерживает соединение с указанным сервером, сохраняет внутри все параметры и состояние, восстанавливает соединение при перезапуске сервера, ну и даёт API к серверу. Всё хорошо. Теперь мне в приложении надо переключить её на другой сервер. Для этого надо бы всего лишь поправить в ней (приватное) поле host и оборвать соединение (грубо говоря, close() на приватном сокете), и остальное либа сделает сама. Увы, публичных методов для этого нет.

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

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

Нужен пример? Допустим...

Нет. Просто нет. Шлите пулреквест. Не нужно ломать абстракции.

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

Нет. Просто нет. Шлите пулреквест. Не нужно ломать абстракции.

А, нет, конечно, правильнее всего — попросить автора добавить этот мелкий метод, или самим написать патч, если код открыт.

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

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

Всё познаётся в сравнении. И в сравнении с другими языками эти соглашения в питоне принципиально не отличаются от соглашений в других языках.

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

И в сравнении с другими языками эти соглашения в питоне принципиально не отличаются от соглашений в других языках.

Только в c++/rust, приватные поля недоступны. Это гарантия компилятора.

PS: для педантов: да, это тоже можно обойти костылями. Но это ссзб и никто так не делает.

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

Только в c++/rust, приватные поля недоступны. Это гарантия компилятора.

PS: для педантов: да, это тоже можно обойти костылями. Но это ссзб и никто так не делает.

Ну да, я это и имею ввиду. Это не гарантия, а договорённость. В плюсах приватные поля «недоступны», потому что мы договорились, что не будем использовать паттерн «паблик морозов» (интересно, у него есть официальное название?)

Точно так же мы в питоне можем договориться, что приватные поля «недоступны», потому что мы не будем за пределами класса обращаться к полям, начинающимся со знака подчёркивания. Это такая же договорённость.

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

Одна из причин существования динамической типизации.

Перечитай это еще раз и подумай, что за херню ты сказал.

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

А разве это плохо?

Ну да, действительно, ничего плохого. Можно сделать i,a,b,с и гонять через них вообще всё, иногда меняя между собой. Сначала a будет какой-нибудь константой, потом в неё сложим выхлоп какой-нибудь функции, потом посчитаем туда b+c. А i сперва будет переменной счётчика, потом вычисляемым индексом, а под конец мы запишем в неё возвращаемый результат. Всё норм.

А ещё питон не даёт записывать длинный код в одну строку, это сразу заставляет его структурировать
не даёт

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

raw = r'''{"assetTypes":["Microsoft.VisualStudio.Services.Icons.Default","Microsoft.VisualStudio.Services.Icons.Branding","Microsoft.VisualStudio.Services.Icons.Small"],"filters":[{"criteria":[{"filterType":8,"value":"Microsoft.VisualStudio.Code"},{"filterType":10,"value":"target:\"Microsoft.VisualStudio.Code\" "},{"filterType":12,"value":"37888"}],"direction":2,"pageSize":54,"pageNumber":1,"sortBy":4,"sortOrder":0,"pagingToken":null}],"flags":870}'''

не даёт.

Мне интересно, автор просто поленился сделать структуру удобоваримой или правда «не даёт»?

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

Он так же «не плох», как и любая другая скриптота.

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

Сейчас напишу, потерпи еще немного.

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

Я хочу чтоб мой код выглядел как хочу я, а не какой то сраный astyle

Возьми да отформатируй как тебе надо. Это же твой код.

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

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

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

Пфф. В питоне скоп глобальных переменных ограничен *.py-файлом. В джаве аттрибуты видны всему *.java-файлу. Разницы ноль

Да. Глобальные переменные и поля класса. Разницы ноль.

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

Нет не может.

Хреновая у тебя IDE. Это даже gedit и sublimetext может.

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

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

Либо у тебя соображалки не хватает алгоритм осилить. Когда ты примеры приведёшь, в которые «потыкать» можно, тогда я тебе расскажу алгоритм, как этот код из буфера обмена легко вставить в нужное место, чтобы он, как ты выражаешься «валидным стал» либо сразу, либо, если это ситуация из серии «ты скобочку скопипастить забыл», это легко исправлялось. И это будет нагляднее и удобнее поиска твоей «скобочки».

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

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

«Я копипастобезьяна с ДЦП. Я непойми что непойми куда копипастю с погрешностью в несколько символов. А виноват плохой ЯП, конечно.»

FTFY

Т.е. тут нельзя скопипастить, отредактировать и автовыровнять. Нет ты скопипасть, сначала выровняй

Ага. Совсем нельзя. Собственно, понятно: ты из тех, кто «книгу не читал, но мнение имею». Иди учи матчасть.

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

Раст общесистемный язык, го вебпараша уровня питона. Тебе хватает питона? Хватит и го. Легко выяснить. Язык с гц? Он параша.

anonymous ()

Python в первой тройке языков по популярности. Правда это хайп, свазанный с Big Data, Data Mining, Machine Learning... Хз что сейчас форсят умолишенные. Я на Python пишу с 2008. Ну как-то без придурков этих нормально жилось. Улетучилась илитарность. R для математики не годится. NumPy сейчас у датасосаентистов в тренде. В моей конторе куча сайтов и сервисов на Python. А про какие-нить «скрипты» для иксов... Де факто Python второй после C в любом дистрибутиве Linux.

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

Чел утверждал, что в джаве нет «глобальных переменных» как в питоне

Где я такое утверждал, процитируй.

crutch_master ★★★★★ ()
Ответ на: комментарий от pynonymous
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))'

И кто-то тут еще будет говорить, что питон _не даёт_ писать нечитаемый код?

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

Потому что это - код на питоне? Вера за гранью религиозного фанатизма.

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

ещё питон не даёт записывать длинный код в одну строку

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

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

Твой браузер на расте написан. Тебе мало?

пакетный менегер на go (yay) и куча других интересных утилит для консоли

я и говорю, уровня питона. Он лучше pakku? Быстрее, без ошибок?

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

Преимущества перед pikaur? Который я скорее выберу поскольку он на нормальном питоне написан.

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

альтернативу

На, держи

#!/usr/bin/node

var http = require("some_http_lib");
var argparser = require("some_argparesr_lib");

var payload = {"assetTypes":["Microsoft.VisualStudio.Services.Icons.Default","Microsoft.VisualStudio.Services.Icons.Branding","Microsoft.VisualStudio.Services.Icons.Small"],"filters":[{"criteria":[{"filterType":8,"value":"Microsoft.VisualStudio.Code"},{"filterType":10,"value":"target:\"Microsoft.VisualStudio.Code\" "},{"filterType":12,"value":"37888"}],"direction":2,"pageSize":54,"pageNumber":1,"sortBy":4,"sortOrder":0,"pagingToken":null}],"flags":870};
var url = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery";
var headers = {'Accept': 'application/json;api-version=5.1-preview.1;excludeUrls=true'}

var pages = argparser.get("-n","number") || 1;
for (var i = 0; i < pages; i++) {
    payload.pages = i;
    var res = await http.post({
        url : url, 
        payload : payload,
        headers : headers});
    let extensions = [];
    res.results[0].extensions.forEach((ext) => {
        let name = [ext.publisher.publisherName, ext.extensionName].join(".");
        extensions.push(name);
        });
    var cmd = 'code ' + extensions.map((v)=>{return "--install-extension "+v})
                                  .join(' ');
    console.log(cmd);
}
Жду отмазок.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от pynonymous
n1, n2, d, k = n1*(k*2-1)+(n2<<1), n1*(k-1)+n2*(k+2), d*(k*2+1), k+1

Что там говорите? Питон не даёт писать код в одну строчку? Принудительное форматирование? Вот «фича», которая даёт. Куча переменных в одну строчку.

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

го вебпараша уровня питон

Ты либо толсто вбрасываешь, либо дурак. При том, что их ниши сильно пересекаются, как я выше уже сказал, о сопоставимых вещах тут и речи нет. Go — высокопроизводительный компилируемый язык со статической типизацией, родным асинхронном и без ограничений в многопоточности, как у Python. И на нём уже написали ядро операционки. По фану и исключительно как proof of concept, но тем не менее.

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

А что, разве они есть? Даже если бы ты это утверждал, ты был бы формально прав.

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

Да чего там пакетный менеджер. Ключевая вещь для современных серверов — Docker — написана на Go. Поди найди что-то более «системное».

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

есть соглашение

Соглашение это не модификатор доступа.

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

Через рефлексию. Мы знаем про тернистый python-way, не считающийся со временем выполнения, но в более адекватных языках это делается иначе - можно ведь просто пронаследовать класс с добавлением нужных методов.

https://docs.python.org/3/library/typing.html во втором питоне типы аргументов и возвращаемых значений описывались в docstring и ide это понимают

type hints - не типизация, и речь не об ide.

а то так можно сказать, что и в js есть типизация - ide же понимает.

ты про numpy.array или что? что с ним странного? а списки - не массивы.

ради элементарной базовой вещи тащить немалую стороннюю либу - это и есть что-то странное и хорошо поясняет за «батарейки» бидона

можно не тащить, но тогда пойдёт лесом «читаемость»

Да всем

например?

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

универсальный if-elif-else

goto еще универсальнее. нужен switch-case - его нет

неплохой многопоток через Pool.map

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

Пример кода, пожалуйста!

примеры нормальной реализации инкапсуляции и полиморфизма есть даже на wiki

лезть через интроспекцию

python-way, наследование и переопределение для слабаков

А зачем мне при чтении кода лицезреть их в каждой строке по несколько штук?

зачем их писать в каждой строке по несколько штук, ты о чём?

Ford_Focus ★★★★★ ()
Последнее исправление: Ford_Focus (всего исправлений: 1)
Ответ на: комментарий от pynonymous
perl -MMath::Prime::Util=primes -E'say for @{primes 1e7}'

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

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

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

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

нужен switch-case

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

WitcherGeralt ★★ ()

Про «универсальность технологии -> сокращение расходов» уже сказали в этом треде?

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

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

И при чём тут использование одной переменной для всего? Одной переменной, понимаешь? Сперва используем i как счётчик цикла, потом как складываем в него строковое значение, потом передаём его в функцию и записываем то, что из неё получаем, потом ... . Компактность кода не пострадает, если там будет i, str и ret.

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

универсальность технологии -> сокращение расходов

2.7 -> 3.4 -> ...
И вообще, хочешь универсальности, делай api а не говнокод на очередном пистоне.

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

perl -MMath::Prime::Util=primes -E'say for @{primes 1e7}'

Так я тоже могу:

python -c 'import sympy; print(list(sympy.primerange(0,1e7)))'

А слабо переписать на перле тот алгоритм?

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

Это понятно.

Тот код был написан к тому, что не нужно пугать питонистов однострочниками на перле. На питоне тоже можно писать длинные нечитаемые однострочники. И, да, на практике это не нужно, разве что для развлечения, или чтобы пофлудить на форуме. 🙂

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

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

Это самая выбешивающая черта питонолюбов. Это и в книгах у них педалируется: не верь глазам, читатель, это не черезжопный дизайн, это философия такая. Любым косякам находится идеологическое оправдание.

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

А слабо переписать на перле тот алгоритм?

Я не знаю какой у тебя алгоритм, но маловероятно что я не смогу переписать его на Perl'е.

И, да, на практике это не нужно, разве что для развлечения, или чтобы пофлудить на форуме.

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

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

Ну да, действительно, ничего плохого. Можно сделать i,a,b,с и гонять через них вообще всё, иногда меняя между собой...

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

raw = r"'..."'
Мне интересно, автор просто поленился сделать структуру удобоваримой или правда «не даёт»?

«не даёт записывать длинный код в одну строку». Читайте предложение целиком, а не только два слова в середине. Процитированный кусок — это не код, это строка, которую автор вообще не писал, а скопипастил из дампа запросов в браузере.

Тот код был написан на скорую руку — открыли страницу в браузере, сдампили запрос, скопипастили в строку, в цикле поправили одно поле, отправили запрос, запомнили ответ. И даже не смотря на эту наколенность код получился довольно понятным.

На, держи
...
var http = require(«some_http_lib»);
var argparser = require(«some_argparesr_lib»);
...

Вообще-то, это читерство. Таким методом и код на питоне можно сократить до:

import somelib
print(somelib.get_command_to_install_all_extensions())
По хорошему там должны быть реальные модули.

Но допустим, что там были настоящие библиотеки. Что мы получили в итоге? Два десятка строк и там и там. Простой структурный код на питоне, и асинхронные вызовы с map-ами и лямбдами на js.

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

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

И кто-то тут еще будет говорить, что питон _не даёт_ писать нечитаемый код?

Нет, кто-то будет говорить:

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

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

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

Потому что это - код на питоне? Вера за гранью религиозного фанатизма.

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

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

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

В питоне много всего можно делать с self помимо получения его полей.

Да, но все это многое требуется редко, зато внутри класса все вызовы приходится прогонять через self, что есть адская цена за эту фичу. Хотя можно было оставить явный self, но сделать нормальные области видимости: внутри класса обращаться к методам напрямую, а импортируемые сущности юзать только через префикс. Но в питоне ровно наоборот, потому что механизм импорта не увязывается с ООП на классах. В общем питон неплохой процедурный язык (точнее процедурно-объектный), но традиционные механизмы ООП в нем ужасно коряво сделаны.

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