python pour dans la structure de contrôle
Question
Je suis un programmeur php essayant de comprendre la syntaxe de python J'obtiens le de base pour
for i in range(0,5):
en php serait
for ($i = 0; $i < 5; $i++){
mais qu'est-ce que cela fait
for x, y in z:
et quelle serait la traduction en php?
Ceci est le code complet que je traduis en php:
def preProcess(self):
""" plan for the arrangement of the tile groups """
tier = 0
tileGroupNumber = 0
numberOfTiles = 0
for width, height in self._v_scaleInfo:
#cycle through columns, then rows
row, column = (0,0)
ul_x, ul_y, lr_x, lr_y = (0,0,0,0) #final crop coordinates
while not ((lr_x == width) and (lr_y == height)):
tileFileName = self.getTileFileName(tier, column, row)
tileContainerName = self.getNewTileContainerName(tileGroupNumber=tileGroupNumber)
if numberOfTiles ==0:
self.createTileContainer(tileContainerName=tileContainerName)
elif (numberOfTiles % self.tileSize) == 0:
tileGroupNumber += 1
tileContainerName = self.getNewTileContainerName(tileGroupNumber=tileGroupNumber)
self.createTileContainer(tileContainerName=tileContainerName)
self._v_tileGroupMappings[tileFileName] = tileContainerName
numberOfTiles += 1
# for the next tile, set lower right cropping point
if (ul_x + self.tileSize) < width:
lr_x = ul_x + self.tileSize
else:
lr_x = width
if (ul_y + self.tileSize) < height:
lr_y = ul_y + self.tileSize
else:
lr_y = height
# for the next tile, set upper left cropping point
if (lr_x == width):
ul_x=0
ul_y = lr_y
column = 0
row += 1
else:
ul_x = lr_x
column += 1
tier += 1
La solution
self._v_scaleInfo:
est un tableau de n-uplets, probablement, comme [(x, y), (x, y), ...]
so
pour width, height in self._v_scaleInfo:
parcourt le tableau en remplissant la largeur et la hauteur avec les valeurs de tuple.
php irait quelque chose comme:
$scaleInfo = array(array(x,y), array(x,y),...);
for( $i = 0; $i < count($scaleInfo); $i++ ) {
$width = $scaleInfo[$i][0];
$height = $scaleInfo[$i][1];
...
}
Autres conseils
Dans votre exemple simple pour x, y dans z
, z serait une liste de paires de coordonnées, comme [(0,1), (2,5), (4, 3)]
. À chaque tour dans la boucle for, la variable x
obtient la première coordonnée de la paire et y
la seconde.
En python, vous pouvez avoir plusieurs valeurs de retour. Vous pouvez également définir un tuple comme celui-ci
t = (1,2,3)
Pour avoir accès aux éléments de t, vous pouvez procéder comme suit:
a, b, c = t
Alors a a la valeur 1, etc.
Si vous avez un tableau de 2 tuples d'éléments, vous pouvez les énumérer à l'aide du code suivant
z = [(1, 2), (3, 4), (5, 6)]
for x, y in z:
print x, y
qui produit ce qui suit
1 2
3 4
5 6
Supposons que z soit une liste de tuples en Python.
Z = [(1,2), (1,3), (2,3), (2,4)]
ce serait quelque chose comme:
$z = array(array(1,2), array(1,3), array(2,3), array(2,4));
l’utiliser pour x, y dans z donnerait:
z = [(1,2), (1,3), (2,3), (2,4)]
for x, y in z:
print "%i %i" % (x,y)
1 2
1 3
2 3
2 4
so Traduire
for x, y in z:
en PHP serait quelque chose comme:
for ($i=0; $i < count($z); $i++){
$x = $z[$i][0];
$y = $z[$i][1];
Conceptuellement
for x,y in z
effectue en fait une itération à l'aide d'un énumérateur (implémentation spécifique à la langue d'un modèle d'itérateur), car les boucles sont basées sur une itération basée sur l'index.
pour x, y dans z serait sémantiquement comme
for (x=0 ; x<z.length ; x++ )
for (y=1; x<z.length;y++) print z[x],z[y]
Notez que cela fonctionnera pour les n-uplets en python.
C'est à peu près équivalent à (pseudo-code):
For every item i in z:
x = i[0]
y = i[1]
Loop body happens here
Cela signifie que chaque élément de z
contient 2 éléments (par exemple, chaque élément est une liste de 2 éléments).
Cette construction vous permet de parcourir des collections multidimensionnelles. Ainsi, pour une liste 3x2, vous pourriez avoir:
z = [[1,2], [3,4], [5,6]]
for x, y in z:
print x, y
Ceci imprime:
1 2
3 4
5 6
La même construction peut être utilisée dans un dictionnaire, ce qui a du sens aussi une collection à deux dimensions:
z = {1:"one", 2:"two", 3:"three"}
for x, y in z.items():
for x, y in z.items():
print x, y
Ceci imprime:
1 one
2 two
3 three
En Python, cette construction est générale et fonctionne dans toutes les dimensions. En remplaçant notre liste 3x2 d'origine par une liste 2x3, nous pourrions le faire:
z = [[1,2,3], [4,5,6]]
for w, x, y in z:
print w, x, y
Ceci imprime:
1 2 3
4 5 6
En PHP, je pense que vous devez le faire avec un nid pour les boucles. Je ne pense pas qu’il existe une structure permettant de réaliser le type de déconstruction de liste à plusieurs dimensions possible en Python.