سؤال
أنا مبرمج PHP يحاول فهم Python's لـ في بناء الجملة أحصل على الأساس ل
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:
هي مجموعة من tuples ، مثل ، مثل [(x,y),(x,y),...]
لذاfor width, height in self._v_scaleInfo:
الحلقات من خلال عرض ملء الصفيف والارتفاع مع قيم tuple.
سوف يذهب PHP شيء مثل:
$scaleInfo = array(array(x,y), array(x,y),...);
for( $i = 0; $i < count($scaleInfo); $i++ ) {
$width = $scaleInfo[$i][0];
$height = $scaleInfo[$i][1];
...
}
نصائح أخرى
في مثالك البسيط for x,y in z
, ، ستكون Z قائمة بأزواج الإحداثيات ، مثل [(0,1), (2,5), (4,3)]
. مع كل منعطف من خلال الحلقة ، x
متغير يحصل على الإحداثي الأول في الزوج و y
يحصل على الثاني.
في بيثون ، يمكنك الحصول على قيم إرجاع متعددة. يمكنك أيضًا تحديد مثل هذا
t = (1,2,3)
للوصول إلى العناصر في T يمكنك القيام بما يلي:
أ ، ب ، ج = ر
ثم A له القيمة 1 ، إلخ.
إذا كان لديك مجموعة من العناصر tuples ، فيمكنك التعداد من خلالها باستخدام الكود التالي
z = [(1, 2), (3, 4), (5, 6)]
for x, y in z:
print x, y
الذي ينتج ما يلي
1 2
3 4
5 6
لنفترض أن Z قائمة من tuples في بيثون.
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];
من الناحية المفاهيمية
for x,y in z
يتم تكراره في الواقع باستخدام العداد (تنفيذ اللغة المحددة لنمط Iterator) ، للحلقات تعتمد على التكرار القائم على الفهرس.
بالنسبة إلى x ، سيكون مثل y في Z مثل
for (x=0 ; x<z.length ; x++ )
for (y=1; x<z.length;y++) print z[x],z[y]
لاحظ أن هذا سيعمل مع Tuples في Python.
إنها مكافئة تقريبًا لـ (رمز الزائفة):
For every item i in z:
x = i[0]
y = i[1]
Loop body happens here
وهذا يعني أن كل عنصر في z
يحتوي على عنصرين (على سبيل المثال ، كل عنصر هو قائمة بها عنصرين).
يتيح لك هذا البناء التكرار على مجموعات متعددة الأبعاد ، لذا بالنسبة لقائمة 3 × 2 التي يمكن أن يكون لديك:
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 ، أعتقد أنه يتعين عليك القيام بذلك باستخدام Nest for Loops ، لا أعتقد أن هناك بناءًا للقيام بنوع من تفكيك قائمة الأبعاد المتعددة الممكنة في Python.