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

Оба раза после циклов.

Пример? Так?

while a:
    do_b()
do_c() # потеряли отступ
anonymous ()
Ответ на: комментарий от WitcherGeralt

проверил сейчас — закрывает. Чшорт, вероятно мне это показалось, тысяча извинений.

Неясно только, зачем with срёт в пространство имён. Почему не создаёт переменную видимую лишь в блоке?

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

Опять же, вероятность что что-то случиться очень мала. Тебе надо в этом же скоупе как-то использовать именно str. Хотя то, что ничего не случиться сразу даже опасней потенциально.

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

Неясно только, зачем with срёт в пространство имён. Почему не создаёт переменную видимую лишь в блоке?

Емнип пространство имён в питоне огорожено функцией/классом.

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

переменную видимую лишь в блоке

в питоне такого не завезли

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

даже в таком гмне мамонта как С это завезли. В питоне это принципиально так сделано?

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

1) list - не функция.

2) в питоне функция - объект, как и все остальное, от других переменных, которые тоже указатели на какой-то объект ничем принципиально не отличается.

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

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

WitcherGeralt ★★ ()
Ответ на: комментарий от pawnhearts
  1. А что?
  2. Это понятно, но это не переменная. (в питоне мимокрокодил)
RazrFalcon ★★★★★ ()
Ответ на: комментарий от chinarulezz

В питоне это принципиально так сделано?

Вангую, что это важно для всей питоновой модели данных или как оно называется, чтобы locals() и globals() работали. Но вообще я некопенгаген.

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

Потому что в питоне нет блочной видимости.

Ну или не было. Я в какой-то момент перестал следить за 3.*, всё равно у меня на питоне одно легаси.

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

С другой стороны в питоне есть del, который переменную может удалить.

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

Так?

while a:
do_b()

Интерпретатор ошибку синтаксиса кинул?

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

А что?

Тип.

Это понятно, но это не переменная. (в питоне мимокрокодил)

А что это? Функция в python — это переменная содержащая объект функционального типа.

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

type. короче, класс.

почему не переменная то? в чем разница?

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

Нет, говорю же наоборот. Я из-за пары ветвлений в цикле потерял его границу, и в итоге в него попал лишний кусок кода.

Интерпретатор ошибку синтаксиса кинул?

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

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

type. короче, класс.

Разве в питоне можно указывать тип? А если нет, то это не класс, а конструктор класса. Я говорю о list() если что.

почему не переменная то? в чем разница?

Переменную можно менять. Это скорее константа, которых в питоне тоже нет. Или в питоне можно, например, менять список аргументов у переменной типа функция?

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

Странный подход для языка с repl. Я, наоборот, часто пишу в ipython и убедившись что это работает как надо, копирую в редактор.

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

потерял его границу, и в итоге в него попал лишний кусок кода.

Ага, понял, спасибо.

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

В питоне типизация динамическая, а не её отсутствие. Кстати, типы в Python — это тоже объекты.

Переменную можно менять. Это скорее константа.

Считай, что все переменные в Python — указатели на void.

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

list - класс, а list() - вызовет конструктор класса, да. ты можешь с классом манипулировать по всякому, методы ему менять и т.п.

менять список аргументов

вроде сам code-object immutable, но ты можешь новый code-object сконструировать на основе старого и запихнуть его в эту переменную типа функция.

еще у функции можно менять, например, docstring или просто какие-то атрибуты этому объекту добавить. и читать атрибуты вроде тех же аргументов или имен переменных внутри.

типичное использование - декораторы, они возвращают новую функцию, в которой берут __name__, __docstring__ и прочее от передаваемой им функции. но код делает что-то другое.

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

Я слишком давно на нём пишу, нет необходимости. В ipython недавно тестил разбор плохо документированой бинарщины (большая часть полей в little-endian, а несколько самых важных big-endian. лалки) с помощью struct, ещё могу потестить регулярки.

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

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

Стало интересно, попробовал вот такое

def foo(a):
    print(a)

c = foo.__code__

newc=types.CodeType(c.co_argcount+1, c.co_kwonlyargcount,
 c.co_nlocals, c.co_stacksize, c.co_flags, 
c.co_code, c.co_consts, c.co_names, 
c.co_varnames+('b',), c.co_filename, c.co_name, 
c.co_firstlineno, c.co_lnotab , c.co_freevars, c.co_cellvars)

foo.__code__ = newc

In [45]: foo(1)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-45-7d8d25071659> in <module>
----> 1 foo(1)

TypeError: foo() missing 1 required positional argument: 'b'

In [46]: foo?
Signature: foo(a, b)
Docstring: <no docstring>
File:      ~/<ipython-input-33-60116d01207b>
Type:      function


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

Вангую, что это важно для всей питоновой модели данных или как оно называется, чтобы locals() и globals() работали.

а в чем проблема, чтобы locals() в блоке, показывал переменные в блоке? В Perl с этим не проблема. В tcl не уверен. Вроде тоже.

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

Потому что в питоне нет блочной видимости.

и нету.

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

И не будет. Правда в 3-м питоне переменные из всяких list comprehensions вне их не видны.

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

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

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

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

WitcherGeralt ★★ ()

