Имам следния въпрос по функция construct на втора задача: Колкото аргументи има в *args толкова приема всяка една от функциите в списъка functions така ли е? Ако не е то как?
Втора задача
-
Имате да питате нещо по втора задача — тук е мястото.
22.03.2009 -
23.03.2009
-
Точно така е.
23.03.2009 -
Да, това колко аргумента приемат функциите в
functions
не трябва да го проверявате, т.е. няма да има извиквания от вида:construct([lambda x, y: x + y, lambda x, y: x - y], 1) construct([lambda x, y: x + y, lambda x, y: x - y], 1, 2, 3)
23.03.2009 -
За първа задача сте казали, че ако init е различно от None, се смята все едно е в началото на списъка. А ако init е None? Предполагам, че просто се игнорира, ако списъкът има елементи или се връща, ако списъкът е празен.
23.03.2009 -
Според мен init не трябва да се връща ако списъкът е празен, тъй като init = None и функцията ти нищо няма да върне, а при празен списък е добре да върне 0. Останалото според мен е така както ти казваш.
24.03.2009 (променeно 24.03.2009) -
Ако списъкът е празен се връща
init
, независимо от стойността му. Това е единствената смислена стойност за произвнолна операция. 0 е смислена само при събиране на числа – като резултат от празната сума. Ако имаме умножение би трябвало да е 1, конкатенация на списъци – [], низове – '', и т.н.init
се игнорира ако еNone
. Забележете че сума на един елемент е самият елемент, т.е.reduce(lambda x, y: x + y, [x]) == x
. Това трябва да е изпълнено за всяка двоична операция.Нещо което сме пропуснали в условието. Не може да включвате (импортирате) модули във вашето решение. Рализацията трябва да измислите сами.
24.03.2009 (променeно 24.03.2009) -
Може ли да импортваме модула
builtins
? Ако не, то как да извикамlist()
вgroupby(function, list)
?24.03.2009 (променeно 24.03.2009) -
__builtins__.list
Но тъй де, аргументите на функциите не е нужно да се казват
list
. Обновил съм условието.24.03.2009 -
А дали е възможно на функцията reduce да се подаде ето това като аргумент: reduce(lambda x, y: len(x)+len(y), ['toni', 'stoqn','kalin'],'ivan')
24.03.2009 -
Не е коректно и би трябвало да хвърли грешка.
24.03.2009 -
Преди малко бях писал въпрос по темата, но после си отговорих сам :) В този ред на мисли- как се трие пост от форума?
26.03.2009 (променeно 26.03.2009) -
Най-добре беше да не махаш въпроса, а да напишеш отговора под него. Сигурно щеше да помогнеш на някого с него.
27.03.2009 -
Отговори и теми трием само ние.
27.03.2009 -
Имам въпрос свързан с функцията compose:
functions може да е празен, тогава compose трябва да се държи като идентитета.
Идентитетът на какво - на функцията funct(т.е връщаме функцията funct) или на аргументите, които приема функцията, върната от compose(т.е връща самите аргументи)?
27.03.2009 (променeно 27.03.2009) -
Относно compose(func, *functions) спрямо условието func може да бъде всякаква, следователно връщаната функция от функции резултат от compose , например composition(x) взема аргумент x и този аргумент е също така аргумент на func - func(x), понеже така е заданието. От това възниква следния проблем, как може да разберем func, какъв тип аргумент иска, за да сме сигурни че func(x), ще даде резултат? Как да проверим дали този резултат, може да бъде аргумент на function in functions, респективно?
27.03.2009 (променeно 27.03.2009) -
@Ива,
compose се държи като идентитета, а не връща идентитета:
compose(f)(x) == f(x) # за всяко x (съответно произволни аргументи)
@Добри,
Няма смисъл да се проверява, пък и в общият случай е невъзможно понеже имената в Пайтън нямат тип, само стойностите имат. Въпросът е еквивалентен на: "имаме f(g(h(x))), как Пайтън знае..." – в общият случай не знае и грешките се проявяват по време на изпълнение. Пайтън не се опитва да ги предотврати преди това.
Резултатът от compose трябва да се държи точно като последователно прилагане на указаните функции, съответно ако в това прилагане възникне грешка, при използването на резултатът от compose с такива аргументи трябва да възникне същата грешка.
27.03.2009 (променeно 27.03.2009) -
Извянявам се за тъпия въпрос, но в момента могат ли да се изпращат задачи, защото аз не откривам как.
27.03.2009 -
След края на условието на текущата задача има бутон "Изпрати решение".
27.03.2009 -
В решението на reduce трябва да се провери дали итератора seq е празен. В този ред на мисли, какъв е най-правилния начин да се провери дали даден итератор е празен?
Очевидното решение len(seq) != 0, не работи за всякакви итератори, например:
>>> len(iter(range(0))) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'range_iterator' has no len() >>> len(i for i in range(3)) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'generator' has no len()
Правилния начин е да се копира итератора, да му се извика next() и ако той хвърли StopIteration значи е празен. Доста тромаво решение.
Има ли по-хитър начин в Python 3?
27.03.2009 (променeно 27.03.2009) -
Няма начин да провериш дали итератор е празен. Трябва да викнеш
next()
и да ловиш изключения. Но все пак, има доста конструкции (list()
,for
и т.н.), които ще направят това вместо теб.27.03.2009 -
Ако си стиснеме ръцете, че на reduce няма да се подава seq, без
__len__
, няма да добавямseq = list(seq)
в мойто решение. ОК?
27.03.2009 -
На
reduce
ще се дават неща, които могат да се обърнат до списък, да :)27.03.2009 -
def reduce(dyad, seq, init = None): seq = list(seq) # Stefan is being a bastard =-) ...
27.03.2009 -
Не виждам какво общо има истинността на коментара с кода.
27.03.2009