2015-08-13 13 views
6

Załóżmy, że masz numerację, którą należy umieścić w kolejce items. Oczywiście można to zrobić tak:Umieszczanie wielu elementów w kolejce w pythonie

for i in items: 
    q.put(i) 

Ale czuje się niepotrzebny napisać to w dwóch liniach - to ma być pythonic? Czy nie ma sposobu, aby zrobić coś bardziej czytelny - czyli jak to

q.put(*items) 
+1

Składnia gwiazdka jest przez niektórzy uważani za magię. Pętla for pozwala większości ludzi zrozumieć, co się dzieje. –

Odpowiedz

10

Korzystanie z wbudowanego map funkcję:

map(q.put, items) 

będzie stosować q.put na wszystkie pozycje w liście. Przydatna jedna linijka.


dla Pythona 3, można go używać w następujący sposób:

list(map(q.put, items)) 

czy także:

from collections import deque 
deque(map(q.put, items)) 

Ale w tym momencie, pętla for jest dość bardziej czytelne.

+0

Podczas gdy ja lubię to trochę lepiej, nie sądzę, że jest naprawdę miły - byłoby fajniej w haskell, ale to tylko mój gust. , ale głównym problemem jest to, że działa tylko dla Pythona 2.x – IARI

+0

@IARI, możesz również wykonać '[q.put (i) dla i w pozycji]'. Ale jak wskazałem w mojej odpowiedzi, po prostu użyłbym kodu, który masz w swoim pytaniu. – Cyphase

+1

Edytowane dla obsługi Pythona 3. – FunkySayu

0

Co jest nieczytelne?

for i in items: 
    q.put(i) 

odczytu nie jest taka sama jak „krótka”, a jedna wkładka niekoniecznie bardziej czytelny; dość często jest odwrotnie.

Jeśli chcesz mieć interfejs podobny do q.put(*items), rozważ wykonanie krótkiej funkcji pomocniczej lub podklasy Queue.

+0

podczas gdy masz całkowitą rację, że krótki nie jest tym samym, co czytelny, myślę, że jeśli ktoś będzie znał python nieco 'q.put (* items)' będzie bardziej czytelny, nie zgodziłbyś się? w końcu krótszy jest zawsze bardziej czytelny, jeśli to, co skrót ten jest czytelny czytelnikowi. – IARI

+0

@IARI, nie ma w tym nic złego, choć w przypadku 'Queue.put' nie zawsze byłoby sens umieszczać więcej niż jeden przedmiot naraz, ze względu na blokowanie i limity czasu. Ale jeśli chcesz napisać funkcję pomocnika, która zrobi to za Ciebie (np. 'Put_items (q, * items)' lub w podklasie 'Queue',' q.put_items (* items) '), nie zrobiłbym tego mieć jakiekolwiek zastrzeżenia do tego. Można nawet nazwać to "put", jak powiedziałeś. Zauważ, że wspomniałem obie opcje w mojej odpowiedzi :). – Cyphase

+1

Sądzę, że częściowo odpowiadałem na twoje pytanie, a częściowo na sugestię FunkySayu: 'map (q.put, items)'. – Cyphase

Powiązane problemy