2015-12-05 3 views
0

Я пытаюсь понять значение функций itertools.ifilter() и itertools.islice(), чтобы понять, что такое генераторы.itertools ifilter и islice function and generatorators

import itertools 

def is_even(x): 
    print('is_even called for {}'.format(x)) 
    return (x%2 == 0) 

def even(): 
    return filter(is_even,range(20)) 

def even_ex(): 
    return itertools.ifilter(is_even,range(20)) 
    #return filter(is_even,range(20)) 

unlazy_even = even()[:4] 
lazy_even = even_ex() 
first_four = itertools.islice(lazy_even,0,4) 
print('unlazy even {} lazy even {}'.format(unlazy_even,lazy_even)) 
for item in first_four: 
    print(item) 

Проблема в том, что я действительно хотел бы использовать python 3.5. Но функция itertools.ifilter отсутствует в python 3.5. Также фильтр возвращает filter object вместо списка в python 3.5. Как преобразовать вышеуказанную программу в Python 3.5.

ответ

1

В версии 3.0 функция 2.x filter, которая вернула список, была заменена на itertools.ifilter, которая возвращает итератор. Поэтому замените itertools.ifilter на filter. Я считаю, что это одна из замен, сделанных программой преобразователей 2to3. Чтобы сохранить even нелатных, замените filter(...) на list(filter(...)). Это еще одна замена 2to3.