Понеже едва ли ще направим инфраструктурата за публикуване на наши решения
скоро, реших да ви дам това на първа задача на форумите. Заслужава си да
разберете решенията ни, понеже от този процес ще научите доста за езика:
def fizzbuzz(n):
def value(x):
if x % 15 == 0: return 'FizzBuzz'
elif x % 3 == 0: return 'Fizz'
elif x % 5 == 0: return 'Buzz'
else: return x
return list(map(value, range(1, n + 1)))
def minmaxmean(ages):
mean = sum(ages.values()) / len(ages)
return tuple(min(ages, key = k) for k in [
ages.__getitem__, lambda n: -ages[n], lambda n: abs(ages[n] - mean)])
def anagrams(words):
anagrams = {}
for word in words:
anagrams.setdefault(''.join(sorted(word)), []).append(word)
return [value for value in anagrams.values() if len(value) >= 2]
Първата функция може да се направи на един ред, но нарочно избрахме
по-четимия вариант. Това е доста любопитен въпрос, за който може да прочетете
повече тук , особено ако някога планирате да ходите на интервю за
работа. Втората е умишлено написана по най-краткия възможен начин и прилага
някои трикове, които ви показахме в лекцията за ООП. Третата пък е написана по
най-праволинейния начин и е пример за каноничен код на Python.
С цел малко забавление, ето и решение на вторите две чрез функциите от втора
задача:
def minmaxmean(ages):
return tuple(construct([curry(func, key = key) for (func, key) in (
(min, ages.__getitem__),
(max, ages.__getitem__),
(min, (lambda mean: lambda n: abs(ages[n] - mean))(sum(ages.values()) / len(ages))))],
ages))
def anagrams(words):
return [group for group in groupby(compose(sorted, tuple), words).values() if len(group) >= 2]
Обърнете внимание колко е кратка anagrams
.
minmaxmean
пък е умишлено усложнена. Някой има ли идея защо
дефинирам анонимна функция, която извиквам непосредствено?
28.03.2009
(променeно 28.03.2009)