Python für in Kontrollstruktur
Frage
Ich bin ein PHP -Programmierer, der versucht, Python für in Syntax zu verstehen. für in
for i in range(0,5):
in PHP wäre sein
for ($i = 0; $i < 5; $i++){
Aber was macht das?
for x, y in z:
Und was wäre die Übersetzung zu PHP?
Dies ist der vollständige Code, den ich in PHP übersetzt:
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
Lösung
self._v_scaleInfo:
ist eine Reihe von Tupeln vermutlich wie [(x,y),(x,y),...]
Alsofor width, height in self._v_scaleInfo:
Schleifen Sie durch die Array -Füllbreite und Höhe mit den Tupelwerten.
PHP würde ungefähr gehen wie:
$scaleInfo = array(array(x,y), array(x,y),...);
for( $i = 0; $i < count($scaleInfo); $i++ ) {
$width = $scaleInfo[$i][0];
$height = $scaleInfo[$i][1];
...
}
Andere Tipps
In Ihrem einfachen Beispiel for x,y in z
, z wäre eine Liste von Koordinatenpaaren wie [(0,1), (2,5), (4,3)]
. Mit jeder Drehung durch die für die für Schleife, die x
Variable erhält die erste Koordinate im Paar und y
bekommt die zweite.
In Python können Sie mehrere Rückgabewerte haben. Sie können auch ein solches Tupel definieren
t = (1,2,3)
Um Zugriff auf die Elemente in T zu erhalten, können Sie Folgendes tun:
a, b, c = t
Dann hat a den Wert 1 usw.
Wenn Sie ein Array von 2 Element -Tupeln hatten, können Sie sie mit dem folgenden Code durch sie aufzählen
z = [(1, 2), (3, 4), (5, 6)]
for x, y in z:
print x, y
das erzeugt die folgenden
1 2
3 4
5 6
Angenommen, Z ist eine Liste von Tupeln in Python.
Z = [(1,2), (1,3), (2,3), (2,4)]
Es wäre so etwas wie:
$z = array(array(1,2), array(1,3), array(2,3), array(2,4));
Wenn Sie das für x verwenden, würde Y in Z zu: Folgendes führen:
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
Also übersetzen
for x, y in z:
In PHP wäre so etwas wie:
for ($i=0; $i < count($z); $i++){
$x = $z[$i][0];
$y = $z[$i][1];
Konzeptionell
for x,y in z
iteriert tatsächlich mit einem Enumerator (sprachspezifische Implementierung eines Iteratormusters) für Schleifen auf indexbasierter Iteration.
Für x würde y in z semantisch wie sein
for (x=0 ; x<z.length ; x++ )
for (y=1; x<z.length;y++) print z[x],z[y]
Beachten Sie, dass dies für Tupel in Python funktioniert.
Es entspricht ungefähr (Pseudocode):
For every item i in z:
x = i[0]
y = i[1]
Loop body happens here
Es bedeutet, dass jeder Gegenstand in z
Enthält 2 Elemente (zum Beispiel ist jedes Element eine Liste mit 2 Elementen).
Mit diesem Konstrukt können Sie über mehrdimensionale Sammlungen iterieren. Für eine 3x2-Liste könnten Sie:
z = [[1,2], [3,4], [5,6]]
for x, y in z:
print x, y
Dies druckt:
1 2
3 4
5 6
Das gleiche Konstrukt könnte für ein Wörterbuch verwendet werden, das etwas Sinn ist, auch eine zweidimensionale Sammlung:
z = {1:"one", 2:"two", 3:"three"}
for x, y in z.items():
for x, y in z.items():
print x, y
Dies druckt:
1 one
2 two
3 three
In Python ist dieses Konstrukt allgemein und arbeitet in jeder Dimension. Wenn wir unsere ursprüngliche 3x2 -Liste in eine 2x3 -Liste ändern, können wir dies tun:
z = [[1,2,3], [4,5,6]]
for w, x, y in z:
print w, x, y
Dies druckt:
1 2 3
4 5 6
In PHP denke ich, dass Sie dies mit Nest für Loops tun müssen. Ich glaube nicht, dass es ein Konstrukt gibt, um die Art der Dekonstruktion mehrerer Dimensionslisten durchzuführen, die in Python möglich ist.