Python para en la estructura de control
Pregunta
Soy un programador de PHP que trata de entender python's for en sintaxis Obtengo el básico para en
for i in range(0,5):
en php sería
for ($i = 0; $i < 5; $i++){
pero que hace esto
for x, y in z:
y cuál sería la traducción a php?
Este es el código completo que estoy traduciendo a 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
Solución
self._v_scaleInfo:
es una matriz de tuplas, probablemente, como [(x, y), (x, y), ...]
así
para el ancho, altura en self._v_scaleInfo:
recorre el ancho de relleno de la matriz y la altura con los valores de la tupla.
php iría algo así como:
$scaleInfo = array(array(x,y), array(x,y),...);
for( $i = 0; $i < count($scaleInfo); $i++ ) {
$width = $scaleInfo[$i][0];
$height = $scaleInfo[$i][1];
...
}
Otros consejos
En su ejemplo simple para x, y en z
, z sería una lista de pares de coordenadas, como [(0,1), (2,5), (4, 3)]
. Con cada vuelta a través del bucle for, la variable x
obtiene la primera coordenada del par y y
obtiene la segunda.
En Python, puedes tener múltiples valores de retorno. También puedes definir una tupla como esta
t = (1,2,3)
Para obtener acceso a los elementos en t, puede hacer lo siguiente:
a, b, c = t
Entonces a tiene el valor 1, etc.
Si tuviera una matriz de tuplas de 2 elementos, podría enumerarlos usando el siguiente código
z = [(1, 2), (3, 4), (5, 6)]
for x, y in z:
print x, y
que produce lo siguiente
1 2
3 4
5 6
Supongamos que z es una lista de tuplas en Python.
Z = [(1,2), (1,3), (2,3), (2,4)]
sería algo como:
$z = array(array(1,2), array(1,3), array(2,3), array(2,4));
usar eso para x, y en z resultaría en:
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
para traducir
for x, y in z:
en PHP sería algo como:
for ($i=0; $i < count($z); $i++){
$x = $z[$i][0];
$y = $z[$i][1];
Conceptualmente
for x,y in z
en realidad está iterando utilizando un enumerador (implementación específica del idioma de un patrón de iterador), porque los bucles se basan en una iteración basada en índices.
para x, y en z sería semánticamente
for (x=0 ; x<z.length ; x++ )
for (y=1; x<z.length;y++) print z[x],z[y]
note que esto funcionará para tuplas en python.
Es aproximadamente equivalente a (pseudo código):
For every item i in z:
x = i[0]
y = i[1]
Loop body happens here
Significa que cada elemento en z
contiene 2 elementos (por ejemplo, cada elemento es una lista con 2 elementos).
Esta construcción le permite iterar sobre colecciones multidimensionales, por lo que para una lista de 3x2 podría tener:
z = [[1,2], [3,4], [5,6]]
for x, y in z:
print x, y
Esto imprime:
1 2
3 4
5 6
El mismo constructo podría usarse en un diccionario, lo que también tiene sentido en una colección bidimensional:
z = {1:"one", 2:"two", 3:"three"}
for x, y in z.items():
for x, y in z.items():
print x, y
Esto imprime:
1 one
2 two
3 three
En Python, esta construcción es general y funciona en cualquier dimensión, cambiando nuestra lista 3x2 original a una lista 2x3, podríamos hacer esto:
z = [[1,2,3], [4,5,6]]
for w, x, y in z:
print w, x, y
Esto imprime:
1 2 3
4 5 6
En PHP, creo que tienes que hacer esto con nido para bucles, no creo que haya una construcción para hacer el tipo de deconstrucción de lista de múltiples dimensiones que es posible en Python.