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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top