Comments 98
Читать PEP-8, быстро!
А отстутствие отступов в примерах сразу после заявлений о важности отступов — это пять. Пост хоть кто-нибудь вычитывал перед публикацией?
Это некая концептуальная проблема для меня, я ставил Питон, поигрался и бросил не найдя применения.
Можете привести примеры того, что легко-быстро-удобно делается на Питоне и тяжело и громоздко на Си?
легко-быстро-удобно делается на Питоне
Абсолютно всё.
тяжело и громоздко на Си
Абсолютно всё.
Ручное управление памятью, постоянные выходы за пределы массива и соответствующие сегфолты, утечки памяти, наоборот double free, возня с указателями, забываемые проверки на null, #define true false — вы серьёзно считаете это всё удобным?
Для «низкоуровневых» задач с недавних пор есть Rust, так что C/C++ теперь не подходят вообще ни для чего, кроме поддержки старого кода.)
Можно странный вопрос? Я знаю, что Раст популярный ЯП, но… зачем он нужен если есть Си/С++ на котором можно написать всё?
Это некая концептуальная проблема для меня, я ставил Раст, поигрался и бросил не найдя применения.
Можете привести примеры того, что легко-быстро-удобно делается на Расте и тяжело и громоздко на Си?
Ответите?
>Ручное управление памятью, постоянные выходы за пределы массива и соответствующие сегфолты, утечки памяти, наоборот double free, возня с указателями, забываемые проверки на null, #define true false — вы серьёзно считаете это всё удобным?
И даже что-то из указанного вами ниже списка есть, но как непрофессионал от точного перечисления воздержусь. (Если спецы по Rust мимо пробегать будут, это пусть они расскажут)
А вообще пост не про Си и не про Rust так-то, а мы тут оффтопим.)
Лучше вы расскажите, как вам Heartbleed и ошибки в SMB?
Вот тут я не понял при чем тут старая проблема связаная с отсутствием необходимой проверки границ
При том, что такие ошибки в C/C++ — обычное дело (блог PVS-Studio читаете?), и известная ошибка в SMB, найденная в 2017-м, была вовсе не в Python-коде.
На RAST пишется все без ошибок и работает безукоризненно?
Да. Если точнее, то в unsafe-коде накосячить таки можно, но его очень-очень мало, unsafe-код достаточно один раз тщательно проверить и вычитать, а весь остальной код будет автоматически безопасным. Многие программы можно написать вообще без unsafe-кода. В то время как в C/C++ весь код автоматически unsafe, и даже дисциплина не всегда помогает, и от подобных ошибок спасёт разве что PVS-Studio за много тысяч денег.
Rast уже заменил C/C++
Я такого не говорил. Rust в ближайшие десятки лет точно не заменит C/C++, потому что есть куча проектов, которые уже написаны на C/C++ и которые никто в здравом уме не будет переписывать на Rust. И да, в этих проектах постоянно находят ошибки, которые на Rust невозможны — список CVE в ядре Linux, думаю, сами нагуглите.
А как трактовать фразу что для низкоуровневых задач есть Rust и C/C++ уже ни для чего не проходят?
Если для вас это то же самое, что «уже заменил», то мне остаётся только посочувствовать вашей логике. То, что для низкоуровневых задач есть Rust, никак не отменяет того, что в том же линуксе бежать срочно заменять Си на Rust никто в здравом уме не будет.
вот например
Уязвимости в ядре и стандартной библиотеке возможны у любого языка программирования, так как где-то там внизу неизбежно есть unsafe-слой, без которого сделать что-либо просто невозможно. Тем не менее, баги и уязвимости в стандартной библиотеке выловят и исправят один раз, и всё на их базе будет безопасным, а в этих ваших C/C++ каждый проект нужно проверять индивидуально (сколько раз мне ещё про блог PVS-Studio нужно напомнить?). Так что это ваше «вот например» неуместно.
топить бездумно за Rust, указывая на ошибки кода, написанного на том же C++, это глупо.
Ошибки в коде почти каждого C++ проекта — вот что на самом деле глупо. Ошибки в стандартной библиотеке Rust найдут и исправят, а PVS-Studio на каждый существующий C++ проект никто накатывать не будет.
Точнее поговорит уже новое поколение программистов
Это новое поколение должно откуда-то взяться, поэтому говорить про Rust нужно уже сейчас. Чем я и занимаюсь. Мой опыт не имеет значения: есть много куда более опытных C++ программистов, переходящих на Rust и вполне довольных; думаю, без проблем нагуглите их блоги, если захотите. (Неосиляторы, которым не понравился спасающий от ошибок borrow checker, к сожалению, тоже есть и тоже гуглятся.)
проблемах других языков, о которых вы знаете, судя по всему, из блога PVS-Studio и больше никак
Этого более чем достаточно, чтобы всячески избегать C/C++. Я, по-вашему, должен закрывать глаза на лёгкую возможность допустить уязвимость по невнимательности? И вы, видимо, закрываете? Или вы надеетесь, что, имея 20 лет опыта, никогда не допустите мелкую опечатку по невнимательности, которая однажды случайно приведёт к CVE? Так тот же блог PVS-Studio наглядно демонстрирует, что это так не работает.
Хотите топить за Rust, так нет проблем, берете проблемный код на плюсах и показываете как круто переписать его на Rust.
На Хабре есть целый хаб про Rust — в том числе с переводами постов от Mozilla, которые переписывают Firefox на Rust и радуются, как всё прекрасно. Вперёд. Всё уже написано до меня. Я лишь напоминаю о существовании языка.
Редко получается проект без ошибок.
И на Rust логические ошибки или ошибки в unsafe-коде никто не отменял, да. Но вероятность допустить ошибку на Rust намного меньше, чем в том же C/C++. Раз вы уже взглянули на Rust, думаю, у меня нет необходимости читать лекции о том, как Rust защищает от ошибок. Опять же, есть хаб на Хабре, где всё уже рассказано до меня.
К сожалению, вы правы. Уверен, со временем Rust повзрослеет и будет без проблем работать на любой микроволновке. Тем не менее, на тех же x86, arm и mips Rust работает уже сейчас.
Отлично. Завтра же скажу на работе, что нам нужно срочно переписывать все проекты на какой — то там раст. Думаю, руководство порадуется связанными с этим простоями.
И сразу видно, что в гадание по аватарке комментариям вы не очень умеете. Я программирую на питоне десять лет, из них четыре зарабатываю, и даже на гитхабе у меня немного репозиториев валяется (в том числе на Rust и, внезапно, C++).
Зато по вам сразу видно, что у вас программирование уж точно не является ни профессиональной деятельностью, ни хобби, иначе бы вы, имея хотя бы поверхностное представление об основах C++ и Python (ну и Rust заодно), понимали бы, что в моих комментариях всё написано абсолютно правильно и правдиво.
Кратко пробежимся по списку: higher order functions, lambda expressions, exception handling, resumable exceptions, closures, first-class types, causally reflective environment, introspection and reflection, modules, automatic type inference − это всё есть в Python искаропки, но в C и C++ нужно писать много кода, чтобы реализовать все эти фичи.
Мета-вопрос: почему вы этого не понимаете? Тоже есть ответ: Пол Грэм, Blub Paradox (по-русски).
«когда он смотрит… вверх, он не осознает, что смотрит вверх. То, что он видит, — это просто „странные“ языки. Возможно, он считает их одинаковыми с Блабом по мощности, но со всяческими сложными штучками. Блаба для нашего программиста вполне достаточно, так как он думает на Блабе.»
Я думаю на Си. )
Кстати помнится вполне освоил Билдер ради создания интерфейсов, но в научной среде GUI редко нужны — отсюда и такое программирование.
— — —
И я уже собирался броситься в пучину Lisp.
ru.wikipedia.org/wiki/Десятое_правило_Гринспена
а их в питоне нет
Они есть и так, просто неявно. А с static type checking, который активно пропагандируется в последних версиях питона типы есть и явно.
Плюс, если говорить об инфраструктуре numpy/pandas, например, то там ещё начинают играть роль сишные типы из numpy.
Их в классическом питоне нет.
Они есть. Без использования static type checking они есть у объектов, но не у переменных, а с использованием — они есть и у переменных тоже.
В расте вообще можно написать только дефиницию функции и все типы внутри раст сам додумает. При этом у раста одна из самых сильных систем типов.
Вы можете точно говорить, что вам не нравится в системе типов питона? (я, человек работавший с питоном и с его типами, по дефалту принимаю фразу «типов в питоне нет» за опечатку)
А можете привести пример такой сильной системы типов, в которой вывод неразрешим именно потому, что это математически не возможно, а не потому, что там просто не сделали такого?
Какое отношение явная/неявная типизация и глобальный вывод типов имеет к обсуждаемому разговору?
Типы — это статически известные метки для тайпчекера.
Статически известные это
String str = String.new()
?
some attempt is made, either at compile time or at run-time, to check shape-consistency
У Python с этим всё в порядке:
>>> 1 + "a"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Как вообще это получается, по-вашему: ошибка типа есть, а типов нет? Где тут логика?
1.1 What is a type system
A useful—though rough—distinction divides the world of programming languages into two parts:
- Untyped — programs simply execute flat out; there is no attempt to check “consistency of shapes”
- Typed — some attempt is made, either at compile time or at run-time, to check shape-consistency
Но это, в общем-то, частности. Я не понимаю вашей логики в целом. Если в Python нет типов, то как CPython отличает строку от числа? Что делает встроенная функция
type
?Если в Python нет типов, значит, и классов там нет? Классы − это ведь частный случай типизации. Или если класс сконструирован в рантайме, то он не считается классом?
Однако через какое-то время пришлось признать, что очень многое в Delphi реализовано не в пример удобней (не обязательно лучше, именно удобней).
Правда, Delphi сейчас где-то на задворках, а С++ по прежнему где-то в топе, но это к теме удобства не особо относится.
Возможно, Питон постигнет та же участь, хех.
Ну а пока имеем то, что имеем — многие вещи на Питоне пишутся сильно проще (быстрее, удобнее, итд...).
А чтобы на всем этом собрать и запустить C++ программу, нужно обрести много гемороя с компиляторами, библиотеками.
У Python есть Django/Flask для web-приложений. И запустить его опять же можно хоть где.
Есть такие штуки как Amazon Lambda. Python там поддерживается, С++ нет.
Python можно запустить хоть на чем, Windows, Linux, Raspberry Pi, роутер.
Прошу прощения, рука дрогнула.
После установки Питона на роутер, весьма вероятно, он перестанет маршрутизировать и начнет заниматься только выполнением вашей программы на Питоне.
Не думаю, что это хоть как-то затормозит роутер.
Понятно, что ставить боевой web-сервер на тысячи пользователей на роутер не стоит даже и пытаться.
И ради этой задачи надо на роутер поставить Питон? Не статически скомпилированный бинарник из 100-строчной программы на С? Не luajit с необходимым количеством библиотек? В конце концов, не shell-скрипт, для которого на роутере уже все есть?
А что туда qemu не поставить, и поверх нее Ubuntu с иксами?
Мне кажется, что единственным аргументом за установку Питона на роутер для решения этой конкретной задачи является умение решать эту задачу Питоном. В милом моему сердцу мире разработки для низкопроизводительных устройств с ограниченными ресурсами, принято подбирать решение, наиболее подходящее железу, и под эту задачу подбирать разработчика, а не наоборот. В мире больших серверов и ПО для массового обслуживания все наоборот, доля стоимости железа стремится к нулю, поэтому Питон с его порогом вхождения более чем востребован.
Ну это во-первых не так, это приложение явно отъест существенно большую часть наличных ресурсов роутера, чем VPS, а во-вторых, как кроссплатформенностью копеечной задачи, решаемой, повторюсь, вовсе без установки дополнительного ПО на роутер, можно аргументировать установку Питона со всеми его модулями на роутер?
Это оставляя в стороне вопрос, что все эти модули придется скомпилировать с учётом имеющихся на роутере библиотек.
Микротик так умеет :)).
Позволяет в виртуальной машине запустить виртуальный роутер, который будет получать доступ к реальным портам.
Можно запихнуть OpenWRT + ТОР + гейши, настроить и радоваться :)
Конечно, Wheel-пакеты в своё время немного снизили накал страстей. Но, поскольку Microsoft ради Python за всю историю ни разу не пошевелил и пальцем (“Developers! Developers! Developers!”), для питонистов будет безопасней игнорировать эту платформу.
Python можно запустить хоть на чем, Windows, Linux, Raspberry Pi, роутер. Причем, все работает без переписывания, без возни с настройками
Ошибка. Обычный код аля "1+1" может работать везде, а вот код с библиотеками… Тут сначала нужно решить проблему с pip, который не всегда хорошо ставится. Потом решить проблему с либами, которые не всегда компилятся под винду. Ну и потом уже можно выдохнуть и вспомнить про версии самого питона...
Он нужен тем, кто не может освоить С++
В общем совершенно бесполезный язык.
Для разнообразия отвечу серьезно.
Питон идеален для быстрой аналитической работы. Скрутить rpc-клиент из генератора, выдернуть данные, разобрать в pandas, отрендерить график в mathplotlib, это все. Это классно. Это удобно (jupyter это вообще мечта). Далеко не факт что вы сможете сходу написать аналогичный по эффективности C/C++ код (numpy вылизан до безобразия по эффективности). Вам не надо искать как собрать какой-то пакет — вы берете и работаете.
Да, по факту многие прототипы на python я потом переписываю на чем-то еще. На Go, на rust. Но питон позволяет поиграться с идеей уже сейчас и убедиться что она имеет право на жизнь.
И математикам из академии, переезжающим с Matlab, и разработчикам, влезающим в анализ данных из каких-то прикладных языков, Python тут будет удобнее.
Не так давно коллеге (который в питоне шарит) что-то там надо было распарсить и обработать — за пару часов результатов работы своего скрипта он не дождался. Моё поделие на х-ле отработало за время порядка нескольких минут.
Дерзко предположу, что ваш коллега плохо шарит в питоне. numpy-стек очень хорошо оптимизирован, и правильно написанный код (где всё по максимуму считается через всяческие броадкастинги) должен быть крайне быстрым, сопоставимым по скорости с хорошим кодом на плюсах (ведь там под капотом и MKL, и всяческий SIMD). Поэтому хороший код на питоне и хороший код на хаскелле в сфере обработки данных должны быть примерно одинаковыми по скорости.
jupyter это вообще мечта
А по мне, так это весьма ограниченный и урезанный клон Wolfram Mathematica Notebook.
По крайней мере, после математики, при попытке работы с юпитером всё время чувствуешь себя не в той тарелке из-за кучи ограничений и урезанного функционала.
Собственно, все те задачи быстрого прототипирования и «поиграться с идеей» более комфортно решаются в вольфраме.
Хотя, для дата-сайенса, разумеется, питон будет лучше, но только из-за наличия большого числа готовых специализованных пакетов.
А по мне, так это весьма ограниченный и урезанный клон Wolfram Mathematica Notebook
В общем случае, справедливо. В данном сравнении могу сказать что питон просто проще интегрируется с прототипированием кода — веб-апи на математике не пишут все же, а тут можно написать веб-клиент и быстро его же и потестить. Питон, кмк, более универсален в этом вопросе.
Математика офигенная потому что там датасеты из коробки.
С помощью всего можно сделать всё. Просто монетку всё же легче поднимать магнитом, а фигурки делать ну хотя бы долотом.
Мастера отличает не только владение определённым инструментом, но и умение выбрать кисть, которой он будет реализовывать конкретную мысль.
Так же и в программировании, есть скрипты для скорости разработки, есть асм для максимальной эффективности. Между ними ещё целая гора инструментов под разные нужды, просто нужно знать какой и когда эффективнее применять.
" нужно знать какой и когда эффективнее применять."
Вот собственно об этом и был вопрос.
Философские обобщения здесь очевидны и посему банальны.
Хорошо, хотите простейший пример, где питон выигрывает?
Вот вам школьные задачки
Py:
def f(x,y,w,z):
return int((x and not y) or (y==z) or not w)
print('x y w z')
for n in range(0b1, 0b10000):
x = n>>3
y = (n >> 2) & 1
w = (n >> 1) & 1
z = n & 1
r = f(x, y, w, z)
if not r:
print("{} {} {} {} = {}".format(x, y, w, z, r))
C
#include<stdio.h>
int F(int x, int y, int w, int z){
return (x & !y) || (y==z) || !w;
}
int main() {
printf("x y w z\n");
for (int i = 0b1; i < 0b10000; i++){
int x = i >> 3;
int y = (i >> 2) & 1;
int w = (i >> 1) & 1;
int z = i & 1;
int r = F(x,y,w,z);
if (!r)
printf("%i %i %i %i = %i\n", x, y, w, z, r);
}
}
Разница даже не в количестве строк, а количестве мыслей, которые нужно применить. Сначала типы, потом библиотека, потом компиляция...
Если хотите более сложные и приближенные к жизни примеры, то держите:
- Была задача сделать сервак для игрушки небольшой браузерной. Пусть будут карты. За 3 дня накатан макет на питоне, который прекрасно работал. Выдали деньги на разработку и клиент уже даже первый пакет правок подготовил по макету, а не по готовой кодовой базе. Лишние 10 часов не выброшено в мусорку.
- Личная задачка: на компе есть бд с треками (название, исполнитель, жанр ...) и плейлистами. Нужно при подключении телефона на его карточку копировать файлы из конкретного плейлиста. Сначала был сделан прототип на питоне, оттестирован, выявлен основной функционал. Потом была сделана программка на ржаве. Сейчас прекраснейшим образом работает.
Таких примеров куча. Если свести их к одному тезису, то
Питон — скриптовый язык без узкой специализации, который можно применить где угодно и быстро.
С моей точки зрения, питонист, который пришел в питон после C++ или чего то подобного, как правило принимает более грамотные и взвешенные решения по части использовать питон или нет на проде, нежели чем тот, который как сел на старте на питон, так и использует его везде и всегда, по делу и без дела.
С моей точки зрения...
Да, я много где уже слышал позицию "первый язык влияет на мышление". Но я отношусь к тому меньшинству, считающему, что вообще любой язык влияет на мышление. Для меня нет разницы, был первым питон или плюсы — человек по идее после изучения обоих умеет писать и на том, и на том. Если человек умеет думать головой, то для него язык только инструмент, выражающий мысль, а не трафарет, по которому стоит мыслить.
Возможно я просто ещё не настолько стар, чтобы понимать вымывающуюся гибкость сознания. Просто я пока вижу только то, что многие (я и сам иногда грешу) мыслят терминами. Вот в расто сообществе есть такой прекрасный термин, выражающий как раз негибкость и трафаретированность сознания — "ооп головного мозга".
Странно, конечно, знакомить программистское сообщество с языком, имеющим где-то 20-летнюю историю.
Видно Хабр превращается в ленту типа — недавно я прочитал и расскажу, что понял
Я неоднократно начинал знакомство с какой-то технологии именно благодаря еще одной вводной статье. Видел её в ленте и вспоминал «точно, хотел же вот попробовать».
Как мне, так лучше почитать специализированный сайтик, который находится в первой строке поиска по питону, чем вот эту вот "статейку", которая мало того что просто ничему не учит, мало того что элементарный отступный синтаксис не учитывает, так 3 строка первого примера (for i in ( ... ]:
) меня просто убивает своей безграмотностью.
in знаю, а вот ln впервые вижу…
![](https://habrastorage.org/webt/im/eq/u9/imequ9atrr_2ovwpau7vll8qd1s.jpeg)
Автор, зачем ты это пишешь, если даже не можешь прочитать своё творчество и исправить некорректный код. Посмотри ещё раз на свой текст, где у тебя отступы в коде, что вообще со скобками творится (]
?! Для кого, для чего писать такие статьи?
Гм… Может для начала стоит почитать теорию по машинному обучению?
def subtract ( a=0, Ь=0 ) :
(мягкий знак, Карл!) так оно и есть. Только где-то ещё имело место text recognition.
for j in (1, 2, З, 4, 5 ] :
Так что да, тут однозначно автоматическое распознавание текста + (возможно) автоматический перевод. Чем-то напоминает ситуацию в относительно недавней статье про автоматическую генерацию и публикацию в Google Play однотипных слот-машинМы присутсвуем при историческом событии. Это первый шаг: "ИИ прочитал статью по питону и написал об этом на хабр". Потом ещё пару книг прочтет и начнет писать код. Следите за новостями.
Введение в Python