Рубрики
Без рубрики

Fizzbuzz, используя ручьи в Python

Использование потоков для распечатки FizzGuzz. Теги с Python, Fizzbzz, функциональным.

Таким образом, сегодня вечером я обманул с концепцией использования моноидов, чтобы играть с ручьями. Идея здесь состоит в том, чтобы разбить относительно абстрактную концепцию в то, что может следовать нубу, и он ударил меня; Почему бы не демонстрировать все эти вещи, используя классический алгоритм 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”