Условието е тук. Можете да намерите примерния тест в GitHub.
Ако имате въпроси, питайте.
Условието е тук. Можете да намерите примерния тест в GitHub.
Ако имате въпроси, питайте.
Не е ли сбъркан примера на 1вата задача?
Да се напише функция groupby(func, seq)
, връщаща речник. Първият аргумент е итеруем обект. Вторият е функция, която връща ключове от речника.
groupby(lambda x: x % 2, [0,1,2,3,4,5,6,7])
По-скоро е сбъркано описанието, тъй като и даденият протипът е с (func, seq), а и до колкото разбирам примерния тест точно това се очаква да дадем. Иначе и последната задача е малко недоизказана май " Под "кеширани" разбираме, че при извикване с еднакви аргументи" :D
По-интересен въпрос за последната задача (cache()) - как всъщност се дефинират "еднакви аргументи"? :)
...само да отбележа, че като че ли стигнах сам до отговор, който за момента ме удовлетворява, но ако го изложа, рискувам да разкрия особености на моята реализация на cache(), така че май няма :)
@Илиян и Евгени:
groupby
аргументите бяха разменениcache
условието беше малко недоизказано@Пенчев:
==
за сравнениеМммкей, благодаря! Всъщност под "== за списъци" имах предвид "можем ли да си позволим да сравняваме списъка с параметри на функцията с нещо друго", но отговорът е ясен така или иначе.
Примера на последната задача не е ли сбъркан?
func_cached
трябва да връща стойността, и според мене стойността не трябва да се извежда
>>>double_cached = cache(double, 2)
>>>double_cached(1)
called "double"
2
ами
double_cached = cache(double, 2)
double_cached(1)
called "double"
ако му се сложи един print
на double_cached
тогава би трябвало да е това като от примера.
Това последното 2
е изхода на интерактивния шел. Той винаги печата и върнатия от израза резултат (освен ако върнатото не е None
)
Примерите са копирани от интерпретатор, т.е. всяко написано име или извикване на функция се оценява до някаква стойност която се показва, а понеже double има print в себе си се получава малко объркващо. Принтването си е само веднъж, както е написано, а резултатите, които се показват са от интерпретатора.
Имам проблем с iterate (както и с cache, но проблемът е един и същ): на iterate подаваме функция, но как да вземем стойностите на функцията, която подаваме и да ги използваме в iterate?
В примерния тест на iterate, на функцията double се дава числото 3, но как да вземем това число 3, за да го използваме в генератора?
Не ти трябва да ползваш аргументите, с които е извикана функцията. Трябва да конструираш нова функция която да ползва подадената, като мята дадения аргумент на въпросната функция.
Функцията която подаваме на iterate от втора задача винаги ли е на точно един аргумент и ако НЕ, как се дефинира композиция на функции на повече от един аргумент ?
@Илиян: Това, което Евгени каза
@Евгений: Това, което Станко каза
@Иван: Функциите, които подаваме на iterate
винаги имат точно един аргумент. (... но благодаря, че ми даде прекрасна идея за домашното догодина)
Благодаря, Станко, най-накрая успях да я направя... с триста зора. Сега остава и cache да оправя.
P.S. И все пак няма ли начин да се вземат тези аргументи, а не да се ползва функция, която освен в yield и return е почти безполезна (стойностите, които връща не можеш да ги присвоиш на променлива, не можеш и да я използваш като аргумент на функция, която иска например число, а не функция).
Ми за да си вземеш променливата дефинирай една вложена функция в наща.В нея си зимам този аргомент който подаваш като си го записваш в една променлива nonlocal, която имаш и в главната функция . Просто вършиш всичко във вложената, като на yield меташ вложената но най вероятно има нещо по хитро от това.
@Мирослав Гаврилов: С тоя правопис и пунктуация ме вкара в трета глуха. Имай милост към четящите.
Ще гледам да се чете повече за напред.
Имам въпрос за cache: cache_size какво да прави, ако приеме 0 или по-малко? Или ако не цяло, а е например 2,5? Или ако искаме безкраен брой запомняния?
Или да не се занимаваме с такива глупости?
P.S. @Мирослав: най-добре си редактирай поста. След първия ред стана малко трудно да разбера какво искаш да кажеш. Иначе и аз го направих с вложена функция, ама ми изглежда малко грозно. Пробвах да го направя поне с lambda функция, ама не стана - явно ламбдата мрази цикли. Пробвах и с conditional expression (мисля, че така се казваше: ... = ... if ... else ...), но и там няма цикли). Жалко.
cache_size
е цяло число.cache_size
е 0
се погрижете върнатата функция да не се кешира.lambda
няма да стане [елегантно] за съжаление. В lambda
може да стои само един израз. Преди няколко лекции Стефан показа как това може да се избегне, но това е толкова грозно, че предпочитам да не се говори за това тук.Под "Ако е cache_size е 0 се погрижете върнатата функция да не се кешира." какво точно имаш в предвид? Функцията все пак да се изпълни (но да не се кешира) или да дава някаква грешка (в момента ми дава "IndexError: pop from empty list", ако cache_size е по-малък или = на 0)? Предполагам, че имаш в предвид първия вариант, ама все пак да попитам...
Относно функцията cache има ли значение кой от изчислените резултати ще изтрием от кеша при неговото препълване?
Ох, тъкмо това исках да питам. Лично аз трия най-стария въведен. Но тъкмо се сетих, че може и да е този, който не е използван от най-много време. Или този, който е най-малко използван (и най-стар или и не е използван най-дълго)...
"... func_cached
пази кеширани последните cache_size
на брой уникални извиквания..."
"Под "Ако е cache_size е 0 се погрижете върнатата функция да не се кешира." какво точно имаш в предвид?"
Мерси. Значи cache трябва да ми е верен.
Ще качите ли (авторово) решение на домашното?
Предпочитаме да пускаме примерните решения когато пуснем и точките от решенията. Това трябва да се случи следващите няколко дни.
Трябва да сте влезли в системата, за да може да отговаряте на теми.