質問
私はpythonの構文を理解しようとしているphpプログラマです 基本的な for in
を取得します。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
解決
self._v_scaleInfo:
は、おそらく [(x、y)、(x、y)、...]
のようなタプルの配列です
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];
...
}
他のヒント
簡単な例では、 zのx、y
の場合、zは [(0,1)、(2,5)、(4、 3)]
。 forループを通るたびに、 x
変数はペアの最初の座標を取得し、 y
は2番目の座標を取得します。
Pythonでは、複数の戻り値を持つことができます。このようなタプルを定義することもできます
t = (1,2,3)
tの要素にアクセスするには、次の操作を実行できます。
a、b、c = t
aの値は1などです。
2要素のタプルの配列がある場合、次のコードを使用してそれらを列挙できます
z = [(1, 2), (3, 4), (5, 6)]
for x, y in z:
print x, y
次を生成します
1 2
3 4
5 6
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));
zのx、yにそれを使用すると、次のようになります。
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翻訳
for x, y in z:
PHPへの変換は次のようになります:
for ($i=0; $i < count($z); $i++){
$x = $z[$i][0];
$y = $z[$i][1];
概念的に
for x,y in z
ループはインデックスベースの反復に基づいているため、実際には列挙子(反復子パターンの言語固有の実装)を使用して反復しています。
zのx、yの意味は次のようになります
for (x=0 ; x<z.length ; x++ )
for (y=1; x<z.length;y++) print z[x],z[y]
これは、Pythonのタプルで機能することに注意してください。
(擬似コード)とほぼ同等です:
For every item i in z:
x = i[0]
y = i[1]
Loop body happens here
z
のすべてのアイテムに2つの要素が含まれることを意味します(たとえば、すべてのアイテムは2つのアイテムのリストです)。
このコンストラクトを使用すると、多次元コレクションを反復処理できるため、3x2リストを作成できます。
z = [[1,2], [3,4], [5,6]]
for x, y in z:
print x, y
これは印刷します:
1 2
3 4
5 6
同じ構造を辞書で使用することもできますが、これはある意味2次元のコレクションでもあります:
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では、ネストforループを使用してこれを行う必要があると思いますが、Pythonで可能な多次元リストの分解のような処理を行う構造はないと思います。