2013-02-21 10 views

Odpowiedz

49

Pierwszy ma wartość 0 lub więcej argumentów, każdorazowo oznaczają iterowalny, drugi jeden argument która ma do wytworzenia iterables:

itertools.chain(list1, list2, list3) 

iterables = [list1, list2, list3] 
itertools.chain.from_iterable(iterables) 

ale iterables może być dowolny iteracyjnej, że otrzymuje się iterables.

def generate_iterables(): 
    for i in range(10): 
     yield range(i) 

itertools.chain.from_iterable(generate_iterables()) 

Korzystanie z drugiego formularza jest zwykle przypadek wygody, ale dlatego, że pętle nad wejściem iterables leniwie, jest to również jedyny sposób można łańcuch nieskończony ilość skończonych iteratorów:

def generate_iterables(): 
    while True: 
     for i in range(5, 10): 
      yield range(i) 

itertools.chain.from_iterable(generate_iterables()) 

powyższy przykład daje iterowalny który daje cykliczny wzór numerów, które nigdy nie zatrzyma się, ale nigdy nie zużywa więcej pamięci niż to, co wymaga pojedyncza range() wezwanie.

+2

Nadal nie mogę go pobrać. czy możesz podać różnicę wyjściową i przypadek użycia w praktycznej sytuacji, w której używasz tego, co – user1994660

+8

@ użytkownik1994660: nie ma różnicy wyjściowej. To różnica * wejścia *. Ułatwia korzystanie z niektórych danych wejściowych. –

+0

@ user1994660: Używam drugiego formularza w [tej odpowiedzi] (http://stackoverflow.com/questions/12900444/trying-to-add-to-dictionary-values-by-counting-occurrences-in-a-list -of-list-p/12900577 # 12900577). –

1

Robią bardzo podobne rzeczy. Dla małej liczby iteracji itertools.chain(*iterables) i itertools.chain.from_iterable(iterables) działają podobnie.

Główną zaletą from_iterables jest możliwość obsługi dużej (potencjalnie nieskończonej) liczby iteracji, ponieważ wszystkie z nich nie muszą być dostępne w czasie połączenia.

Powiązane problemy