19 กรกฎาคม 2559

Published 7/19/2559 by with 0 comment

หลักการแปลงโค้ด PHP มาภาษา Python

สวัสดีผู้อ่านทุกท่านครับ มาพบกับบทความพิเศษ "หลักการแปลงโค้ด PHP มาภาษา Python" เพื่อเป็นแนวทางศึกษาให้กับผู้ที่สนใจแปลงโค้ด PHP มาภาษา Python ครับ

ผมต้องการแปลงโค้ด  PHP จาก http://justmindthought.blogspot.com/2012/12/code-php.html มายังภาษา Python เพื่อนำมาใช้ในงานโมดูล NLP ของผม
การแปลงโค้ดข้ามภาษาด้วยมือตัวเองไม่เคยง่ายอย่างที่คิด

ผมได้ลองแปลงโดยใช้ความรู้ PHP และ Python ที่ผมมี ผมสรุปเป็นข้อ ๆ ได้ดังนี้

  • เอา <? > ออก

  • เปลี่ยน function เป็น def

  • เอา $ เอาทั้งหมด

  • เอา ; ด้านหลังสุด เอาทั้งหมด

  • เปลี่ยน // เป็น # ทั้งหมด

  • เปลี่ยน ++ เป็น +=1 (บวกเพิ่มอีก1)

  • เปลี่ยนการดำเนินการ === เป็น ==

  • เปลี่ยน .= เป็น + และเปลี่ยน . ในบรรทัดเดียวกัน เป็น +

  • เปลี่ยน true , false ให้เป็น True , False

  • ถ้ามี for loop แนะนำให้แปลงเป็น while ใน Python จะง่ายขึ้น

  • จัดคำสั่งที่อยู่ใน {} ตาม Logic เดิมในรูปแบบ Python โดยห้ามปนกัน แล้วเอา {} เอา แทนที่ { ด้วย : หลังคำสั่ง


โค้ดเกือบสมบูรณ์ แต่ผมยังไม่ได้แปลงโค้ดอย่าง number_format() , array() , substr() , strpos() , intval() , fmod()

คำถามคือ เราจะต้องไล่เปิด docs ทั้ง PHP และ Python เพื่อเทียบคำสั่งว่าคำสั่งไหนมีหน้าที่ตรงกันไหม ? (ซึ่งจะต้องใช้เวลานานมาก ...)

ใคร ๆ คงไม่อยากตอบว่า ใช่

ผมขอแนะนำเว็บช่วยเทียบคำสั่ง PHP กับ Python ที่ชื่อว่า php2python.com ครับ

การใช้งานเว็บ php2python.com เราเพียงพิมพ์คำสั่ง PHP ลงไปในช่องค้นหา เช่น  intval เว็บนี้จะมีคำแนะนำให้ว่า  intval คือ int ใน Python นั่นเอง และจะบอกวิธีแปลงคำสั่งและอาจมีการสร้างคำสั่งเลียนแบบ PHP ใน Python ให้ใช้ด้วยครับ

จบปัญหานี้ แต่มีปัญหาที่ผมถือว่าใหญ่มาก ในการแปลงโค้ด  PHP จาก http://justmindthought.blogspot.com/2012/12/code-php.html มายังภาษา Python  คือ โค้ดนี้

[php]
$ret .= (($divider == 10) && ($d == 2)) ? "ยี่" :
((($divider == 10) && ($d == 1)) ? "" :
((($divider == 1) && ($d == 1) && ($ret != "")) ? "เอ็ด" : $number_call[$d]));
$ret .= ($d ? $position_call[$pos] : "");
[/php]

โค้ดเหล่านี้หมายความว่าอะไร ... ????????????????????????????????

มันคือ PHP Shorthand If / Else อ่านได้ที่ http://www.wingfoss.in.th/content/short-if-else (ซึ่งแกะยากมาก) ตอนนี้ผมทำอะไรได้ ผมทำได้แค่เพียงไล่แกะทีละ () ลงไปเรื่อย ๆ ได้โค้ด Python ดังนี้ ????????????

[python]
if (divider == 10) and (d == 2):
ret += "ยี่"
elif (divider == 10) and (d == 1):
ret += ""
elif ((divider == 1) and (d == 1) and (ret != "")):
ret += "เอ็ด"
else:
ret += number_call[d]
if(d):
ret += position_call[pos]
else:
ret += ""
[/python]

พอแปลงโค้ดเสร็จแล้วให้ลองรันเรียกใช้ฟังก์ชันดูครับ
โค้ดฉบับ Python :

[python]
import math
def number_format(num, places=0):
return '{:20,.2f}'.format(num)
# fork by http://justmindthought.blogspot.com/2012/12/code-php.html
def ThaiBahtConversion(amount_number):
amount_number = number_format(amount_number, 2).replace(" ","")
pt = amount_number.find(".")
number,fraction = "",""
amount_number1 = amount_number.split('.')
if (pt == False):
number = amount_number
else:
amount_number = amount_number.split('.')
number = amount_number[0]
fraction = int(amount_number1[1])
ret = ""
number=eval(number.replace(",",""))
baht = ReadNumber(number)
if (baht != ""):
ret += baht + "บาท"
satang = ReadNumber(fraction)
if (satang != ""):
ret += satang + "สตางค์"
else:
ret += "ถ้วน"
return ret

#อ่านจำนวนตัวเลขภาษาไทย
def ReadNumber(number):
"""อ่านจำนวนตัวเลขภาษาไทย รับค่าเป็น ''float'' คืนค่าเป็น ''str''"""
position_call = ["แสน", "หมื่น", "พัน", "ร้อย", "สิบ", ""]
number_call = ["", "หนึ่ง", "สอง", "สาม","สี่", "ห้า", "หก", "เจ็ด", "แปด", "เก้า"]
number = number
ret = ""
if (number == 0): return ret
if (number > 1000000):
ret += ReadNumber(int(number / 1000000)) + "ล้าน"
number = int(math.fmod(number, 1000000))
divider = 100000
pos = 0
while(number > 0):
d=int(number/divider)
if (divider == 10) and (d == 2):
ret += "ยี่"
elif (divider == 10) and (d == 1):
ret += ""
elif ((divider == 1) and (d == 1) and (ret != "")):
ret += "เอ็ด"
else:
ret += number_call[d]
if(d):
ret += position_call[pos]
else:
ret += ""
number=number % divider
divider=divider / 10
pos += 1
return ret

print(ThaiBahtConversion(85.75))
[/python]

ผลลัพธ์

แปดสิบห้าบาทเจ็ดสิบห้าสตางค์

ลองแปลงโค้ดจาก PHP มาภาษา Python กันครับ
ติดตามบทความมต่อไปนะครับ
ชอบคุณครับ
บทความนี้เขียนโดย นาย วรรณพงษ์ ภัททิยไพบูลย์ ชั้น ม.6 โรงเรียนนางรอง  ปัจจุบัน กำลังศึกษาชั้นปีที่ 1 สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์ มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย
อีเมล : [email protected]

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)