2015-08-13 13 views
6

Angenommen, Sie haben eine iterierbare items, die Elemente enthält, die in eine Warteschlange gestellt werden sollen q. Natürlich können Sie es wie folgt tun:Mehrere Elemente in eine Python-Warteschlange einfügen

for i in items: 
    q.put(i) 

Aber es fühlt sich überflüssig diese Zeilen in zwei zu schreiben - ist das denn pythonic sein? Gibt es keine Möglichkeit, etwas besser lesbar machen - das heißt wie diese

q.put(*items) 
+1

Der Stern Syntax ist durch manche gelten als magisch. Die For-Schleife macht den meisten Leuten klar, was vor sich geht. –

Antwort

10

Verwendung des eingebauten in map Funktion:

map(q.put, items) 

Es q.put auf alle Ihre Elemente in der Liste gelten. Nützlicher One-Liner.


Für Python 3, können Sie es wie folgt verwendet werden:

list(map(q.put, items)) 

Oder auch:

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

Aber an diesem Punkt, die for Schleife ist ziemlich besser lesbar.

+0

Während ich das ein bisschen besser mag, denke ich nicht, dass es wirklich nett ist - es wäre schöner in Haskell, aber das ist nur mein Geschmack. aber das Hauptproblem ist: das funktioniert nur für Python 2.x – IARI

+0

@IARI, könnten Sie auch '[q.put (i) für i in Elemente]'. Aber wie ich in meiner Antwort angedeutet habe, würde ich einfach den Code verwenden, den Sie in Ihrer Frage haben. – Cyphase

+1

Bearbeitung für Python 3-Unterstützung. – FunkySayu

0

Was ist daran nicht lesbar?

for i in items: 
    q.put(i) 

Lesbarkeit ist nicht dasselbe wie "kurz", und ein Einzeiler ist nicht unbedingt besser lesbar; oft ist es genau das Gegenteil.

Wenn Sie eine q.put(*items)-ähnliche API verwenden möchten, sollten Sie eine kurze Hilfsfunktion oder Unterklasse Queue erstellen.

+0

während Sie absolut richtig sind, dass short nicht das gleiche wie lesbar ist, würde ich denken, wenn man python ein bisschen weiß 'q.put (* items)' wäre lesbarer, würden Sie nicht zustimmen? am Ende ist kürzer immer lesbarer, wenn das, was die Abkürzung tut, dem gebildeten Leser klar ist. – IARI

+0

@IARI, daran ist natürlich nichts falsch, obwohl es im Falle von 'Queue.put' nicht immer sinnvoll wäre, mehr als ein Element gleichzeitig zu setzen, da es Blockierungen und Timeouts gibt. Aber wenn Sie eine Hilfsfunktion schreiben wollten, um es für Sie zu tun (zB 'put_items (q, * items)' oder in einer Unterklasse von 'Queue',' q.put_items (* items) '), würde ich nicht Einwände dagegen haben. Man könnte es sogar "Put" nennen, wie Sie gesagt haben. Beachten Sie, dass ich beide Optionen in meiner Antwort erwähnt habe :). – Cyphase

+1

Ich glaube, ich antwortete teilweise auf Ihre Frage und teilweise auf FunkySayus Vorschlag von 'map (q.put, items)'. – Cyphase

Verwandte Themen