Два FizzBuzz решения


Ниже приведены два решения проблемы FizzBuzz в Python. Какая из них более "подходящие для Python" и почему это более "подходящие для Python", чем другие?

Решение Одно:

fizzbuzz = ''

start = int(input("Start Value:"))
end = int(input("End Value:"))

for i in range(start,end+1):
    if i%3 == 0:
        fizzbuzz += "fizz"
    if i%5 == 0:
        fizzbuzz += "buzz"
    if i%3 != 0 and i%5 != 0:
        fizzbuzz += str(i)

    fizzbuzz += ' '

print(fizzbuzz)

Решения Два:

fizzbuzz = []

start = int(input("Start Value:"))
end = int(input("End Value:"))

for i in range(start,end+1):
    entry = ''
    if i%3 == 0:
        entry += "fizz"
    if i%5 == 0:
        entry += "buzz"
    if i%3 != 0 and i%5 != 0:
        entry = i

    fizzbuzz.append(entry)

for i in fizzbuzz:
    print(i)


20139
12
задан 13 февраля 2011 в 10:02 Источник Поделиться
Комментарии
5 ответов

Как уже отмечалось, создание списка наиболее предпочтителен, так как позволяет избежать конкатенации строки. Однако ни одно из ваших решений является наиболее подходящие для Python решение:

Всякий раз, когда вы окажетесь добавления в список в цикле for, это хорошая идея, чтобы рассмотреть, является ли вы могли бы использовать вместо понимания списка. Списочные включения не только более подходящие для Python, они обычно быстрее.

В этом случае тело цикла-это немного большая для понимания списка, но это легко исправляется с помощью рефакторинга его в свою собственную функцию, которая почти всегда хорошая идея, дизайну программного обеспечения. Так что ваш код становится:

def int_to_fizzbuzz(i):
entry = ''
if i%3 == 0:
entry += "fizz"
if i%5 == 0:
entry += "buzz"
if i%3 != 0 and i%5 != 0:
entry = i
return entry

fizzbuzz = [int_to_fizzbuzz(i) for i in range(start, end+1)]

Однако, пока мы здесь мы могли бы просто положить всю логику fizzbuzz также в функцию. Функция может иметь начало и конец в качестве аргумента и возвращает список. Таким образом, ИО-логика, живущих за пределами функции, полностью отделяется от fizzbuzz логика - тоже почти всегда хорошая идея, дизайн-мудрый.

И как только мы сделали это, мы можем положить на размешение кода в случае, если __имя__ == "__основной__": блок. Таким образом, ваш код может быть запущен либо как скрипт в командной строке, который будет выполнять код Ио, или загружен в библиотеку из другого файла Python без выполнения кода ввода-вывода. Так что если вы когда-нибудь чувствую необходимость написать или веб-интерфейс GUI для fizzbuzz, вы можете просто загружать свои функции fizzbuzz из файла, не меняя ничего. Повторное использование за победу!

def fizzbuzz(start, end):
def int_to_fizzbuzz(i):
entry = ''
if i%3 == 0:
entry += "fizz"
if i%5 == 0:
entry += "buzz"
if i%3 != 0 and i%5 != 0:
entry = i
return entry

return [int_to_fizzbuzz(i) for i in range(start, end+1)]

if __name__ == "__main__":
start = int(input("Start Value:"))
end = int(input("End Value:"))
for i in fizzbuzz(start, end):
print(i)

(Обратите внимание, что я сделал int_to_fizzbuzz внутреннюю функцию здесь, потому что нет никаких причин, вы захотите назвать его вне fizzbuzz функция.)

17
ответ дан 14 февраля 2011 в 02:02 Источник Поделиться

Я прочитал хорошее решение с декоратором, и я думаю, что это подходящие для Python способ достижения решения FizzBuzz:

@fizzbuzzness( (3, "fizz"), (5, "buzz") )
def f(n): return n

Генераторы также хорошо подходящие для Python способ получить список номеров.

4
ответ дан 14 февраля 2011 в 11:02 Источник Поделиться

Из моего небольшого опыта работы с Python, я хочу сказать, что второй является более подходящие для Python, так как он использует списки Python и первое-это просто добавление строки, которая вызывает на выходе будет немного некрасиво и слипаются между собой. Хотя вы можете удалить всю дополнительную итерацию путем добавления во временную строку в первом цикле, печать в конце цикла и сброса значения, так что значения не должны быть сохранены для более чем одной итерации.

2
ответ дан 13 февраля 2011 в 10:02 Источник Поделиться

Нет никакой разницы в том, как "весть" эти решения. Обе они вполне приемлемы. Если строка fizzbuzz становится очень длинным, используя список предпочтительнее, так как вы не должны сделать копию строки в каждой итерации, но это очень незначительная проблема.

0
ответ дан 13 февраля 2011 в 11:02 Источник Поделиться

Безусловно, решение двух. Однако, вы могли бы еще больше улучшить, что решение по демпингу вообще конкатенации. Помните, конкатенация строк-это дорого. Поскольку строки являются неизменяемыми, каждый раз, когда вы объединить, новая строка создается. В то время как сборщик мусора может забрать мусор позже, вы по-прежнему идти через счет копирования строк.

Вместо этого, я рекомендую сделать строку формата и вставка элементов через форматирование строк, затем добавляя их в свой список fizzbuzz.

0
ответ дан 13 февраля 2011 в 11:02 Источник Поделиться