En python est-il un moyen plus facile d'écrire des 6 boucles for imbriquées?
Ce problème a été faire chez moi pour un certain temps maintenant. Est-il un moyen plus facile d'écrire imbriquée for
boucles en python? Par exemple si mon code est allé quelque chose comme ceci:
for y in range(3):
for x in range(3):
do_something()
for y1 in range(3):
for x1 in range(3):
do_something_else()
y aurait-il un moyen plus facile de faire cela? Je sais que ce code fonctionne, mais lorsque vous tiret au lieu d'utiliser 2 espaces, comme moi, il peut arriver à être un problème.
Oh dans l'exemple il n'y avait que 4 imbriquée for
boucles pour faciliter les choses.
Vous devez vous connecter pour publier un commentaire.
Si vous êtes souvent une itération sur un produit Cartésien comme dans votre exemple, vous pourriez vouloir étudier La version 2.6 de Python est itertools.produit -- ou écrire votre propre si vous êtes dans un précédent Python.
for y in range(3): do_something1() for x in range(3): do_something()
comment puis-je utiliser le produitCette situation est assez courante quand passa au-dessus des espaces multidimensionnels. Ma solution est:
xy_grid = ((x,y) for x in range(30000) for y in range(30000))
.Lorsqu'ils sont confrontés à ce genre de logique de programme, je serais probablement briser la séquence de la boucle en deux ou plus de deux fonctions distinctes.
Une autre technique en Python est d'utiliser interprétations de la liste si possible, au lieu d'une boucle.
En supposant que chaque boucle a une sorte de signification autonome, les sortir dans des fonctions nommées:
Je pourrais peut-être mieux choisir les noms. 😎
Techniquement, vous pouvez utiliser
itertools.product
pour obtenir un produit cartésien de N séquences, et d'itérer sur que:Mais je ne pense pas que gagne véritablement quelque chose de lisibilité-sage.
Python itérateurs, générateurs et, en particulier, existe exactement pour permettre à la belle refactoring d'ailleurs compliqué de boucles. Bien sûr, il est difficile d'obtenir une abstraction à partir d'un exemple simple, mais en supposant que le
3
doit être un paramètre (peut-être l'ensemble de larange(3)
devrait l'être?), et les deux fonctions que vous appelez besoin de certains paramètres qui sont les variables de boucle, vous pouvez refactoriser le code:dans, par exemple:
Exactement le type de refactoring aurez sans doute besoin d'être modifié pour votre exacte, mais le point de vue général que les itérateurs (et en fait de simples générateurs de moyens très agréable refactorings de boucles demeure, tous les le bouclage de la logique va à l'intérieur du générateur, et le niveau de l'application du code est à gauche avec de simples
for
boucles d'application pertinent pour le traitement des éléments a donné dans les boucles for.Mon argument serait que vous êtes susceptible de faire quelque chose de mal, si vous avez des 6 boucles imbriquées...
Cela dit, décomposition fonctionnelle est ce que vous cherchez. Refactoriser de sorte que certaines des boucles d'arriver à séparer les appels de fonction, puis d'appeler ces fonctions.
À partir de votre code, il semble que vous souhaitez effectuer une opération avec chaque paire de points où x et y sont dans la plage 0..2.
À faire:
L'opération
do_something_with_two_points
sera appelé 81 fois - une fois pour chaque combinaison possible de points.Avez-vous regardé dans Interprétations De La Liste?
Quelque chose comme:
De cette façon l'air assez simple et facile. Êtes-vous dites que vous voulez généraliser à de multiples niveaux de boucles.... pouvez-vous donner un exemple concret?
Une autre option que je pouvais penser, serait d'utiliser une fonction pour générer les paramètres et ensuite il suffit de les appliquer dans une boucle
vous pouvez également utiliser le map() la fonction