Pull to refresh
2
Send message

Еще забавный порядок действий:


  if (is_binary_notation(input) ||
      is_hex_notation(input) ||
      is_octal_notation(input)) {
    return true;
  }

  if (input.empty()) {
    return false;
  }

Сначала выполнили кучу действий и только потом проверили пустая строка или нет.

  1. Я не ставил под сомнение работоспособность кода. Под сомнением находится только объяснение что делает этот код.
  2. Хорошо что у меня получилось обратить внимание на непонятный (в данном примере) consumers
  3. Ваши ответы порождают только больше вопросов:
    1. Всё дело в sleep у follow, что позволяет работать конкуррентно бесконечному циклу в треде
      т.е. без sleep() ничего работать не будет?
    2. Почему вы в своей версии multiplex() сделали именно так:
      yield from genfrom_queue(in_q)
      а не
      return genfrom_queue(in_q)

Предлагаю остановиться на том, что пример не ваш и был взят из «источника Бизли» (соответственно, мне надо обращаться к автору источника).

Можно только гадать почему не использовался такой вариант:


cls.last_label = 0  # reset intenal counter

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


По поводу printHelloWorld(): вы сами ответили на свой вопрос.
Как минимум снизится шанс опечатки. За счет того, что действия находятся в 1 месте.
Отсюда следует другой плюс: чтобы изменить эти действия придется внести правку в 1 место, а не искать все места с копипастой по всей кодовой базе.
Насчет быстродействия: на абстрактном примере нельзя дать никакой другой рекомендации кроме "код надо писать для человека" (ибо может оказаться что узкое место вообще в другом месте и т.п.).


И самое главное (снова имхо): на подобные вопросы нет однозначного ответа. Все зависит от контекста.

  1. Вы (как человек работающий с этим кодом) понимаете смысл действия cls.last_label = 0?
    Я — нет, но благодаря этой функции я смогу сбросить label.
    Итого:
    • функция выглядит полезной
    • комментарий не соотносится с названием функции.
  2. Функция printHelloWorld() нужна в том случае, если определенный набор действий (print("Hello, world!")) повторяется больше 2х раз многократно.

P.S. Все вышесказанное = имхо.

gen_cat(consumers) в примере входит внутрь каждого контекста genfrom_queue

Как он может зайти внутрь каждого контекста, если genfrom_queue() никогда не выйдет из вечного цикла, т.к. StopIteration никогда не появится в очереди (см. блок "т.к." из моего предыдущего сообщения)?


P.S. Попробую с другой стороны:
Если приглядеться, то можно увидеть, что (в данном конкретном примере) consumers содержит результаты 3х вызовов genfrom_queue(in_q).
Чем эти 3 вызова genfrom_queue(in_q) отличаются друг от друга?

Вопрос касательно кода из примера "Маршрутизация данных на генераторах (мультиплексирование, броадкастинг)":


  1. будет ли работать этот код с разными очередями?
    Я так понимаю что нет.
  2. для чего нужен gen_cat(consumers) в multiplex()?
    Я так понимаю что не нужен, нас интересует только genfrom_queue(in_q).
    Т.к. (при текущей реализации) gen_cat() никогда не дойдет до 2+ элемента sources,
    т.к. sendto_queue() никогда не дойдет до StopIteration,
    т.к. в follow() бесконечный цикл.
def append(element, seq=None):
  if not seq:
    seq = []
  seq.append(element)
  return seq

Какая-то косвенная проверка. Может лучше явно проверять именно то, что было написано? Т.е.:


  if seq is None:

Именно так.
Я считаю что это ограничение должно быть явно указано в статье.

Собственно, следующий пример имеет аналогичную проблему:


# statement-based while loop
while <cond>: 
    <pre-suite> 
    if <break_condition>: 
        break
    else: 
        <suite> 

# FP-style recursive while loop
def while_block(): 
    <pre-suite> 
    if <break_condition>: 
        return 1 
    else: 
        <suite> 
        return 0 

while_FP = lambda: (<cond> and while_block()) or while_FP() 
while_FP()

Если запустить, то получим следующий вывод:


IMP -- quit
FP -- quit
quit

FP версия делает 1 лишнее действие (по сравнению с IMP).

# Normal statement-based flow control
if <cond1>: 
    func1() 
elif <cond2>: 
    func2() 
else: 
    func3() 

    # Equivalent "short circuit" expression
(<cond1> and func1()) or (<cond2> and func2()) or (func3()) 

"Equivalent "short circuit" expression" НЕ является эквивалентом "Normal statement-based flow control". Пример:


>>> func1 = lambda: print('func1')
>>> func2 = lambda: print('func2')
>>> func3 = lambda: print('func3')
>>> x = 1
>>> (x == 1 and func1()) or (x == 2 and func2()) or (func3())
func1
func3
>>> if x == 1: func1()
... elif x == 2: func2()
... else: func3()
...
func1

Разница в том, что с if'ом func3 не вызывается.

И вот сидишь, как дебил, читаешь это сообщение и думаешь: ну и что же изменилось?

Никто не скажет вам что изменилось. Обратите внимание на то, что было сказано выше:


раньше у нас в аппсторе всегда было написано Bugs and improvement fixes, теперь появился человек, который тестирует различные формулировки в истории и их влияние на основные метрики

Я понимаю это так: "у нас есть метрики, мы будем на них воздействовать посредством changelog". Соответственно, там может вообще не быть ни слова про сделанные изменения, если это не влияет на метрики. Другими словами: содержимое changelog определяют метрики, а не изменения.


P.S. Имхо: подобные приложения стоит расценивать как интерфейсы, у которых есть только одна версия — актуальная.

Это совершенно точно не типичная статья в желтой прессе, ибо ценность информации в типичной статье желтой прессе стремится к 0.


Лично я не знал такие подробности, поэтому данная статья позволит будущему мне сэкономить время (если вдруг придется копать в эту сторону).

Будет проще разобраться если не экономить на переменных и не пихать промежуточные результаты в конечное выражение.

Шашкель и Шкалка для программистов на Плюсах заходят плохо (синтаксис категорически разный)

Особенно плохо заходят функции вида:


:.

Вот бы плагин для vscode чтобы редактировать настройки wt как настройки самого vscode…
Или хотя бы файл конфига со всеми доступными настройками как в sublime text 3.

Ради новых концепций, которые в плюсах не заложены (при этом иногда реализованы, но через костыли).

Все никак не могу понять: если сломать ABI, то какой смысл оставаться на С++?


Буквально на днях (в рамках "олимпиады" посвященной переписыванию wc) в очередной раз стало понятно что компиляторы разных языков выдают примерно одинаково работающий бинарь.


P.S. Я не против плюсов и своей профессиональной деятельности использую 2 языка: С++17, Python27.

Не надо стрематься. С нетерпением ждем продолжения %)

Интересно, откуда пошла эта подмена ("экспертиза", а не "компетентность")?.. В последние пару месяцев это встречается очень часто.

В хаскеле раздрядность Int тоже 64, так что все честно.


P.S. по крайней мере у меня такая разрядность...


GHCi, version 8.6.5: http://www.haskell.org/ghc/ :? for help
Prelude> maxBound :: Int
9223372036854775807
Prelude> import Data.Bits
Prelude Data.Bits> bitSizeMaybe (0 :: Int)
Just 64

Information

Rating
Does not participate
Registered
Activity

Specialization

Specialist
Git
PostgreSQL
Python