Втора задача

  1. Не е ли сбъркан примера на 1вата задача?

    Да се напише функция groupby(func, seq), връщаща речник. Първият аргумент е итеруем обект. Вторият е функция, която връща ключове от речника.

    groupby(lambda x: x % 2, [0,1,2,3,4,5,6,7])

    Публикувано преди
  2. По-скоро е сбъркано описанието, тъй като и даденият протипът е с (func, seq), а и до колкото разбирам примерния тест точно това се очаква да дадем. Иначе и последната задача е малко недоизказана май " Под "кеширани" разбираме, че при извикване с еднакви аргументи" :D

    Публикувано преди
  3. По-интересен въпрос за последната задача (cache()) - как всъщност се дефинират "еднакви аргументи"? :)

    • можем ли да разчитаме на == за списъци?
    • ако не, можем ли да разчитаме на == за елементи на списъка (едва ли, ако не можем да разчитаме на == за целия списък)?
    • ако не, можем ли да разчитаме на id() за елементи на списъка?
    • ако не... какво? :)
    Публикувано преди
  4. ...само да отбележа, че като че ли стигнах сам до отговор, който за момента ме удовлетворява, но ако го изложа, рискувам да разкрия особености на моята реализация на cache(), така че май няма :)

    Публикувано преди
  5. @Илиян и Евгени:

    • да, в groupby аргументите бяха разменени
    • да, в cache условието беше малко недоизказано
    • ... и двете условия са обновени

    @Пенчев:

    • разичтай на == за сравнение
    • няма да пускаме тестове за immutable типове (т.е. списъци)
    Публикувано преди
  6. Мммкей, благодаря! Всъщност под "== за списъци" имах предвид "можем ли да си позволим да сравняваме списъка с параметри на функцията с нещо друго", но отговорът е ясен така или иначе.

    Публикувано преди
  7. Примера на последната задача не е ли сбъркан?

    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 тогава би трябвало да е това като от примера.

    Публикувано преди
  8. Това последното 2 е изхода на интерактивния шел. Той винаги печата и върнатия от израза резултат (освен ако върнатото не е None)

    Публикувано преди
  9. Примерите са копирани от интерпретатор, т.е. всяко написано име или извикване на функция се оценява до някаква стойност която се показва, а понеже double има print в себе си се получава малко объркващо. Принтването си е само веднъж, както е написано, а резултатите, които се показват са от интерпретатора.

    Публикувано преди
  10. Имам проблем с iterate (както и с cache, но проблемът е един и същ): на iterate подаваме функция, но как да вземем стойностите на функцията, която подаваме и да ги използваме в iterate?

    В примерния тест на iterate, на функцията double се дава числото 3, но как да вземем това число 3, за да го използваме в генератора?

    Публикувано преди
  11. Не ти трябва да ползваш аргументите, с които е извикана функцията. Трябва да конструираш нова функция която да ползва подадената, като мята дадения аргумент на въпросната функция.

    Публикувано преди
  12. Функцията която подаваме на iterate от втора задача винаги ли е на точно един аргумент и ако НЕ, как се дефинира композиция на функции на повече от един аргумент ?

    Публикувано преди
  13. @Илиян: Това, което Евгени каза

    @Евгений: Това, което Станко каза

    @Иван: Функциите, които подаваме на iterate винаги имат точно един аргумент. (... но благодаря, че ми даде прекрасна идея за домашното догодина)

    Публикувано преди
  14. Благодаря, Станко, най-накрая успях да я направя... с триста зора. Сега остава и cache да оправя.

    P.S. И все пак няма ли начин да се вземат тези аргументи, а не да се ползва функция, която освен в yield и return е почти безполезна (стойностите, които връща не можеш да ги присвоиш на променлива, не можеш и да я използваш като аргумент на функция, която иска например число, а не функция).

    Публикувано преди
  15. Ми за да си вземеш променливата дефинирай една вложена функция в наща.В нея си зимам този аргомент който подаваш като си го записваш в една променлива nonlocal, която имаш и в главната функция . Просто вършиш всичко във вложената, като на yield меташ вложената но най вероятно има нещо по хитро от това.

    Публикувано преди
  16. @Мирослав Гаврилов: С тоя правопис и пунктуация ме вкара в трета глуха. Имай милост към четящите.

    Публикувано преди
  17. Имам въпрос за cache: cache_size какво да прави, ако приеме 0 или по-малко? Или ако не цяло, а е например 2,5? Или ако искаме безкраен брой запомняния?

    Или да не се занимаваме с такива глупости?

    P.S. @Мирослав: най-добре си редактирай поста. След първия ред стана малко трудно да разбера какво искаш да кажеш. Иначе и аз го направих с вложена функция, ама ми изглежда малко грозно. Пробвах да го направя поне с lambda функция, ама не стана - явно ламбдата мрази цикли. Пробвах и с conditional expression (мисля, че така се казваше: ... = ... if ... else ...), но и там няма цикли). Жалко.

    Публикувано преди
    • Можете да считате, че cache_size е цяло число.
    • Ако е cache_size е 0 се погрижете върнатата функция да не се кешира.
    • Няма да искаме начин по който да създадете безкрайно голям кеш
    • С lambda няма да стане [елегантно] за съжаление. В lambda може да стои само един израз. Преди няколко лекции Стефан показа как това може да се избегне, но това е толкова грозно, че предпочитам да не се говори за това тук.
    Публикувано преди
  18. Под "Ако е cache_size е 0 се погрижете върнатата функция да не се кешира." какво точно имаш в предвид? Функцията все пак да се изпълни (но да не се кешира) или да дава някаква грешка (в момента ми дава "IndexError: pop from empty list", ако cache_size е по-малък или = на 0)? Предполагам, че имаш в предвид първия вариант, ама все пак да попитам...

    Публикувано преди
  19. Относно функцията cache има ли значение кой от изчислените резултати ще изтрием от кеша при неговото препълване?

    Публикувано преди
  20. Ох, тъкмо това исках да питам. Лично аз трия най-стария въведен. Но тъкмо се сетих, че може и да е този, който не е използван от най-много време. Или този, който е най-малко използван (и най-стар или и не е използван най-дълго)...

    Публикувано преди
  21. "... func_cached пази кеширани последните cache_size на брой уникални извиквания..."

    • Това че пазите последните не-знам-колко-си извиквания означава, че при освобождаване на място трябва да триете най-старият елемент от кеша (т.е. имате FIFO cache).


    "Под "Ако е cache_size е 0 се погрижете върнатата функция да не се кешира." какво точно имаш в предвид?"

    • Да се изпълни, но да не се кешира.
    Публикувано преди
  22. Мерси. Значи cache трябва да ми е верен.

    Публикувано преди
  23. Ще качите ли (авторово) решение на домашното?

    Публикувано преди
  24. Предпочитаме да пускаме примерните решения когато пуснем и точките от решенията. Това трябва да се случи следващите няколко дни.

    Публикувано преди

Трябва да сте влезли в системата, за да може да отговаряте на теми.