LINUX.ORG.RU

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

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

Любой агрегатор в таком виде должен вернуть либо None, либо вывалится с ошибкой (как reduce(pred, [])), либо иметь явный аргумент с начальным значением.

Ты понимаешь, что твоя логика противоречит математической логике?

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

Чтобы понять это нужно пообобщать all() дальше, например разрешить иметь произвольный предикат типа (object -> boolean) и рассмотреть два из них - lambda x: bool(x) и lambda x: not bool(x). Если переводить на пример твоих задач, то получается что вопросы 'все ли задачи выполнены' и 'все ли задачи не выполнены' для пустого списка имеют одинаковый ответ - да. Надо полагать, что это логично?

С точки зрения «математической логики» операция all() над пустым множеством не определена.

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

С точки зрения «математической логики» операция all() над пустым множеством не определена.

Это ты так решил?

либо вывалится с ошибкой (как reduce(pred, []))

reduce(pred, [], initial) не вываливается.

нужно пообобщать all() дальше, например разрешить иметь произвольный предикат типа (object -> boolean)

map в другом месте. Даже если так,

$ ghci
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> all (0==) []
True

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

reduce(pred, [], initial) не вываливается.

Очевидно, эта запись эквивалентна reduce(pred, [initial] + []), т.е. гарантированно обеспечивает непустое мн-во.

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

Традиционно наоборот, fold1 f lst == fold f s list.

Deleted
()

К питону есть претензии, но не в данных примерах (не в области синтаксиса).

Мне не нравится организация библиотек (по сравнению с Ruby).

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

был вон один язык где имя всегда было l-value поэтому каждый раз нужно было писать .имя для получения его r-value

Это что за язык?

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

Ну вот смотри, маленькая утилитка, а модулей 12 штук подключено (12 ШТУК, КАРЛ!):
https://github.com/Novator/Pandora/blob/master/util/pangate.py

Т.е. на каждый чих нужен модуль:

Хочешь поработать с датой и временем - подключай «time» и «datetime» (в руби всё делает базовый класс Time, ни одного модуля не надо подключать - батарейки в комплекте).

Хочешь поработать с терминалом - подключай «termios» (руби по умолчанию умеет работать с терминалом).

Хочешь вызвать системные функции - подключай 4 модуля «sys, os, socket, threading» (в руби есть системные константы).

Хочешь поработать с файлами (С ФАЙЛАМИ, КАРЛ!) - подключай «fcntl» (в руби класс File доступен по умолчанию).

Хочешь поработать со структурами - подключай «struct» и «binascii» (в руби все методы для работы с данными входят в базовый класс String).

Т.е. если ты в руби хочешь сделать какое-то типовое действие, то ты в 90% случаев берёшь базовый класс и получаешь весь инструментарий, удобный, работающий в традиции Ruby.

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

И вот эта постоянная анальная возьня в питоне (особенно, после руби) меня просто за$бала. Если бы не stackoverflow с большим кол-вом примеров, то я бы наверное от питона вобще отказался. А так он берёт популярностью. Ну и скорость мне понравилась, вроде как чуть шустрее руби.

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

Хочешь поработать с датой и временем - подключай «time» и «datetime» (в руби всё делает базовый класс Time, ни одного модуля не надо подключать - батарейки в комплекте).

Да, пистухон тут сосет.

Хочешь поработать с терминалом - подключай «termios» (руби по умолчанию умеет работать с терминалом).

Раби - блоатед говно, если оно по дефолту содержит то, что в этом модуле.

Хочешь вызвать системные функции

ctypes, cffi. В раби тоже ffi-гем для этого используется (аналог ctypes в стдлиб не завезли, видимо)

Хочешь поработать с файлами (С ФАЙЛАМИ, КАРЛ!) - подключай «fcntl» (в руби класс File доступен по умолчанию).

Несешь какую-то херню, если честно. open() - builtin.

(в руби все методы для работы с данными входят в базовый класс String).

Пердл нового поколения.

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

Не, это в раби фанатеют от DSL для создания DSL для DSL.

Ну и скорость мне понравилась, вроде как чуть шустрее руби.

Чет проиграл со сравнения скорости скриптоговна.

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

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

Ей-богу, ты заморачиваешься на пустом месте. Написать import blah ничто по сравнению с самим программированием.

Если бы не stackoverflow

Это касается любого языка. Я точно так же с руби делал.

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

тикл крутой язык - особенно до внесения (в не непомню какой версии) синтаксиса .

т.е. тикл был круче пока не стали фичевать его парсером.

т.е. пока был парсер

цикл_интерпретатора:

  • получи слово_команду
  • получи остальную_строку до терминатора(набор которых есть функция от слова_команды)
  • исполни слово_команду с аргументами остальная_строка
  • смени состояние_интерпретатора.

