เพิ่งเริ่มเห็นว่าเป็นภาษาที่เป็นประโยชน์หลายอย่างเมื่อไม่นานมานี้ครับ ยกตัวอย่างเช่น
- Google App Engine ก็ใช้ Python ได้
- .NET ก็มี IronPython ให้ใช้
- บน Linux และ Unix ก็มักจะมีตัวแปลภาษา Python ติดตั้ง ใช้เป็นคงช่วยงานพวก automation ได้ระดับนึง โดยไม่ต้องไปศึกษาพวก shell script ที่ดูยากกว่า
- ไลบรารีเจ๋งๆหลายอย่างของ C++ ที่อาจจะไม่มี “ตัวหุ้ม” (Wrapper) สำหรับภาษาอื่น แต่ก็มักจะมีของ Python ให้เห็นอยู่เนืองๆ เช่น pyOgre, pyQT, …
ก่อนหน้านี้ซักระยะนึง เคยอ่าน Dive into Python ครับ เค้าบอกว่าเป็น Python สำหรับโปรแกรมเมอร์มีกระสบการณ์ เข้าไปอ่านก็อ่านรู้เรื่องนะ แต่มันใช้พลังมากไปหน่อย ก็เลยเลิกอ่าน …
ความพยายามครั้งใหม่เลยลองไปหาหนังสือที่ง่ายกว่ามา คือ Byte of Python อันนี้เป็นสำหรับมือใหม่จริงๆ อธิบายค่อนข้างละเอียด คนเขียนโปรแกรมเป็นแล้วก็พอเอาไปอ่านผ่านๆเร็วๆได้ อ่านจบจะเริ่มเข้าใจ syntax ของ Python มากขึ้น แล้วเขียนโปรแกรมง่ายๆได้ หลังจากจบเล่มนี้ก็เริ่มมีความมั่นใจมากขึ้นที่จะกลับไปอ่าน Dive into Python
หลังจากที่เริ่มเข้าใจ syntax ของภาษา และการเอา module ภายนอกมาใช้ ก็เลยเขียนโปรแกรมง่ายๆเก็บไว้ดู เป็นโปรแกรม TermTweet โปรแกรมเดียวกับที่ใช้เปรียบเทียบ C++ และ C# เมื่อวันก่อน มาเขียนใหม่ ผลลัพธ์ … ต้องบอกว่าแอบอายแทนซีชาร์ปลูกรักเล็กน้อย
>_<
PyTermTweet
import re
import urllib2
from xml.dom.minidom import parse,getDOMImplementation
if __name__ == '__main__':
target = 'http://twitter.com/statuses/user_timeline/6380022.rss'
res_file = urllib2.urlopen(target)
dom = parse(res_file)
elements = dom.getElementsByTagName('item')
for elem in elements:
text = elem.childNodes[1].firstChild.data
url = re.search(r'(http://[^\s]*)', text)
print text
if url != None:
print "link: ", url.group(1)
print '--------------------------------'
สรุปข้อดีที่พบเห็น ดังต่อไปนี้
- การใช้การจัดย่อหน้าแทน block ทำให้ไม่ต้องใช้ { และ } ทำให้โค้ดอ่านง่ายขึ้น ล่ะมั้ง
- เขียนๆไปแล้วรู้สึกตลอดเวลา ว่า Python ออกแบบมาให้พิมพ์สั้น และมีความหมายที่สุด เช่น else if กลายเป็น elif หรือ Null/Nil กลายเป็น None หรือ regex กลายเป็น re หรือ การตัด do-while ออกไป และอีกมากมาย
- โครงสร้างข้อมูลที่ใช้กันบ่อยๆในการเขียนโปรแกรม เช่น list หรือ dictionary มีให้ใช้ทันที และใช้ง่ายมาก (dict = {‘A’:4.0 , ‘A+’: 3.5}) ต่างจากภาษาพวก .NET หรือ Java
- ด้วยความที่เป็น Dynamic Typing ทำให้ไม่ต้องระบุประเภทของตัวแปร โดยตัวแปลภาษามันจะเข้าใจได้เองว่าแต่ละตัวเป็น Type อะไร โค้ดเลยค่อนข้างกระชับ อย่างที่เห็นด้านบน
ณ วันเดียวกัน ไอกร ก็บ่นมาว่า ภาษามันไม่มี interface ให้ใช้ ก็เลยไปอ่านเจอเรื่อง Duck Typing สรุปก็คือว่า Python มันไม่มี Constraint ในรูปแบบของการ Inheritance หรือการ implement interface
สมมติว่ามี method นึงรับพารามิเตอร์เข้ามา แล้วเรียกใช้ method Fly() กับ Sleep() อะไรก็ตามที่ implement สอง method นี้ก็ pass ไปให้ได้ทั้งนั้น มันเลยเป็นที่มาของชื่อ Duck Typing
“ถ้าเห็นนกที่เดินได้เหมือนเป็ด ว่ายน้ำได้เหมือนเป็ด
ร้องได้เหมือนเป็ด นกตัวนั้นเป็นเป็ด”
ข้อเสียของ Duck Typing ตามที่มีการวิพากษวิจารณ์กัน คือ มันทำให้การหลีกเลี่ยงข้อผิดพลาดที่เกิดจากการใช้ Type ผิดนั้น ต้องใช้ “แรง” ในการ Test เยอะขึ้นพอสมควร แล้วการเขียนหรือพัฒนาต่อโดยไม่ทำให้เกิดข้อผิดพลาดด้าน Type เพิ่มขึ้นในอนาคตนั้น ก็ต้องใช้ความเข้าใจในตัวโค้ดที่ทำงานด้วยในระดับหนึ่ง รวมถึงต้องการ Documentation ที่ชัดเจนและละเอียด .. ตรงกับที่ไอกรบ่นเมื่อวานเป๊ะๆ ว่ามันต้องไปไล่อ่าน Class เพิ่มอีก 4 – 5 Classes
เรียนรู้กันต่อไปครับ :)
7e78cd44-cb70-4a56-a779-65d142a2227c|0|.0
OOAD
python, duck-typing