it-swarm.com.de

python einzeilige Funktionsdefinition

Dies muss einfach sein, aber als ein gelegentlicher Python-Benutzer, der einige Syntax bekämpft .. Dies funktioniert:

def perms (xs):
    for x in itertools.permutations(xs): yield list(x) 

Dies wird jedoch nicht analysiert:

def perms (xs): for x in itertools.permutations(xs): yield list(x) 

Gibt es eine Einschränkung für die einzeilige Funktionssyntax? Die Body-Definition (für ...) kann entweder zwei oder eine Zeile für sich sein, und def: kann eine oder zwei Zeilen mit einem einfachen Body sein, aber Die Kombination der beiden schlägt fehl. Gibt es eine Syntaxregel, die dies ausschließt?

18
guthrie

Ja, es gibt Einschränkungen. Nein, das kannst du nicht. Einfach ausgedrückt, können Sie einen Zeilenvorschub überspringen, aber nicht zwei. :-)

Siehe http://docs.python.org/2/reference/compound_stmts.html

Der Grund dafür ist, dass Sie dies tun könnten

if test1: if test2: print x
else:
    print y

Welches ist mehrdeutig. 

27
Lennart Regebro

Wenn Sie müssen eine Zeile haben, machen Sie sie einfach zu einer lambda:

perms = lambda xs: (list(x) for x in itertools.permutations(xs))

Wenn Sie eine kurze for-Schleife zum Generieren von Daten haben, können Sie diese häufig durch Listenverständnis oder einen Generatorausdruck ersetzen, der etwa die gleiche Lesbarkeit bei etwas weniger Platz bietet.

20
Sean Vieira

def perms (xs):

für x in itertools.permutations (xs): Ertragsliste (x)

Sie können exec() verwenden, um dieses Problem zu beheben

exec('def perms (xs):\n  for x in itertools.permutations(xs):\n   yield list(x)\n')

Achtung, fügen Sie indense Leerzeichen oder chr (9) nach\n ein.

Beispiel für if Python in einer Zeile 

for i in range(10):
 if (i==1):
  print(i)

exec('for i in range(10)\n  if (i==1):\n   print(i)\n')

Dies ist Mein Projekt auf GitHub , um mit exec das Python-Programm im interaktiven Konsolenmodus auszuführen

* Hinweis: Mehrere Zeilen werden nur ausgeführt, wenn Sie mit '\ n' enden.