-2
votes

Ordre d'exécution de la compréhension de la liste Python

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
squared = [[x**2 for x in row] for row in matrix]
print(squared)
In the preceding data structure and list comprehension, what is the order of execution? Visually it appears to process from right to left. Considering the nested list first has to be access before each of its individual items can be squared.

1 commentaires

Ce sera le même ordre de la liste d'origine


3 Réponses :


0
votes

L'ordre est de gauche à droite. C'est tout élément de rangée de la première ligne sera au carré d'abord.


0 commentaires

0
votes

Compréhension de la liste dans Python Exécuter: xxx

égal: xxx


1 commentaires

Ils ne sont pas égaux et pas équivalent non plus: premier pour la boucle iTerate sur des éléments et les carrons sans stocker nulle part, le second construit une liste à partir d'éléments carrés



2
votes

ordre des éléments

the PEP 202 n'est pas très ... complète, mais vous pouvez trouver des informations dans le Référence de langage Python :

La compréhension consiste en une seule expression suivie d'au moins une pour la clause et zéro ou plus pour ou si des clauses. Dans ce cas, les éléments du nouveau conteneur sont ceux qui seraient produits en considérant que chacun des clauses ou s'il est clause un bloc, niché de gauche à droite et en évaluant l'expression pour produire un élément chaque fois que le bloc intérieur est atteint. [...] L'expression iTable dans la clause la plus à gauche est évaluée directement dans la portée jointe, puis transmise comme une dispute à la portée impliquée impliquée.

compréhension de la liste de liste pour blocs de gauche à droite.

Mais dans votre cas, vous avez deux compréhensions de liste ayant chacun un bloc:

  • Compréhension de la liste extérieure: Faites quelque chose pour chaque rangée dans matrice ;
  • compréhension de la liste intérieure (faire quelque chose avec rangée ): faites quelque chose d'autre pour chaque x dans rangée . . .

    C'est pourquoi votre compréhension de la liste est mieux lue de droite à gauche. Il est plus facile de voir avec une fonction: xxx

    Considérez maintenant une compréhension de deux blocs: xxx

    vous voyez le laissé à droite commande. Dans le premier cas, vous avez: faire quelque chose pour chaque rangée dans matrice , et que quelque chose est: faites quelque chose d'autre pour chaque x Dans rangée . Dans le second cas, il est: faire quelque chose pour chaque x de chaque ligne dans matrice . .

    Ordre d'exécution

    C'est la question que vous avez posée, même si je ne sais pas que c'est la question que vous vouliez poser! Dans quel ordre l'opération est effectuée? La spécification ne semble rien dire sur cette question, mais la réponse est la suivante: Peu importe, tant que vous évitez les effets secondaires dans vos compréhensions de liste . Si vous obtenez une liste d'une liste de compréhension de la liste (aucune exception soulevée), cette liste est garantie à compléter, quelle que soit sa construction.

    mais si vous ne suivez pas le "Aucun effet secondaire «Règle, l'ordre dans lequel des effets secondaires sont effectués peut changer le résultat final. Vous pouvez utiliser une astuce pour le tester: la fonction impression renvoie Aucun , donc si non imprimé (...) est toujours Vrai : xxx

    La commande semble "naturelle", mais je ne pense pas que vous devriez compter sur elle ( plus important: vous ne devriez pas avoir effets secondaires dans vos compréhensions de liste ).


0 commentaires