Python для в структуре управления - PullRequest
1 голос
/ 26 ноября 2009

Я программист PHP, пытающийся понять Python для синтаксиса Я получаю базовый за

for i in range(0,5):

в php будет

for ($i = 0; $i < 5; $i++){

но что это делает

for x, y in z:

а какой будет перевод на php?

Это полный код, который я перевожу на 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

Ответы [ 7 ]

1 голос
/ 26 ноября 2009

В вашем простом примере for x,y in z, z будет список пар координат, как [(0,1), (2,5), (4,3)]. При каждом повороте цикла for переменная x получает первую координату в паре, а y - вторую.

1 голос
/ 26 ноября 2009

self._v_scaleInfo: представляет собой массив кортежей, предположительно, как [(x,y),(x,y),...], так for width, height in self._v_scaleInfo: перебирает ширину и высоту заполнения массива значениями кортежа.

PHP будет выглядеть примерно так:

$scaleInfo = array(array(x,y), array(x,y),...);

for( $i = 0; $i < count($scaleInfo); $i++ ) {
  $width = $scaleInfo[$i][0];
  $height = $scaleInfo[$i][1];
  ...
}
0 голосов
/ 26 ноября 2009

Эта конструкция позволяет вам перебирать многомерные коллекции, поэтому для списка 3x2 вы можете иметь:

z = [[1,2], [3,4], [5,6]]
for x, y in z:
    print x, y

Это печатает:

1 2
3 4
5 6

Та же самая конструкция может использоваться в словаре, который в некотором смысле является также двумерной коллекцией:

z = {1:"one", 2:"two", 3:"three"}
for x, y in z.items():
    for x, y in z.items():
        print x, y

Это печатает:

1 one
2 two
3 three

В Python эта конструкция является общей и работает в любом измерении, изменяя наш первоначальный список 3x2 на список 2x3, мы могли бы сделать это:

z = [[1,2,3], [4,5,6]]
for w, x, y in z:
    print w, x, y

Это печатает:

1 2 3
4 5 6

В PHP я думаю, что вы должны сделать это с помощью гнезда для циклов, я не думаю, что есть какая-то конструкция для выполнения деконструкции списка многомерного списка, которая возможна в Python.

0 голосов
/ 26 ноября 2009

Концептуально

for x,y in z

фактически выполняет итерацию с использованием перечислителя (реализация шаблона итератора для конкретного языка), поскольку циклы основаны на итерации на основе индекса.

для x, у в z семантически будет похоже на

for (x=0 ; x<z.length ; x++ )
     for (y=1; x<z.length;y++) print z[x],z[y]

обратите внимание, что это будет работать для кортежей в Python.

0 голосов
/ 26 ноября 2009

Предположим, что z - это список кортежей в Python.

Z = [(1,2), (1,3), (2,3), (2,4)]

это было бы что-то вроде:

$z = array(array(1,2), array(1,3), array(2,3), array(2,4));

использование этого для x, y в z приведет к:

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

т. Перевод

for x, y in z:

в PHP будет выглядеть примерно так:

for ($i=0; $i < count($z); $i++){
    $x = $z[$i][0];
    $y = $z[$i][1];
0 голосов
/ 26 ноября 2009

В python вы можете иметь несколько возвращаемых значений. Вы также можете определить кортеж как это

t = (1,2,3)

Чтобы получить доступ к элементам в t, вы можете сделать следующее:

а, б, с = т

Тогда a имеет значение 1 и т. Д.

Если у вас есть массив из двух элементов, вы можете перечислить их, используя следующий код

z = [(1, 2), (3, 4), (5, 6)]
for x, y in z:
   print x, y

, который производит следующее

1 2
3 4
5 6
0 голосов
/ 26 ноября 2009

Это примерно эквивалентно (псевдокод):

For every item i in z:
    x = i[0]
    y = i[1]
    Loop body happens here

Это означает, что каждый элемент в z содержит 2 элемента (например, каждый элемент представляет собой список из 2 элементов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...