2017-07-20 1 views
1

Je travaille sur l'application de ce que j'ai appris sur la compréhension des listes et la lecture de Pep 8. Je suis confronté à un dilemme stylistique. Tout d'abord, le code:En python, comment styliser une compréhension de liste compliquée

# 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) 
] 

Pour moi, je pense que Pep 8 sorte de se penche vers emboîtés l'approche pour juste parce que (pour moi), il semble un peu plus intuitive. Peut-être que je n'approche pas assez du formatage de la compréhension de la liste. C'est le meilleur que je pourrais penser pour le formater tout en maintenant l'emballage préféré de 79 col.

Je pense que j'ai une bonne compréhension de la compréhension des listes à ce stade et ils sont certainement adaptés à cette application, mais je pense ... est-il préférable d'utiliser des listes de compréhension uniquement pour utiliser les listes? Peut-être que j'ai juste besoin de repenser complètement mon architecture de code? Je ne m'attends pas à SO pour faire une telle recommandation pour cela (!), Mais peut-être un peu de perspicacité sur quelle approche montrée ci-dessus serait préférable de regarder pour les Pythonistas là-bas!

Modifier: La question recommandée en double (n'a pas vu cette pop-up dans les dupes recommandé lors de la création de la question sinon je n'aurais pas demandé!: D) répond parfaitement à cette question. Je suppose que j'aurais dû lire plus sur ce que l'on entendait par "effets secondaires" de la compréhension de la liste, comme cela semble être le cas avec ma question.

Here's the duplicate link en cas de la marque en double se retire:

Comme toujours, merci pour les grandes réponses SO!

+3

Il n'est pas recommandé d'utiliser la liste des compréhensions effets secondaires. Utilisez simplement une boucle. – AChampion

+0

Le code que vous avez posté donne une erreur de syntaxe à cause de l'impression dans la liste de compréhension. Vous avez peut-être voulu dire '' 'print [[(m, n, piece) pour ...]]' '' – perigon

+0

@ user55449 êtes-vous sûr d'utiliser la bonne version de python? – AChampion

Répondre

2

Je pense que la méthode ci-dessus a une meilleure lisibilité. Et les listes de compréhension génèrent une liste non pas pour faire quelque chose ... c'est juste un effet secondaire.

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

C'est suffisant.

ou vous devez utiliser des listes compréhensibles, puis générer une liste et l'imprimer comme ceci.

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) 

ou

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