было огонь

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

Не, это в раби фанатеют от DSL для создания DSL для DSL.

Только для каких нибудь глобальных вещей типо rspec или в качестве конфигов отдельной софтины типо capistrano, rake. В остальном все достаточно традиционно. А при желании и в пистоне ни кто не мешает говнокодить.

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

Дык гемор не с подключением модуля, а с зоопарком в методах и классах, подходах.

У руби - всё унифицировано.
У питона - каждый раз приходится вникать.

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

Я тебя не понимаю. Можно конкретный пример, например, со struct? В чём, по-твоему, проблема питона?

Сравни:

Python:

import struct
comm = struct.pack('!HHBBB', segsign, index, cmd, code, crc8)
comm_len = len(comm)

Ruby:

comm = [segsign, index, cmd, code, crc8].pack('nnCCC')
comm_len = comm.size

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

Затем чтобы получить длину строки (ДЛИНУ СТРОКИ, КАРЛ!), я вызываю не метод класса String (что вполне обыденно для любого ООП), а вызываю какую-то левую конструкцию len(string)!

Это ли не зоопарк?

Во втором случае я беру базовый класс Array, вызываю метод pack.
Потом беру базовый класс String, вызываю метод size.
Всё.

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

У руби - всё унифицировано.

сразу вспомнилось про регекспы

Намекаешь, что есть несколько способов для работы с ними?
Ну так это нормально для Ruby - можно делать одну и ту же вещь несколькими стилями. Но унификация в рамках этих стилей строго соблюдается во всех встреченных мною библиотеках и классах.

То же массив я могу создать так, или так:

array1 = [segsign, index, cmd, code, crc8]
array2 = Array.new(segsign, index, cmd, code, crc8)

А программер сам выбирает свой стиль. Ящетаю, это круто.

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

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

ээ.. а Array.pack у тебя с рождения в голове прошит?

потом подключить эту библиотеку

ты имеешь ввиду «import struct»? обожемой, сколько лишней писанины. какие бы там ни были плюсы явного импорта требуемого функционала в начале модуля, я же переломлюсь написать лишнюю строчку

Во втором случае я беру базовый класс Array, вызываю метод pack.
Потом беру базовый класс String, вызываю метод size.

пиши на С, тебе понравится. там вообще всё в одно пространство имен засунуто.

что вполне обыденно для любого ООП

packer = struct.Struct('!HHBBB')
bytes = packer.pack(*array)

вот это - ООП. а то, что ты написал - говнокодище, что на питоне, что на руби.

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

Параша, Array лезет не в свою зону ответственности.

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

Затем чтобы получить длину строки (ДЛИНУ СТРОКИ, КАРЛ!), я вызываю не метод класса String (что вполне обыденно для любого ООП), а вызываю какую-то левую конструкцию len(string)!

In [4]: "puk".__len__()
Out[4]: 3

man duck typing, man sequence protocol.

// лол, зачем я вообще перед рабистом распинаюсь

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

пиши на PHP, тебе понравится. там вообще всё в одно пространство имен засунуто.

fixed

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

зачем я вообще перед рабистом распинаюсь

ЯП-дрочеры такие ЯП-дрочеры.
Код иди пиши, приложения создавай, аналитик.

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

Ты ответил прям на самую главную часть поста, на его СУТЬ, так сказать.

И давай ты не будешь указывать, что мне делать.

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

на каждый чих нужен модуль

Делов то:

cat >allinclusive.py <<нутыпонял
from time import *
from datetime import *
from termios import *
нутыпонял
опосля чего проблема модулей легко превращается в проблему конфликта имён, всего 1й дополнительной строкой.

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

В первом случае, я должен найти сначала библиотеку, которая занимается упаковкой байт в строку ...

1.
#dir();
[help(x) for x in __builtins__]

я вызываю не метод класса String

2. см пункт 1.

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

я кстати охерел от кода пандоры, это пипец вообще.
Думаю, это и есть главная причина того что ты её один пилишь.

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

Позеры-аналитики всегда отличались от прикладных программистов.

я думаю, очевидно, кто есть кто. нет, ты не угадал.

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

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

Может быть я что-то подзабыл, но смотрю сюда https://ru.wikipedia.org/wiki/Импликация и таблица истинности как-то не совпадает с тем, что предлагает python.

Сколько функций существует из множества 1 в 0. Нисколько, то есть 0, False. И т.д

А в python почему-то вот так:

>>> True ** False == True
True
alienclaster ★★★
()
Последнее исправление: alienclaster (всего исправлений: 1)
Ответ на: комментарий от nezamudich

True ** False = (False -> True) = True же. Всё верно.

Я читал True ** False наоборот, как True -> False.

alienclaster ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.