![]() #айтишный_быт
#парселтанг Пытаюсь начать учить Питон. Боги, насколько он уродлив по сравнению с Ruby!.. Для того, чтобы добавить значение в массив, нужно написать array.append('123') - а для того, чтобы удалить значение из массива по индексу, нужно написать del array[123]. Для того, чтобы отсортировать массив in place, нужно написать array.sort(), а для того, чтобы не in place - sorted(array). Господи, питонисты, как вы с этим живете!.. 10 ноября 2016
3 |
![]() |
ДНИЩE--ЫЫЫЫ
|
>del array[123]
array.pop(123) |
![]() |
|
Мнде. У нормальных людей pop - это pop, и идет с хвоста. А у питонистов pop - это delete, и идет из любого места.
2 |
![]() |
ДНИЩE--ЫЫЫЫ
|
![]() |
|
днище_ыыыы
Я и говорю. У нормальных людей pop - это pop. А у вас pop - это хз что. 1 |
![]() |
ДНИЩE--ЫЫЫЫ
|
StragaSevera
шо то хуйня, шо это |
![]() |
|
днище_ыыыы
Хуйня, когда язык с одной стороны заявляет, что есть один и желательно только один способ, а с другой, врубает хуйню про pop, который юзают вместо delete - хуйнистее. 2 |
![]() |
|
...
|
![]() |
|
А што, простите, не так? В каждом языке для этого свои способы записи, но всё работает жи.
|
![]() |
|
MonkAlex
Непоследовательность. 1 |
![]() |
|
Значит, ты слишком lawful для питона:)
Но вообще если юзать NumPy, то там есть numpy.delete(array, [i1,i2..]) Но если не по форме, но по духу, то полностью поддерживаю. |
![]() |
|
> Для того, чтобы добавить значение в массив
если что, вы таки в курсе что в нормальных языках для этого нужен realloc или какой еще resize, да? а для добавления есть другие структуры данных. |
![]() |
|
Facensearo
Если что, называть "нормальными языками" Си и ЦПП в 2016 году - моветон. Mikie Блеать. В Питоне надо еще юзать какую-то библиотеку для работы с числами? Пиздец, нафиг, нафиг. |
![]() |
ДНИЩE--ЫЫЫЫ
|
StragaSevera
> Блеать. В Питоне надо еще юзать какую-то библиотеку для работы с числами? Вы понимаете, что есть разница между просто числами и системой компьютерной алгебры? По дефолту пайтон умеет в длинные и комплексные числа. |
![]() |
ДНИЩE--ЫЫЫЫ
|
Mikie
Ок, действительно, немного некорректно выразился. |
![]() |
|
StragaSevera
> как вы с этим живете! Мы живём с Python3, где подобные стилистические несообразности выпилены принудительно, с умышленным сломом обратной совместимости. > В Питоне надо еще юзать какую-то библиотеку для работы с числами? Для «простой» работы с числами есть изкоробочная math. А NumPy — он для векторизованных вычислений на n-мерных массивах. |
![]() |
|
StragaSevera
> врубает хуйню про pop, который юзают вместо delete pop() — выдёргивание элемента из списка. del() — принудительное удаление объекта из пространства имён с переиндексацией. В частном случае применения результат может быть одинаков, но предназначение у них разное, а не вместо. > чтобы отсортировать массив in place, нужно написать array.sort(), а для того, чтобы не in place - sorted(array) Аналогично, первое даёт принудительную переиндексацию списка в памяти, второе — сортировка на лету без перезаписи исходного списка. Юзкейсы опять же разные by design. |
![]() |
|
StragaSevera
а с чего питон должен быть как руби то? У питона свои разработчики. Всегда есть конструкции хуже и лучше. |
![]() |
|
MonkAlex
С того, что на словах - лаконичность и простота, а на деле - херня и отсутствие унификации. Две схожие операции делаются по-разному - одно методом, другое стандартной функцией. Нафига??? |
![]() |
|
Facensearo
А мы говорим про питон или вообще? Подразумевается, что мы говорим о связных списках и массивах с обёрткой: ты не будешь переделывать массив, который у тебя есть в список, ты скорее добавишь обертку добавления, но списком ты от этого массив не сделаешь. И да, что за странная терминология? Когда мы говорим о структурах данных, массив - это массив, а список - это связный список. |
![]() |
|
StragaSevera
>Почему нельзя как в нормальном Руби, с .sort как сортировкой копии и .sort! как сортировкой оригинала? >Две схожие операции делаются по-разному - одно методом, другое стандартной функцией. Сортировка объекта и сортировка в копию - разные операции. В шарпе, к примеру, изменение коллекций через OrderBy для копий и Sort для самой коллекции. Только, как бы сказать, они и применяются в абсолютно разных ситуациях. Я не согласен с вами в том, что это схожие операции в плане применения. 1 |
![]() |
|
> А мы говорим про питон или вообще?
Показать полностью
Вообще. > Подразумевается, что мы говорим о связных списках и массивах с обёрткой: ты не будешь переделывать массив, который у тебя есть в список, ты скорее добавишь обертку добавления, но списком ты от этого массив не сделаешь. Вот есть конкретный пример. Есть жирный массив, который используется и в легаси он именно массив, array. Нужно пришить к нему редкое добавление элементов. Соответственно я либо буду использовать какой-нибудь условный array.resize/realloc (C), либо заменю array на list (С#)/arraylist(Java) ну или вообще it depends, может быть, выгоднее будет накостылить постоянный массив с переменным хвостом (array+list) и обернуть это все в, чтобы не дрочить страницы памяти пересозданием многомегабайтного массива. > И да, что за странная терминология? Когда мы говорим о структурах данных, массив - это массив, а список - это связный список. нормальная терминология. в шарпе List на основе массива, LinkedList - двусвязный, первый называется списком, второй - связным списком в яве ArrayList, который тоже называется просто списком и LinkedList - связным списком даже в сишке, где структуры данных собирай сам на аллоках и указателях, одно/двусвязные списки просто списками, кажется, не называются почти никогда, из-за вот этой вот двусмысленности |
![]() |
|
![]() |
|
k338914
А теперь переведи свое сообщение на русский. |
![]() |
|
Facensearo
ну блин, от того что всякие там устроили вакханалию с терминологией, она не стала от этого правильной Я мб сам излишне академичен, но предпочитаю именовать структуры данных по-нормальному, а не как захотели левые разрабы. > вообще it depends, может быть, выгоднее будет накостылить постоянный массив с переменным хвостом Суть. И нафига нужен был тот фанатизм?.. |
![]() |
|
StragaSevera
>затем понял... Так пишется то всегда одинаково. Или у вас каждый проект отдельно решает, в каком стиле будет писаться код? Я вот всегда пишу работу с коллекциями пришедшими снаружи - как с ридонли, со своими внутренними - как с изменяемыми. И в итоге, у меня не бывает вопроса, как же блин переписать сортировку тут на другую, просто потому, что это даже не всегда память, а иногда отображение sql таблички. Контексты разные, привычки разные, методы разные и в разных местах. Имхо - вполне нормальное поведение. Было бы хуже, будь у меня 4 метода sort, какой то из них меняет коллекцию, какой то нет. |
![]() |
|
StragaSevera
> переведи свое сообщение на русский «Почему? Да потому что мы решили: так надо.» > разноса одинаковой функции Так суть в том, что это разные функции с разным назначением. И то обстоятельство, что в некоторых юзкейсах они приводят к одинаковому (либо взаимно сводимому) результату — не отменяет их разности. |
![]() |
|
StragaSevera
восклицательный знак - забавное решение. К сожалению, оно подойдет только платформе, а то поседеешь же создавать по два метода на каждый чих. |
![]() |
|
StragaSevera
у кошелька метод снять_деньги может снимать деньги, а метод снять_деньги! возвращает новый кошелек! |
![]() |
|
MonkAlex
Не понял вашей метафоры. ORM - это вообще другое, а если мы не о персистентности, то порой так и надо. |
![]() |
|
StragaSevera
так и коллекции разные бывают. Некоторым сортировка - нужна, некоторые неизменяемые и потому сортировка только в новую коллекцию. А ещё бывают обобщенные реализации со своими тараканами. ПС: и я ни слова не писал об ORM. Это просто предметная логика. Только в платформе выглядят красиво такие вещи, на деле они далеко не всегда работают. |
![]() |
|
MonkAlex
Не нужен метод - не реализуешь. В чем проблема? |
![]() |
|
StragaSevera
вот и ответ на вопрос в шапке. Реализуй себе методы сам, раз не устраивают из коропки. Авторы так видят, очевидно же. |
![]() |
|
MonkAlex
А в питоне разве есть манкипатчинг? И даже если есть - разве это нормально, манкипатчить идиотизмы языка? |
![]() |
ДНИЩE--ЫЫЫЫ
|
Есть.
|
![]() |
|
StragaSevera
есть. А нормально это или нет - так это ваше дело. В этом же соль любого хорошего языка - дать возможность написать себе велосипед. |
![]() |
|
MonkAlex
ВОзможность написания велосипеда не отменяет нужности наличия готовых и встроенных. |
![]() |
|
StragaSevera
так раз их нет в коропке - значит они не нужны не только разработчикам питона, но и пользователям. А то, что вам хочется руби в питоне - исключительно ваша проблема. Я на питоне только скрипты пишу в пару сотен строчек кода, хз как можно писать, когда не знаешь, какой тип объекта может придти в любой момент. |
![]() |
|
![]() |
|
MonkAlex
А тесты писать Пушкин будет, чтобы не было method_missing? |
![]() |
|
StragaSevera
так а я о чём. Когда есть языки, которые мне гарантируют входящий тип, питон меня не прельщает для полноценной разработки. Писать тесты на то, что можно ловить на компиляции - лень. Независимые скрипты автоматизации на питоне писать - да, но це мелочи же. |
![]() |
|
> Писать тесты на то, что можно ловить на компиляции - лень.
Потому большинство программ и дерьмо, что лень. |
![]() |
|
StragaSevera
дерьмо в каком плане? Большинство, имхо, просто нахер никому не нужны. А нужные всё равно вылизывают до рабочего состояния. |
![]() |
|
MonkAlex
... тратя куда больше человеко-часов, чем при использовании юнит-тестов. |
![]() |
|
StragaSevera
не знаю к чему это вы. Юнит тесты не спасут, если приложение никому нахер не нужное. А если нужное - то кроме юнит тестов всегда баги будут находить пользователи. |
![]() |
|
MonkAlex
> то кроме юнит тестов всегда баги будут находить пользователи. Собственно, поэтому 99% программ и дерьмо. |
![]() |
|
StragaSevera
всмысле, почему? потому что у них есть пользователи? |
![]() |
|
MonkAlex
Потому что они считают пользователей бета-тестерами, вместо того, чтобы просто написать юнит-тесты. |
![]() |
|
StragaSevera
так пользователи - не юнит тесты. Они то работают с жизненным циклом ваших сущностей, у которых по несколько точек входа в изменяющие их кейсы. Чтобы это покрыть тестами - надо покрывать прям абсолютно все состояния, без исключений. Кто это писать и поддерживать будет, спортлото? |
![]() |
|
MonkAlex
Лучшее - враг хорошего. Тот факт, что ты не можешь покрыть абсолютно все кейсы, никоим образом не разрешает тебе писать код без юнит-тестов. |
![]() |
|
StragaSevera
тот факт, что ты пишешь юнит тесты, не делает твой продукт полезным или рабочим. Не надо кидаться в крайности. |
![]() |
|
MonkAlex
Факт. А Волга впадает в Каспийское море, а лошади кушают овес и сено. Что сказать-то хотел? Что т.к. юнит-тесты - не гарантия, то их писать не надо? |
![]() |
|
StragaSevera
вы как то упорно в тесты вцепились. Ещё раз - то, что может проверить компилятор в C#, проверять приходится тестами в python. Зачем писать тесты, когда можно оставить проверки компилятору. Он то явно лучше меня это сделает. |
![]() |
|
MonkAlex
Затем, что в C# ТОЖЕ необходимо писать тесты. Но средний программист - лентяй и гонит пургу типа вашей. Поэтому язык, в котором писать тесты напрямую требуется - благо. |
![]() |
ДНИЩE--ЫЫЫЫ
|
StragaSevera
Ты подменяешь аргументацию MonkAlex Он не говорил о том, что юнит-тесты не нужны. Он говорил о том, что при статической типизации конкретное подмножество [юнит-]тестов не нужно. |
![]() |
|
днище_ыыыы
... что заставляет погромистов игнорировать и остальные юнит-тесты, из-за чего мы и имеет то, что имеем. |
![]() |
ДНИЩE--ЫЫЫЫ
|
StragaSevera
>что заставляет погромистов игнорировать и остальные юнит-тесты ...Как ты это вывел? ELI5 |
![]() |
|
днище_ыыыы
Простое знание человеческой природы. |
![]() |
|
Ладно, я умываю руки. Я пишу тесты, но аргументации StragaSevera просто не понимаю.
|
![]() |
ДНИЩE--ЫЫЫЫ
|
![]() |
|
днище_ыыыы
Как минимум, про Ruby - древний бред. Всегда в miltiline? С каких пор? "nil.to_i.nil? #=> false"? А какое желаемое поведение, true, что-ли? |