python course #1
TRANSCRIPT
Python #1
Chaiwat [email protected]
ลักษณะ และโครงสร้างโดยรวม● Multi-Paradigm
● ใชก้ารเยื้อง (indentation) บง่บอกจุดเริ่มต้นและสิ้นสุดของแต่ละ block
● ตัวแปรเปน็ dynamic type
● Code อ่านง่าย ละเรียนรู้ได้เร็ว● เขียนแล้วทำางานได้ทันที ไม่ต้อง compile
PEP-8 Coding Style Guide
● Guido บอกว่าส่วนใหญ่เรามักจะอ่าน (source) code มากกว่าเขียน ดังนั้น เมื่อจะเขียนจึงควรเขียนให้อ่านง่าย
● PEP-8 มีจุดประสงคเ์พื่อทำาให้ Python code
● อ่านง่าย (readability)
● กลมกลืน (consistency)
PEP-8 Coding Style Guide (cont.)
● เมื่อมีความจำาเป็นที่จะไม่เขียนตาม PEP-8 นั่นเป็นเพราะ● เขียนตาม PEP-8 แล้วอ่านยาก● คนอ่ืนๆ ในทมีไมไ่ด้เขียนตาม PEP-8 อยูแ่ล้ว
– แต่อย่างน้อยน่าจะมีความกลมกลืนกันอยู่ (consistent?)
– หรือมองว่าเป็นโอกาสที่ดีที่จะโน้มน้าวคนในทีมให้ refactor code ให้เป็นไปตาม PEP-8
PEP-8 Code Lay-out
● ใชช้อ่งว่าง (whitespace) 4 ชอ่ง หรือ tab 1 tab สำาหรับการเยื้อง 1 ครั้ง
● ถ้าเป็นไปได้ ไม่ควรใช้ tab เลย● ถ้าต้องใช ้tab อย่าให้มีทั้ง tab และ space ปนกัน● แต่ละบรรทัดไม่ควรเกิน 79 ตัวอักษร (seriously)
● ใชบ้รรทัดว่าง 1 บรรทัดคั่นสว่นต่างๆ ของโปรแกรม
PEP-8 Code Lay-out (cont.)
● ตัวอย่าง
PEP-8 Code Lay-out (cont.)
● Import library 1 ตัวต่อ 1 บรรทัด (มันง่ายตอนลบ)
● Import เกิดขึ้นที่ส่วนบนสุดของไฟล์เสมอ● ตัวอย่าง
PEP-8 การใช้ Whitespace
● อย่าใช ้whitespace พรำ่าเพรื่อ (อย่าลืมว่าแต่ละบรรทัดควรจะยาวแค ่79 ตัวอักษร)
PEP-8 Read More
● http://www.python.org/dev/peps/pep-0008/
● และโปรดจำาไว้เสมอว่าการเขียน Python โดยไม่อ่าน และทำาความเข้าใจ PEP-8 ก่อนนั้นเปน็บาป
PEP-20 The Zen of Python
● ท่านผู้อาวุโสไพธอน Tim Peters ได้ร้อยเรียงแนวทางของท่านเผด็จการใจดีเพื่อชวีิต (BDFL – Guido van Rossum) ออกมาเป็นลำานำา 20 บาท แต่มีเพียง 19 บาทที่ได้รจนา1.สวยงามยอ่มดีกว่านา่เกลียด
2.ชัดแจ้งยอ่มดีกว่าโดยนยั
3.เรียบง่ายยอ่มดีกว่าซับซ้อน
PEP-20 The Zen of Python (cont.)
4.ซับซ้อนยอ่มดีกว่ายุง่เหยิง
5.โปร่งใสยอ่มดีกว่าทบัซ้อน
6.โล่งยอ่มดีกว่าแออัด
7.การอ่านแล้วเข้าใจง่ายจำาเป็นเสมอ
8.กรณีพเิศษ ไม่ได้พิเศษจนต้องแหกกฏ
9.แต่กระนั้นสิ่งทีใ่ช้งานได้ย่อมชนะสิ่งที่บริสุทธ์ิ(เขียนตามกฏแต่ใช้งานไมไ่ด้)
PEP-20 The Zen of Python (cont.)
10.ข้อผิดพลาดไมค่วรถกูปล่อยผ่านอย่างเงียบเชียบ
11.ยกเว้นว่าต้องการปล่อยผ่านแบบตั้งใจ
12.เมือ่เจอความกำากวมจงอยา่คาดเดา
13.มนัควรจะมเีพียงหนึ่งวิธี และเป็นหนึง่วิธีที่ชัดแจ้งในการทำาสิ่งใดๆ
14.แต่กระนัน้วิธีนัน้อาจจะไมช่ัดแจ้งแต่แรกยกเว้นเจ้าจะเป็นชาวดัทช์
PEP-20 The Zen of Python (cont.)
15.ทำาตอนนี้ย่อมดีกว่าไม่ทำาเลย
16.แต่กระนั้นไม่ทำาเลยมักจะดีกว่าต้องทำาเดี๋ยวนี้
17.ถ้าการอิมพลิเมนต์มันอธิบายยาก มันเป็นความคิดที่ไม่ดี
18.ถ้าการอิมพลิเมนต์มันอธิบายง่าย มันอาจจะเป็นความคิดที่ดี
19.เนมสเปซเป็นความคิดทีบ่รรเจิด เรามาทำากันอีกเยอะๆเถอะ!
20.
แปลจาก http://www.python.org/dev/peps/pep-0020/
ชนิดของตัวแปร● String/Unicode a = 'hello there'● Integer b = 7● Floating point c = 3.2● Boolean (True/False) d = True● None e = None● Tuple f = (1,2,3,'a','b','c',0.4)● List g = [1,2,3,'a','b','c',0.4]● Dictionary h = {'id': 'cwt', 'age': 33}● Class instance g = MyClass()
เล่นกบั Tuple List and Dictionary
● Tuple สร้างแล้วแก้ไขสิง่ที่อยู่ภายในไม่ได้● การแก้ tuple คือ ทำาลายตัวเก่าแล้วสร้างตัวใหม่
● List สร้างแล้วแก้ไขสิง่ที่อยู่ภายในได้● นอกจากแก้แลัวยัง ทำาได้อีกหลายอย่าง --> (demo)
● Dictionary คอืตัวแปรประเภท key, value
● สมาชกิของ tutple list และ Value ของ dictionary นั้นจะเปน็อะไรก็ได้ --> (demo)
การกระทำา (operation)
● การกระทำาได้แก่ + - * / % ** &
● Integer กระทำากับ integer จะได้ผลเป็น integer● 3/2 == 1
● ยกเว้น interger ยกกำาลัง (**) กับ integer ที่ติดลบ● 2**-2 == 0.25
● Integer กระทำากับ float จะได้ผลเป็น float● 3/2.0 == 1.5
● + จะกลายเป็น string concat เม่ือใช้กับ string ด้วยกัน● 'asdf' + 'qwerty' == 'asdfqwerty'
การกระทำา (cont.)
● Tuple + tuple หรือ list + list ได้● (1,2) + (3,4) == (1,2,3,4)● [1,2] + [3,4] == [1,2,3,4]
● แต่ tuple + list ไม่ได้● เขียนย่อการกระทำาบางอย่างได้ เช่น
● x = x+1 เขียนได้เป็น x += 1
การกระทำาทาง Logic
● การกระทำางาน Logic เขียนเป็นสัญลักษณก์็ได้ เช่น & | แต่นยิมเขียนเป็นขอ้ความ and or not มากกวา่● X & Y นิยมเขียนเป็น X and Y
● การเปรยีบเทียบตวัแปร กบัค่า True False None จะใช้ is● if x is True: <do something>● if y is not None: <do something>
● การเปรยีบเทียบตวัแปรกับตวัแปร ใช้ == เช่น --> (demo)
● การกระทำางาน Logic จะเขียนแบบยอ่ กไ็ด้ เช่น● X &= (a == b)
Function และการใช้แบบ shell script
● Python จะอ่านไฟล์ตั้งแต่บนลงล่างอยู่แล้ว● ดงันัน้ถา้สั่งให้ทำาอะไรในไฟล์ ก็จะทำาลงมาเปน็ลำาดบั
เชน่เดียวกบั shell script ของ Unix หรือ batch file ของ Windows
● การกำาหนดกลุ่มของ statement ให้เปน็ function จะใช้● def <function name>(var1, var2, ...):
<statement1><statement2>
Function (cont.)
● การกำาหนด function ไม่จำาเป็นต้องรับตัวแปรก็ได้● Function ไม่จำาเป็นต้อง return ค่าใดๆ โดยการไม่สั่ง
return เมื่อจบ function จะถือว่า return None
● ตัวแปรภายใน function ชื่อซำ้ากับข้างนอกได้ เพราะถือว่าเป็น local
● แต่ถ้ากำาหนดชือ่ตัวแปรภายในซำ้ากับตัวแปรข้างนอกแล้ว จะไม่สามารถใชง้านตัวแปรข้างนอกใน function นั้นได้อีก
Python as a script
● ถ้ามี function หลายๆ ตัว ควรจะมี main function เพื่อเรียกใช ้function แต่ละตัวตามลำาดับ
def a(x,y):return x+y
def b(x,y):return x-y
if __name__ == '__main__':a(1,2)
b(3,4)
Python as a script (cont.)
● เหตุที่ต้องมีการกำาหนด● if __name__ == '__main__':
● เพราะต้องการให้ อะไรก็ตามภายใต้ if นี้ ทำาการก็ต่อเมื่อถูกเรียกใชต้รงๆ จากภายนอก เช่น ถูกสัง่ว่า● $ python example.py
● แต่จะไม่ทำางานเมื่อโดน import ด้วย python file อื่น เช่น from example import *● --> (demo)
Python แบบ OOP
● ต้องมีการกำาหนด class
● Class เสมอืนแมพ่ิมพ์ขนม เมือ่แคะขนมออกมา ตัวขนมจะมรีูปร่างเหมอืนแมพ่ิมพ ์แต่กินได้ (คงไมม่ใีครแทะแมพ่มิพ์เล่น)
● Python class ก็เป็นเช่นเดียวกัน● Class instance กำาเนิดจาก class และม ีlife cycle เกิด
ข้ึน ตั้งอยู่ และดับไป สดุทา้ยโดน garbage collector เก็บกวาด
Python แบบ OOP (cont.)
● การกำาหนด class
class MyClass(object):def __init__(self, a):
self.a = a
self.x_file = open('x.txt','r')
def __del__(self):self.x_file.close()
def read_x(self):return self.x_file.reads()
● การสร้าง class instance
my_class = MyClass(1)
Python แบบ OOP (cont.)
● การเรียกใช้ class method● my_class.read_x()
● การ access class property● my_class.a
● เมื่อเลิกใช้ my_class แล้ว สามารถสั่ง● del(my_class)
● คำาสั่งภายใน __del__ ของ class จะทำางานก่อนที่จะปล่อยให้ garbage collector มากำาจัด my_class ทิ้งไป
ทำาไมต้องเขียนแบบ OOP
● Code สะอาดกว่า● Garbage collector ทำางานได้ดีกว่า ทำาให้ใช้
ทรัพยากรของระบบน้อยกว่า● Class จะโดน Python compile ไว้ก่อนให้เปน็
python bytebode อยู่แล้ว ดังนั้นเมื่อมีการสร้าง class instance จะเสีย overhead นอ้ยกว่า นั่นคือโดยรวม code ก็จะทำางานได้เร็วกว่า
ทำาไมต้องเขียนแบบ OOP (cont.)
● เนื่องจาก class มี method พิเศษเพื่อควบคุมการเกิด (__init__) และตาย (__del__) ดังนั้น เราสามารถออกแบบให้ class เตรียมสิง่ที่เราต้องการก่อนใน __ini__ เชน่ เปดิ connection ไปยัง database และเมื่อเราจะเลิกใช ้ก็สัง่ให้ close connection ใน __del__
ทำาไมต้องเขียนแบบ OOP (cont.)
● Class สามารถ สืบทอดได้ ดังนั้นเมื่อทำางานร่วมกับคนอื่น อาจจะมีคนที่เขียน class ดีๆ เอาไว้ก่อน แต่ยังขาดคณุสมบัติที่เราต้องการ เราก็แค ่subclass (inherit) class นั้นมาเพิ่มเติ่มสว่นที่เราต้องการ
การอ่าน/เขียนไฟล์
● Python จะสร้างตัวแปรที่ชี้ไปยังไฟล์บน disk ด้วยคำาสั่ง open เชน่● a = open('a.txt','r') # เปิดไฟล์ a.txt สำาหรับอ่าน● b = open('b.txt','w') # เปิดไฟล์ b.txt สำาหรับเขียน● c = open('c.txt','a') # เปิดไฟล์ c.txt สำาหรับเขียนเพิม่
การอ่าน/เขียนไฟล์ (cont.)
● การอ่านจะใช ้read, readline, readlines
● a.read() จะอ่านตั้งแต่ต้นจนจบไฟล์ออกมาเป็น string
● a.readline() จะอ่านทลีะบรรทดั● a.readlines() จะเหมอืน readline() แต่อ่านไปจนจบไฟล์
ออกมาเป็น list of string
การอ่าน/เขียนไฟล์ (cont.)
● การเขียนจะใช ้write หรือ writelines● b.write('something')● b.writelines(['something1', 'something2'])
● Writelines ใช้เขียน sequence of string เชน่ ตัวอย่างข้างบน คอื list of string
Calculation
● สามารถใช ้python shell เป็นเครื่องคิดเลขได้● --> (demo)
Tristate Conditions
● ใน Python จะมีคา่พิเศษ 3 คา่ คอื True, False, และ None
● Logic operation ระหว่าง True กับ False จะเหมือนกับโปรแกรมอื่นๆ หรือหลักการทางตรรกศาสตร์ทั่วๆ ไป
● None เป็นค่าพิเศษ แปลว่า ไม่มีอะไร ไม่ใช ่True ไม่ใช่ False
Tristate Conditions (cont.)
● ระวังเวลาเขียนเงื่อนไขเปรียบเทียบ● จาก The Zen of Python, ชัดแจ้งย่อมดีกว่าโดยนัย
● if x: # ถ้า x มคี่าอะไรก็ตามทีไ่มใ่ช่ 0, False, None
<do something>
● แตถ่้าต้องการทำาเมือ่ x เปน็ None เทา่นัน้● If x is None:
<do otherthing>
● ในกรณีแรก ถ้าจะเขยีนให้ชดัแจ้ง เขยีนแบบนีก้็ได้● If x is not None:
Loop
● For
for x in [1,2,3,4]:print(x)
● While
x = 0
while x < 10:print(x)
x += 1
● Endless loop
while True:
ข้อจำากัด● GIL – Global Interpreter Lock
● ณ เวลาหนึง่ๆ Python จะทำางานเพยีง thread เดียวเทา่นั้น (แมโ้ปรแกรมจะเขียน แบบ multi-thread)
● ดังนัน้ จึงใช้ CPU ได้แค่ 1 core
● แกป้ัญหาด้วยการเปลี่ยนจาก threading เป็น multiprocessing (แต่มนัยาก)
● ไม่มีข้อจำากัดนี้บน IronPython หรือ Jython
Optimization / JIT / PyPy
● Optimization ทำาได้ด้วยการเขียน algorithm ที่ดี● ตัว Python เองสามารถใส ่-O ได้เวลา run โปรแกรม
เช่น$ python -O example1.py
● ถ้าใช ้python 32 bit สามารถใช ้psyco ได้● หรือใช ้PyPy (กำาลังพัฒนาอยู่)
เครื่องมือที่ใช้ในการเขียน● Editor
● Vim (windows, linux, mac)● Pyscripter - http://code.google.com/p/pyscripter/
(windows)● Stani's Python Editor (SPE) -
http://sourceforge.net/projects/spe/
● IDE● Eclipse + pydev (free – open source)● WingIDE (commercial)
● Komodo (มีทั้ง free และ commercial)
Interactive shell
● python● ipython● bpython● IDLE (GUI)
Libraries
● Library ของ python มีเยอะมาก● หาได้จาก PyPI - http://pypi.python.org/pypi
● Library บางตัวดีกว่าตัวที่มาพร้อมกับ python เอง● เช่น urllib3 ดีกว่า urllib2 ที ่built-in มากับ python
Q&A