2010-11-20 25 views
6

Mit Blick auf diesem Schnipsel von Python-Code schrieb ich:Gibt es eine bessere Möglichkeit, diesen Python-Code zu machen?

return map(lambda x: x[1], 
      filter(lambda x: x[0] == 0b0000, 
        my_func(i) 
       ) 
     ) 

(Hoffnung es selbsterklärend ist)

Ich frage mich, ob Python einen besseren Weg, es zu tun hat?

Ich lernte Python vor einigen Monaten, schrieb ein paar Skripte, und habe es seitdem nicht mehr verwendet. Es bringt mich in eine seltsame Stelle zum Lernen, weil ich genug weiß, um zu tun, was ich will, aber nicht den Anfänger-Instinkt habe, den "richtigen" Weg zu finden. Ich hoffe, diese Frage mich wieder Kurs gestellt wird ...

+0

Ich gehe davon aus 'my_func()' gibt eine Liste von Listen? –

Antwort

9

Ich denke, Ihnen eine Liste Verständnis wollen:

[x[1] for x in my_func(i) if x[0] == 0] 

List Comprehensions sind ein sehr verbreitetes Python-Idiom.

2

Sie so etwas wie verwenden:

return [x[1] for x in my_func(i) if x[0] == 0b0000] 

Viele Menschen, dass „besser“ nennen würde, als ein wenig kürzer und mehr offensichtlich.

(.. Ich zu berücksichtigen versucht sein, wäre es in eine einfache Schleife und if-Anweisung drehen Funktionale Programmierung ist schön, aber einfache Schleifen sind auch nett)

+0

Wie ist eine For-Schleife entweder besser oder offensichtlicher? Das Listenverständnis ist viel besser lesbar, sobald man sich daran gewöhnt hat. – aaronasterling

+1

Soll man 'x [0]' zuweisen? oder soll das "==" sein? –

+1

@Russell Dias: Er meint '==' weil es sonst ein Syntaxfehler ist. –

1

Wenn Sie in Python 3.x schreiben, dann könnte man einen effizienten Generator Ausdruck wie folgt schreiben: return (x[1] for x in my_func(i) if not x[0])

+5

Warum sagst du "Python 3.x"? Das würde in Python 2 gut funktionieren. –

+0

Es gibt einen Unterschied zwischen 'map' in Python 2.x und 3.x. Als ich das letzte Mal nachgesehen habe, hat 'map' in 2.x eine Liste zurückgegeben, verhält sich aber wie ein Generator in 3.x. –

1

In Python 3.x können Sie Auspacken verwenden zu vermeiden x[0] und x[1] verwenden. Auch können Sie prüfen, statt einer Liste Verständnis einen Generator Ausdruck der Rückkehr, wenn Sie nur einmal in einer Schleife über das Ergebnis wollen:

return (y for x,y,*z in my_func(i) if x == 0b0000) 
Verwandte Themen