Python Fizzbuzz игнорирует «и», но почему?

#python #fizzbuzz

Вопрос:

Я буквально две недели изучаю Python. Я могу заставить печально известную шипучку печатать шипучку или жужжание, но она игнорирует мою функцию «и», и я не понимаю, почему? Я мог бы взглянуть на готовые решения, но я действительно не хочу этого делать, и почти любое исследование, которое я провожу, почти незаметно проникает в решение. Я просто хочу понять, что не так с этой строкой. Вместо того, чтобы просто хватать готовый код, чтобы сдать его.

     for packers in range(1,101):
        if packers % 3 == 0:
            print("Fizz")
        elif packers % 5 == 0:
            print("buzz")
        elif packers % 3 == 0 and packers % 5 == 0:
            print("Fizzbuzz")
        else:
            print(packers)
 

Комментарии:

1. Вам нужно изменить порядок проведения тестов. Все, что одновременно делится на 3 и 5, уже будет поймано предыдущим тестом. Например, 15 % 3 == 0. Он никогда не проходит дальнейшие испытания.

2. Один из других случаев совпадает с первым…

3. Аааа, даже при использовании этих «или», » и » и т. Д., В каком порядке они имеют значение? Хорошо, я сделаю некоторую перестановку кода. Я думал буквально сверху вниз, основываясь на инструкциях. Сначала решите одну строку задачи, затем переходите к следующей задаче и т. Д.

4. Важно не or «и and «, а то, как это if...elif работает. Выполняется первый соответствующий блок в if..elif..elif...else цепочке, все остальные пропускаются. Выяснение того, как правильно выразить инструкции на английском языке в коде (что означает изменение порядка, в котором вы приказываете компьютеру что-то делать), — это почти весь смысл упражнения. 🙂

Ответ №1:

Проблема в том, что:

  1. Если число делится на 3 или 5, либо packers%3 или packers%5 принимает значение True еще до того, как у него появится возможность выполнить приведенные ниже условия.
  2. И когда оба эти 2 условия не выполняются (число не делится на 3 и 5), это не так packers%3 и packers%5 будет равно 0.

Вам нужно сначала проверить, делятся ли они оба

   for packers in range(1,101):
        if packers % 3 == 0 and packers % 5 == 0:
            print("Fizz")
        elif packers % 5 == 0:
            print("buzz")
        elif packers % 3:
            print("Fizzbuzz")
        else:
            print(packers)
 

Ответ №2:

Вам следует переключить второй и третий блоки elif.

Прямо сейчас ваш второй блок elif похож на глобальный набор. Он выведет buzz для любого числа, кратного 5(даже если оно делится на 5 и 3 одновременно). И когда это условие становится ложным, следующее условие никогда не может быть истинным(так как упаковщики%5!=0, вы только что проверили это).

Вместо этого сначала проверьте, делится ли число как на 3, так и на 5, если да, выведите fizzbuzz, если нет, продолжайте проверять, делится ли оно всего на 5