В fizzbuzz, почему программа, использующая dicts, считает, что 0 - это fizzbuzz? - PullRequest
0 голосов
/ 11 мая 2018

Так что я довольно новичок в кодировании, я экспериментировал со всеми разными fizzbuzz'ами и наткнулся на один из них, используя dicts.

Когда я запускаю его, я легко могу изменить любые параметры с одним нажатием клавиши, что хорошо, но я не могу понять, почему сначала печатается fizzbuzz, а затем он выполняет все выбранные мною fizzbuzz.

Вот код, который я использую:

def fizzbuzz(multiples, *args):
    for i in range(*args):
        output = ''
        for multiple in multiples:
            if i % multiple == 0:
                output += multiples[multiple]
        if output == '':
            output = i
        print(output)
multiples={3:Fizz,5:Buzz}
fizzbuzz(multiples, 145)

stall = input("")

Вывод будет идти: FizzBuzz 1 2 Fizz ... и т. Д.

Похоже, 0 - это FizzBuzz ...

Для образовательных целей: для чего это?

Спасибо.

1 Ответ

0 голосов
/ 11 мая 2018

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

Причина, по которой он печатает FizzBuzz, заключается в том, что вы делаете это:

if i % multiple == 0:
    output += multiples[multiple]

А поскольку 0 % 3 == 0 и 0 % 5 == 0, это верно оба раза, поэтому добавляет оба слова.

И это не ошибка. Число 0 делится на 3, 5 и любое другое целое число, кроме 0.

Вы можете быть сбиты с толку, потому что многие программы FizzBuzz - и, вероятно, все дети, которые играют в эту игру в школе - начинают считать с 1 вместо 0. Но range(144) начинается с 0. (Это также заканчивается 143, а не 144.) Возможно, вы хотели позвонить fizzbuzz(multiples, 1, 145).

...