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

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

В воспитательных целях: зачем это?

Спасибо.


person DopaZilla    schedule 11.05.2018    source источник
comment
Кажется, я вижу как минимум одну ошибку в 4-й строке for multiples in multiple: должно быть for multiple in multiples:   -  person Key Lay    schedule 11.05.2018
comment
Даже после того, как вы это исправите: как вы думаете, что вам дают 0 % 3 и 0 % 5? Если не знаете, попробуйте в интерактивном терминале. А между тем, почему вы считаете, что это неправильно? 0 делится на 3, 5 и любое другое целое число, кроме 0.   -  person abarnert    schedule 11.05.2018
comment
Плохо, что я не скопировал и не вставил его, я набрал его вручную; в моем коде это кратно кратно. Я не знаю, часть меня не думала, что можно разделить 0... но... я думаю, что можно разделить 0 бесконечное количество раз... и это просто никогда ничего. Это кое-что прямо там. Это странно. Но теперь это имеет смысл. Спасибо за это, лол!   -  person DopaZilla    schedule 11.05.2018


Ответы (1)


В этом коде нет ничего плохого, за исключением нескольких опечаток (но все они вызывают 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).

person abarnert    schedule 11.05.2018