Таким образом, сегодня вечером я обманул с концепцией использования моноидов, чтобы играть с ручьями. Идея здесь состоит в том, чтобы разбить относительно абстрактную концепцию в то, что может следовать нубу, и он ударил меня; Почему бы не демонстрировать все эти вещи, используя классический алгоритм Fizz-Buzz.
Как правило, для задачи Fizz-Buzz вы распечатаете «Fizz», если число делится на 3; И, альтернативно, вы печатаете «Buzz», если он делится на 5. Само собой разумеется, вы печатаете «Fizzbuzz», если он делится как на 3 и 5. Теперь простая реализация в Python будет что-то вроде:
def fizz_buzz(n): for i in range(1, n+1): if (i % 3 == 0 and i % 5 == 0): print("{}: FizzBuzz".format(i)) continue if (i % 3 == 0): print("{}: Fizz".format(i)) continue if (i % 5 == 0): print("{}: Buzz".format(i)) fizz_buzz(100)
Хорошо для одного, мне не нравится, что вышеуказанная функция имеет побочные эффекты. Как мы можем ревертировать это использовать потоки? Прежде всего, давайте проясним, что такое поток. Поток – это последовательность объектов, которые могут быть доступны в последовательном порядке. Где приходят моноиды? Ну моноид позволяет нам объединять вещи. Моноид имеет единую ассоциативную «структуру» (в нашем случае это операция «Добавить», которую обеспечивает ZIP). В этом случае, когда у нас есть поток, мы можем объединить несколько моноидов из потока с помощью ZIP. Давайте посмотрим на это в Python:
from itertools import cycle def fizz_buzz(n): """Return an iter list with fizz-buzz""" fizz_buzz = zip(cycle(['', '', '', '', 'Fizz']), cycle(['', '', 'Buzz']), [i for i in range(1, n+1)]) return filter(lambda x: (x[0] != '' or x[1] != ''), fizz_buzz) for i in fizz_buzz(100): print("{}: {}{}".format(i[2], i[0], i[1]))
Из вышеуказанного фрагмента мы сначала генерируем поток «Fizzes» и «Buzzes», то мы объединяем их с Zip
После чего мы фильтруем любой элемент из потока, который не имеет «Fizz» или «Buzz». Свободная печатание Python позволяет нам легко комбинировать и морфировать вещи. Обратите внимание, что Fizz_buzz
Функция возвращает генератор, который имеет свои достоинства.
Если вы хотите функциональные советы по программированию, я публикую интересные чтения на группах Google, я начал некоторое время назад https://groups.google.com/forum/#!Forum/nairobi-functional-programming-community
Оригинал: “https://dev.to/bonfacekilz/fizzbuzz-using-streams-in-python-29k4”