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.
3 Réponses :
L'ordre est de gauche à droite. C'est tout élément de rangée de la première ligne sera au carré d'abord. P>
Compréhension de la liste dans Python
Exécuter: égal: p>
Ils ne sont pas égaux et pas équivalent non plus: premier pour code> la boucle iTerate sur des éléments et les carrons sans stocker nulle part, le second construit une liste code> à partir d'éléments carrés
the PEP 202 n'est pas très ... complète, mais vous pouvez trouver des informations dans le Référence de langage Python : P>
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. P> blockquote>
compréhension de la liste de liste
pour code> blocs de gauche à droite. p>Mais dans votre cas, vous avez deux compréhensions de liste ayant chacun un bloc: P >
- Compréhension de la liste extérieure: Faites quelque chose pour chaque
rangée code> dansmatrice code>; li>- compréhension de la liste intérieure (faire quelque chose avec
rangée code>): faites quelque chose d'autre pour chaquex code> dansrangée code>. li>. LI>. ul>C'est pourquoi votre compréhension de la liste est mieux lue de droite à gauche. Il est plus facile de voir avec une fonction: p>
xxx pré> Considérez maintenant une compréhension de deux blocs: p>
xxx pré> vous voyez le laissé à droite commande. Dans le premier cas, vous avez: faire quelque chose pour chaque
rangée code> dansmatrice code>, et que quelque chose est: faites quelque chose d'autre pour chaquex code > Dansrangée code> em>. Dans le second cas, il est: faire quelque chose pour chaquex code> de chaque ligne code> dansmatrice code> em>. P>.Ordre d'exécution H1>
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 em>. 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. P>
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 code> renvoieAucun code>, doncsi non imprimé (...) code> est toujoursVrai code>: p>xxx pré> 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 forte>). p> h1>
Ce sera le même ordre de la liste d'origine