Или ты хочешь, чтобы Питон вернул False, и пустой список дел было невозможно выполнить?
Любой агрегатор в таком виде должен вернуть либо None, либо вывалится с ошибкой (как reduce(pred, [])), либо иметь явный аргумент с начальным значением.
Ты понимаешь, что твоя логика противоречит математической логике?
На самом деле противоречишь ей тут ты т.к. пытаештся искать какие-то семантические параллели между совершенно разными сущностями. all(), например, не имеет ничего ощего с твоими рассуждениями.
Чтобы понять это нужно пообобщать all() дальше, например разрешить иметь произвольный предикат типа (object -> boolean) и рассмотреть два из них - lambda x: bool(x) и lambda x: not bool(x). Если переводить на пример твоих задач, то получается что вопросы 'все ли задачи выполнены' и 'все ли задачи не выполнены' для пустого списка имеют одинаковый ответ - да. Надо полагать, что это логично?
С точки зрения «математической логики» операция all() над пустым множеством не определена.
Хочешь поработать с датой и временем - подключай «time» и «datetime» (в руби всё делает базовый класс Time, ни одного модуля не надо подключать - батарейки в комплекте).
Хочешь поработать с терминалом - подключай «termios» (руби по умолчанию умеет работать с терминалом).
Хочешь вызвать системные функции - подключай 4 модуля «sys, os, socket, threading» (в руби есть системные константы).
Хочешь поработать с файлами (С ФАЙЛАМИ, КАРЛ!) - подключай «fcntl» (в руби класс File доступен по умолчанию).
Хочешь поработать со структурами - подключай «struct» и «binascii» (в руби все методы для работы с данными входят в базовый класс String).
Т.е. если ты в руби хочешь сделать какое-то типовое действие, то ты в 90% случаев берёшь базовый класс и получаешь весь инструментарий, удобный, работающий в традиции Ruby.
А если ты в питоне хочешь сделать какое-то типовое действие, то всегда должен найти какой-то сторонний модуль, разобраться каким образом на этот раз программер извратнулся, чтобы реализовать логику интерфейса (набор классов и методов), как туда параметры подаются. (А извращаются они всегда по-разному).
И вот эта постоянная анальная возьня в питоне (особенно, после руби) меня просто за$бала. Если бы не stackoverflow с большим кол-вом примеров, то я бы наверное от питона вобще отказался. А так он берёт популярностью. Ну и скорость мне понравилась, вроде как чуть шустрее руби.
Хочешь поработать с датой и временем - подключай «time» и «datetime» (в руби всё делает базовый класс Time, ни одного модуля не надо подключать - батарейки в комплекте).
Да, пистухон тут сосет.
Хочешь поработать с терминалом - подключай «termios» (руби по умолчанию умеет работать с терминалом).
Раби - блоатед говно, если оно по дефолту содержит то, что в этом модуле.
Хочешь вызвать системные функции
ctypes, cffi. В раби тоже ffi-гем для этого используется (аналог ctypes в стдлиб не завезли, видимо)
Хочешь поработать с файлами (С ФАЙЛАМИ, КАРЛ!) - подключай «fcntl» (в руби класс File доступен по умолчанию).
Несешь какую-то херню, если честно. open() - builtin.
(в руби все методы для работы с данными входят в базовый класс String).
Пердл нового поколения.
А если ты в питоне хочешь сделать какое-то типовое действие, то всегда должен найти какой-то сторонний модуль, разобраться каким образом на этот раз программер извратнулся, чтобы реализовать логику интерфейса (набор классов и методов), как туда параметры подаются.
Не, это в раби фанатеют от DSL для создания DSL для DSL.
Ну и скорость мне понравилась, вроде как чуть шустрее руби.
Не, это в раби фанатеют от DSL для создания DSL для DSL.
Только для каких нибудь глобальных вещей типо rspec или в качестве конфигов отдельной софтины типо capistrano, rake. В остальном все достаточно традиционно. А при желании и в пистоне ни кто не мешает говнокодить.
comm = [segsign, index, cmd, code, crc8].pack('nnCCC')
comm_len = comm.size
В первом случае, я должен найти сначала библиотеку, которая занимается упаковкой байт в строку и обратно, изучить интерфейс этой библиотеки (систему классов и их методы), потом подключить эту библиотеку, вызывать метод.
Затем чтобы получить длину строки (ДЛИНУ СТРОКИ, КАРЛ!), я вызываю не метод класса String (что вполне обыденно для любого ООП), а вызываю какую-то левую конструкцию len(string)!
Это ли не зоопарк?
Во втором случае я беру базовый класс Array, вызываю метод pack.
Потом беру базовый класс String, вызываю метод size.
Всё.
Намекаешь, что есть несколько способов для работы с ними?
Ну так это нормально для Ruby - можно делать одну и ту же вещь несколькими стилями. Но унификация в рамках этих стилей строго соблюдается во всех встреченных мною библиотеках и классах.
В первом случае, я должен найти сначала библиотеку, которая занимается упаковкой байт в строку и обратно, изучить интерфейс этой библиотеки (систему классов и их методы)
ээ.. а Array.pack у тебя с рождения в голове прошит?
потом подключить эту библиотеку
ты имеешь ввиду «import struct»? обожемой, сколько лишней писанины. какие бы там ни были плюсы явного импорта требуемого функционала в начале модуля, я же переломлюсь написать лишнюю строчку
Во втором случае я беру базовый класс Array, вызываю метод pack. Потом беру базовый класс String, вызываю метод size.
пиши на С, тебе понравится. там вообще всё в одно пространство имен засунуто.
Параша, Array лезет не в свою зону ответственности.
Впрочем, у рабистов с их японским игрушечным неопердлом всегда было особое мнение об ООП.
Затем чтобы получить длину строки (ДЛИНУ СТРОКИ, КАРЛ!), я вызываю не метод класса String (что вполне обыденно для любого ООП), а вызываю какую-то левую конструкцию len(string)!