какова целевая сфера применения Python'а, каков его смысл, цель???

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

  1. Один из лучших для обучения: низкий порог вхождения, простой компактный синтаксис, минимум специальных символов и конструкций. Питон с самого начала приучает хорошо форматировать и структурировать код.
  2. Питон делает длинный код коротким: нет закрывающих скобок (меньше строк), встроенные ассоциативные массивы описываются парой символов (привет, java), удачная индексация и lists comprehension, позволяющие в 1 строку написать то, что в других языках требует 5.
  3. Питон делает сложные задачи простыми, благодаря богатой стандартной библиотеке и огромному репозиторию сторонних библиотек. Загрузить файл с инета, считать/отмасштабировать/записать картинку, разобрать или сгенерировать json/xml, регулярки, перекодировки текста, разбор/генерация бинарного пакета, сжатие/распаковка, подсчёт контрольных сумм — всё это и многое другое в питоне делается одной строкой.
  4. Прикладные задачи. Как следствие предыдущих пунктов, питон вытеснил почти все скриптовые языки, вроде perl-а. Почти любую прикладную задачу на питоне решить легче всего. Исключение — bash, но только для задач где нет логики, а нужно только запускать программы.
  5. Научные задачи хорошо решаются питоном благодаря хорошей базе научных библиотек (от numpy до sage).
  6. Кроссплатформенные приложения и гуй тоже пишутся хорошо, благодаря живым биндингам к любым либам.
  7. Простая встраиваемость делает питон удобным языком для расширений, когда не нужен sandbox. Плагины на питоне поддерживаются многими, от weechat-а и pidgin-а до gimp-а, openoffice-а и blender-а.

Питон вообще перспективный язык общего назначения. Если кто-то выбирает, с какого языка начать, то питон — один из лучших кандидатов.

Знание дополнительных языков лишь открывает новые возможности. Так знание С++ позволяет писать высокопроизводительный код на cython-е, комбинируя простоту питона и быстроту плюсов.

В принципе, на любом языке можно решать любые задачи. Даже на ассемблере или на Си можно писать веб-приложения (а веб-морда fossil демонстрирует, что это можно делать вполне успешно). Но питон относится к тем языкам, на которых почти любая задача решается неплохо, от консоли до веба.

Лучше зайти с другого конца — а какие задачи на питоне решаются плохо? Например:

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

что-то ещё?

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

Уже что-то. А := — не блочный, случаем? Было бы очень удобно в ифах юзать, не оставляя мусорных переменных, как в Go.

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

Ты хочешь удалить объект из самого себя? Так ссылка на него всё равно где-то останется.

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

Уже что-то. А := — не блочный, случаем? Было бы очень удобно в ифах юзать, не оставляя мусорных переменных, как в Go.

Это в принципе плохая идея. Переменная может быть нужна за пределами того блока, в котором впервые присвоена. Что-то вроде:

def ppp(x):
    if x < 0:
        y = x+1
    else:
        y = x*2-1
    print(y)
А если y «блочная» и видна только внутри if-а... то всё сломается.

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

Я сейчас ради забавы попробовал, у меня не вышло(через sys._getframe.f_locals). Потом погуглил, вот тут вроде получилось у чувака, возможно, другая версия питона.

https://stackoverflow.com/questions/34650744/modify-existing-variable-in-loca...

Но это жуткий хак и не нужно.

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

А можно в питоне перегрузку операторов делать?

Перепиши у объекта методы __enter__ и __exit__.

Ну, чтоб нормальный with замутить, с удалением переменной.

У методов __enter__ и __exit__ будут свои неймспейсы. Можно через сильное колдунство влезть в неймспейс вызывающего, но хз откуда потом узнать, какие именно переменные оттуда удалять и что из этого получится. Короче нинужно.

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

С функцией же можно:

def kill_self(exit_msg = 'killed'):
    global kill_self
    del kill_self
    return exit_msg
chinarulezz ★★★★★ ()
Ответ на: комментарий от anonymous

Узнать имя переменной можно найдя ее в словаре locals того фрейма по значению. Значение ты ее знаешь, потому что ты же ее и создал в своем contextmanager`е. Но вод изменять этот словарь locals у меня не получилось. Впрочем, даже в документации написано так не делать.

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

Один из лучших для обучения

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

Кроссплатформенные приложения и гуй

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

Простая встраиваемость

Лучше луа, питон жирноват и обычно оверкилл.

Исключая перспективность, в остальном крайне согласен, особенно с пунктами 2, 4 и жизненными замечаниями про жабку и баш.

Но ты не сказал главного. Когда производительность и надёжность важнее скорости разработки, питон вне игры. Тут в дело вступает Go или что-то посерьёзней.

WitcherGeralt ★★ ()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от pawnhearts
def do():
    a = open('/etc/hosts')
    b = a
    with b as c:
        d = 42

Что из этого надо удалять и как это определить через фрейм?

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

Операторы перегружаются методами объекта, доступа к внешнему scope просто нет, даже если бы метод мог как-то узнать имя переменной.

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

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

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

при виде нормального языка

Такие бывают?

производительность и надёжность
Go

/0

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

доступа к внешнему scope просто нет

inspect.currentframe().f_back.f_locals

Было бы желание, а там и какой-нибудь /proc/self/mem откроешь.

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