2016-03-31 5 views
3

Das folgende ist total gefälschter Code. Nehmen wir an, Sie mussten einige zusätzliche Funktionsaufrufe ausführen (zum Debuggen in Protokollen). Wie würdest du das tun?Python fügt zusätzlichen Code zu inline for loops hinzu?

[ i for i in range(10) ] 

Oder muss man immer als normale for-Schleife umschreiben?

list=[] 
for i in range(10): 
    otherStuff() 
    list.append(i) 

In C gibt es ein Komma-Operator für solche Dinge ...

+2

'[einige_Funktion (i) für i in Bereich (10)]'? – jDo

+5

IMHO, wenn die Funktion für ihre Nebenwirkungen aufgerufen wird, sollte eine explizite Schleife verwendet werden. Wenn eine Funktion für ihren Rückgabewert aufgerufen wird, sollte Listenverständnis verwendet werden. –

+0

Komma-Operator in C? Worüber redest du? – freakish

Antwort

3

Sie müssen einen Code zu Ihrem Code mit Nebeneffekten irgendwo in Ihren Wertausdruck aufnehmen, aber Sie müssen diesen Wert ignorieren.

or ist eine mögliche Wahl dafür. Stellen Sie nur sicher, dass Ihre Nebeneffektfunktion einen "Falsey" -Wert (False, None, 0 usw.) zurückgibt, und setzen Sie Ihren Debug-Aufruf auf die linke Seite des or.

def debug_func(i): 
    print i, i**3 
    return None 
whole_numbers = [ debug_func(i) or i for i in range(10) ] 
print whole_numbers 

Als Alternative könnte Ihre Funktion eine Identitätsfunktion sein, immer das einzige Argument der Rückkehr:

def debug_func(i): 
    print i, i**3 
    return i 

# Production code: 
whole_numbers = [i for i in range(10)] 

# Debug code 
whole_numbers = [debug_func(i) for i in range(10)] 
+2

Ps. Ich stimme anderen zu. Tu das nicht. Aber du hast nicht gefragt, ob du es tun solltest, du hast gefragt, wie ** du es tun könntest. –

+4

Es ist wichtig, dass Ihre Nebeneffektfunktion hier einen Falsey-Wert zurückgibt! Das ist offensichtlich, wenn Sie dieses Konstrukt schon vorher gesehen haben, aber weniger so. :) –

+0

Dies ist rein zum Debuggen eines Stapels von Listen-Comprehensions. Ich verspreche sparsam zu sein. ;) – Chris

6

Ganz offensichtlich keine Nebenwirkungen in Listenkomprehensionen verwenden. Es macht Ihren Code unglaublich unklar für die nächste Person, die es zu pflegen hat, auch wenn Sie es perfekt verstehen. List Comprehensions sind eine prägnante Möglichkeit, eine Liste zu erstellen, nicht eine Möglichkeit, eine Funktion n mal aufzurufen.

Weiterführende Literatur finden Sie die Frage Is it Pythonic to use list comprehensions for just side effects?

Mit anderen Worten, sollten Sie eine explizite for Schleife dafür.

+0

In diesem Fall ist es für temporären Debugging-Code. – Chris

+1

@Chris Programmierer-Zeit gegen Benutzerfreundlichkeit ist ein üblicher Kompromiss. Es empfiehlt sich, eine explizite For-Schleife zu verwenden. YMMV –

+0

@Chris Sie möchten das Listenverständnis aufklären? Macht nicht viel Sinn. Drucken Sie es einfach danach aus. – freakish

1

Hier ist eine Option, die nicht alles benötigt, was Ihre Funktion zurückgibt:

[(myfunc(), i)[1] for i in range(10)] 

Sie können auch zu einem Zeitpunkt mehr als eine Funktion tun:

[(myfunc(), myfunc2(), i)[-1] for i in range(10)] 
Verwandte Themen