fizzbuzz.py

Ето как бих решил FizzBuzz проблема, в оригиналния му вариант, където дори принтираме, вместо да връщаме речник:

for n in range(1, 101):
    if n % 3 == 0 and n % 5 == 0:
        print ‘FizzBuzz’
    elif n % 3 == 0:
        print ‘Fizz’
    elif n % 5 == 0:
        print ‘Buzz’
    else:
        print n

Просто, нали? Но да мотивирам това решение:

Първо, основната идея на Python е да го ползваме да пишем чист код. За толкова проста и тривиална задача, map-ове и filter-и трудно са „чист код“. Така най-лесно ще прокомуникирам идеята с евентуалния читател на кода ми, отколкото ако вдигна целия функционален апарат, където ще го оставя да гледа тъпо (както няколко студента оставиха преподавателите да гледат тъпо с три lambda-и една в друга, разделени с ifilter и двуместни imap-ове).

Второ, обърнете внимание как не деля на 15, а използвам логическа конюнкция (тъй де, ползвам and). Както казваше доц. (мисля че това му беше титлата) Моско Аладжем, „като направите първата версия на едно приложение, само 5-10% от кода ще са бавни и ще имат нужда от оптимизация“. Аз бих добавил, че ако един код не ви бави приложението, няма нужда да го оптимизирате. И лафа „ама може по-натам да го бави“ рядко минава, защото (1) трудно можете да предположите какво ще правите по-нататък, (2) дали то е ви бави наистина и (3) да го оправите по-късно, ако (1) и (2) не минат. Тъй де, така или иначе няма голям шанс да познаете, не си усложнявайте живота. Обръщам специално: това, че n % 5 == 0 and n % 3 == 0 е еквивалентно на n % 15 == 0 е очевидно само за хора, занимаващи се достатъчно математика. Не пишете трудно четим код само защото, може би, ще работи по-бързо и евентуално това ще има някакво значение за приложението ви.

И трето, това е варианта който веднага ми хрумна. Прост и интуитивен. Убеден съм, че ще ми отнеме доста повече време да измисля някаква „хакерия“ отколкото ми отне да напиша този вариант. Отделяйте излишно време да правите глезотии, когато има нужда от това – в този случай, всичко различно от тривиалното решение според мен е лошо.

И все пак, за да видите че и аз мога да съм хакер, да ви покажа как аз бих омазал задачата

map(sys.stdout.write, (((not n%3 and ‘Fizz’ or "")+(not n%5 and ‘Buzz’ or "") or str(n)) + \n for n in range(1, 101)))

Един map, няма lambda, само импортнете sys. Може да е фешън, ама нищо не ми разбрахте, нали? Ама пък работи 😛

Вашият коментар

Вашият имейл адрес няма да бъде публикуван. Задължителните полета са отбелязани с *