Може би сте забелязали, но сме ви пуснали предизвикателство, за да ви накараме малко да упражните материала от снощната лекция.
Условието е малко редкатирано, дано така е достатъчно ясно.
Може би сте забелязали, но сме ви пуснали предизвикателство, за да ви накараме малко да упражните материала от снощната лекция.
Условието е малко редкатирано, дано така е достатъчно ясно.
За всеки случай: ще се тества ли с итератори с различен брой елементи и ако да - какво е очакваното поведение?
Да, приключва изпълнение в момента, в който някой от итераторите приключи. Но това не би трябвало да ви касае по никакъв начин.
Когато пусна примера
mirror_count = alternate(lambda: itertools.count(1, 1), lambda: itertools.count(-1, -1))
ми дава TypeError: 'function' object is not an iterator, но когато махна ламбдата
mirror_count = alternate(itertools.count(1, 1), itertools.count(-1, -1))
се държи точно както се изисква. Възможно ли е да е грешка в примера тази ламбда или просто не го правя както трябва?
@Драго, най-вероятно се опитваш да даваш next
на самата функция lambda
, а преди това трябва да направиш итератор и на него да викаш next
.
@Драгомир, няма грешка в примера. Ламбдите са обекти от тип function
, а не итератори. В случая подадените ламбди връщат итератори, тоест трябва да вземеш резултата от извикването им, който след това да итерираш. Пример:
>>> a = lambda : iter([1,2,3])
>>> a
<function <lambda> at 0232blabla32x>
>>> a()
<list_iterator object at 032x234bla234x>
Благодаря и на двамата, разбрах къде ми е проблема вече :).
Може ли да се подадат 0 аргумента на alternate
?
@Милица, в условието пише, че alternate
"приема произволен брой аргументи", тъй че според мен може и просто при първото итериране директно ще хвърли StopIteration
Имам няколко въпроса и те са: Итераторите безкрайни ли са ? Питам, защото enumerate или chain не си спомням добре ми искаше първото итеруемо множество подавано като аргумент да не е безкрайно. Казано е, че alternate след трябва последователно да връщат елементи от всеки итератор- какво се очаква ако първият връща 4 елемента, а вторият 10, а третият итератор е безкраен направо. За справка в имлементацията на zip_longest се връща празен елемент ако свърши едното итеруемо множество.
@Йончо: от примера можеш да видиш, че може да са безкрайни (но не е задължително). Според това, което Орлин Христов каза по-горе - ако итераторите са с различен брой елементи след като най-късият се изчерпи и се стигне отново до него се хвърля StopIteration
. zip_longest
би го ползвал ако искаш точно обратното поведение.
@Йончо, всичките итератори може да са безкрайни, това няма значение. Малко вероятно е някоя функция от стандартната библиотека на python да не работи с безкрайни колекции, освен ако очевидно няма как да се дефинира за такива.
Какво стана с това предизвикателство? За всички изпратени решения ми изкарва, че въобще не са тествани. Всички ли са верни?
Трябва да сте влезли в системата, за да може да отговаряте на теми.