2017-07-20 5 views
1

Ich arbeite an dem, was ich über List Comprehensions und das Lesen von Pep 8 gelernt habe. Ich stoße auf ein stilistisches Dilemma. Zunächst wird der Code:In Python, wie man ein kompliziertes Listenverständnis stylen kann

# Using nested for's and conditionals 
for m, row in enumerate(board): 
    for n, piece in enumerate(row): 
     if (piece == self.color or piece == self.Color): 
      print(m, n, piece) 

# Using list comprehensions 
[ 
    [ 
     print(m, n, piece) 
     for n, piece in enumerate(row) 
     if (piece == self.color or piece == self.Color) 
    ] 
    for m, row in enumerate(board) 
] 

Für mich würde ich Pep 8 Art lehnt sich denken, in Richtung zum Ansatz verschachtelt, nur weil (für mich) etwas intuitiver aussieht. Vielleicht nähere ich mich der Formatierung des Listenverständnisses aber nicht gut genug. Das ist das Beste, was ich mir vorstellen kann, um es zu formatieren und dabei den 79-Farben-bevorzugten Wrap beizubehalten.

Ich denke, ich habe ein gutes Verständnis von Listenkompressen an dieser Stelle und sie sind definitiv für diese Anwendung geeignet, denke ich, aber ... ist es vorzuziehen, List Comprehensions nur für die Verwendung von List Comprehensions zu verwenden?

Vielleicht muss ich nur meine Code-Architektur komplett überdenken? Ich erwarte nicht, dass SO eine solche Empfehlung (!) Macht, aber vielleicht gibt es einen Einblick, welcher Ansatz besser für die Pythonisten da draußen wäre!

Edit: Die empfohlene doppelte Frage (sah nicht, dass dies in den empfohlenen Duplik Pop bei der Erstellung der Frage Pop-up sonst hätte ich nicht gefragt!: D) Adressen diese Frage perfekt. Ich denke, ich hätte mehr darüber nachlesen sollen, was unter "Nebenwirkungen" von Listenergänzungen zu verstehen ist, wie dies bei meiner Frage eindeutig der Fall zu sein scheint.

Here's the duplicate link im Fall wird die doppelte Markierung entfernt:

Wie immer, danke für die großen Antworten SO!

+3

Es ist nicht zu verwenden Listenkomprehensionen für Nebenwirkungen empfohlen. Benutze einfach eine Schleife. – AChampion

+0

Der Code, den Sie gepostet haben, verursacht einen Syntaxfehler, weil das Drucken innerhalb des Listenverständnisses erfolgt. Sie haben vielleicht gemeint '' 'drucken [[(m, n, piece) für ...]]' '' – perigon

+0

@ user55449 Sind Sie sicher, dass Sie die richtige Version von Python verwenden? – AChampion

Antwort

2

Ich denke obige Methode hat bessere Lesbarkeit. Und list comprehensions generieren Liste nicht für etwas zu tun ... es ist nur Nebeneffekt.

for m, row in enumerate(board): 
    for n, piece in enumerate(row): 
     if piece == self.color or piece == self.Color: 
      print(m, n, piece) 

Es ist genug.

oder Sie müssen List Comprehensions verwenden, dann generieren Sie Liste und drucken Sie es so.

result = [ 
    [ 
     (m, n, piece) 
     for n, piece in enumerate(row) 
     if piece == self.color or piece == self.Color 
    ] 
    for m, row in enumerate(board) 
] 
print (result) 

oder

for res in result: 
    m, n, piece = res 
    print (m, n, piece) 
Verwandte Themen