Четвърто предизвикателство

  1. Когато пусна примера

    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))

    се държи точно както се изисква. Възможно ли е да е грешка в примера тази ламбда или просто не го правя както трябва?

  2. @Драгомир, няма грешка в примера. Ламбдите са обекти от тип function, а не итератори. В случая подадените ламбди връщат итератори, тоест трябва да вземеш резултата от извикването им, който след това да итерираш. Пример:

    >>> a = lambda : iter([1,2,3])
    >>> a
    <function <lambda> at 0232blabla32x>
    >>> a()
    <list_iterator object at 032x234bla234x>

  3. Имам няколко въпроса и те са: Итераторите безкрайни ли са ? Питам, защото enumerate или chain не си спомням добре ми искаше първото итеруемо множество подавано като аргумент да не е безкрайно. Казано е, че alternate след трябва последователно да връщат елементи от всеки итератор- какво се очаква ако първият връща 4 елемента, а вторият 10, а третият итератор е безкраен направо. За справка в имлементацията на zip_longest се връща празен елемент ако свърши едното итеруемо множество.

  4. @Йончо: от примера можеш да видиш, че може да са безкрайни (но не е задължително). Според това, което Орлин Христов каза по-горе - ако итераторите са с различен брой елементи след като най-късият се изчерпи и се стигне отново до него се хвърля StopIteration. zip_longest би го ползвал ако искаш точно обратното поведение.

  5. @Йончо, всичките итератори може да са безкрайни, това няма значение. Малко вероятно е някоя функция от стандартната библиотека на python да не работи с безкрайни колекции, освен ако очевидно няма как да се дефинира за такива.

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