Python by exercises:basic types and control structures
From Blognone
ในส่วนนี้เราจะทดลองรูปแบบข้อมูลและโครงสร้างควบคุมพื้นฐานใน Python เราจะทดลองใน python intepreter
เมื่อเรียกใช้ interpreter ด้วยคำสั่ง python เราจะพบหน้าจอดังนี้
Python 2.5.1 (r251:54863, Mar 7 2008, 04:10:12) [GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>>
เครื่องหมาย >>> เป็นสัญลักษณ์รอรับคำสั่งของ interpreter เราจะแสดงตัวอย่างการใช้งานบน interpreter นี้
Contents |
จำนวนเต็ม/จำนวนจริง
ใช้งานไม่ต่างจากภาษาทั่วไป เช่น
>>> 10/20 #> 0 >>> 10.5/20 #> 0.52500000000000002 >>> 10**2+7 #> 107
บูเลียน
ในภาษา Python ค่าคงที่ False (เขียนขึ้นต้นด้วยตัวใหญ่), None (สำหรับแทนวัตถุที่ว่างเปล่า), ค่าศูนย์, และลำดับว่างต่าง ๆ จะมีความหมายเป็นเท็จ ค่าคงที่ True และค่าอื่น ๆ ที่ไม่ใช่ค่าว่างจะมีค่าเป็นจริง
ตัวดำเนินการทางตรรกศาสตร์ที่ Python มีคือ and, or, และ not
สตริง
- ดูเมท็อดเพิ่มเติมได้ที่ http://docs.python.org/lib/string-methods.html
ค่าคงที่แบบสตริงใน Python สามารถเขียนโดยใช้เครื่องหมายคำพูดเดี่ยวหรือคำพูดคู่ก็ได้ ถ้าต้องการพิมพ์เครื่องหมายคำพูดภายในสตริงสามารถทำได้โดยใช้เครื่องหมาย '\'
ตัวอย่างด้านล่างแสดงการใช้งานสตริงพื้นฐาน
>>> s = "Hello" >>> s #> 'Hello' >>> s + "world" #> 'Helloworld' >>> t = 'it\'s a happy day' >>> print t #> it's a happy day >>> t*3 #> "it's a happy dayit's a happy dayit's a happy day" >>> t*2 + s #> "it's a happy dayit's a happy dayHello" >>> t.split('a') #> ["it's ", ' h', 'ppy d', 'y'] >>> m = "This is\n on many\n lines" >>> print m This is on many lines >>> y = " center yo yo \n" >>> y.strip() #> 'center yo yo'
นอกจากนี้เราสามารถใช้สตริงที่ยาวต่อเนื่องหลายบรรทัดได้โดยใช้เครื่องหมาย """ ยกตัวอย่างเช่น
>>> manual = """First you call ... python and then you start ... using it""" >>> print manual First you call python and then you start using it
การอ่านข้อมูล (raw_input)
เราสามารถใช้ฟังก์ชัน raw_input เพื่ออ่านข้อมูลจากผู้ใช้ ค่าที่คืนจากฟังก์ชันนี้เป็นสตริงที่อ่านได้
>>> name = raw_input() #> Somchai >>> print 'Hello ' + name #> Hello Somchai >>> xstr = raw_input() #> 120 >>> print xstr*10 # ค่าที่อ่านได้เป็น string 120120120120120120120120120120 >>> print int(xstr)*10 # แปลงเป็น integer ก่อน 1200
list (ลิสต์---รายการ)
ลิสต์คือโครงสร้างข้อมุลที่สำคัญที่สุดใน Python เราระบุลิสต์ได้โดยเขียนรายการข้อมูลในลิสต์ ไว้ภายในเครื่องหมายวงเล็บเหลี่ยม คั่นข้อมูลแต่ละตัวด้วยเครื่องหมายลูกน้ำ ข้อมูลในลิสต์จะเป็นข้อมูลใดก็ได้ และยังสามารถเป็นลิสต์ได้ด้วย
เราสามารถอ้างถึงข้อมูลในลิสต์ได้โดยระบุดัชนีของข้อมูล และใช้ฟังก์ชัน len เพื่ออ่านจำนวนข้อมูลในลิสต์ ด้านล่างแสดงตัวอย่างการใช้งาน
>>> a = [1,2,3,4,5,6] >>> a[1] + a[4] #> 7 >>> b = [1,2,"Welcome",4,5] >>> len(b) #> 5 >>> c = [a,b] >>> c #> [[1, 2, 3, 4, 5, 6], [1, 2, 'Welcome', 4, 5]] >>> len(c) #> 2 >>> c[1] #> [1, 2, 'Welcome', 4, 5] >>> c[1][2] #> 'Welcome'
ในการวิ่งไปเพื่อประมวลผลข้อมูลในลิสต์ เราสามารถใช้คำสั่ง for ที่มีรูปแบบดังนี้
for ตัวแปร in ลิสต์: # do something
เพื่อใช้ตัวแปร ตัวแปร วิ่งไปในลิสต์ ลิสต์ ได้
ตัวอย่างด้านล่างแสดงส่วนของโปรแกรมที่หาผลรวมของจำนวนในลิสต์ a
>>> a = [1,2,3,10,20,30] >>> sum = 0 >>> for x in a: ... sum += x ... print sum 66
สังเกตว่าเราใช้การย่อหน้าในการระบุขอบเขตของคำสั่งที่จะทำงานภายใต้ตำสั่ง for
แบบฝึกหัด: นับหน่วยกิต
จงเขียนโปรแกรม count-credits.py ที่อ่านแฟ้ม courses.txt จากนั้นพิมพ์ผลรวมของหน่วยกิตของวิชาทั้งหมดออกมา (หมายเหตุ: ให้เขียนเป็นโปรแกรมเดี่ยว ที่ทำงานโดยเรียกใช้ผ่าน command line: python count-credits.py)
เงื่อนไข
Python มีโครงสร้างเงื่อนไข if ที่มีรูปแบบทั่วไปดังนี้
if เงื่อนไข: # do one thing elif เงื่อนไข: # do another thing else: # do something
ส่วน elif (ย่อจาก else-if) และ else สามารถละได้
โปรแกรมด้านล่างพิมพ์รายการวิชาที่ขึ้นต้นด้วยหมายเลขตามที่ระบุใน command line
import sys # need this to get command-line args cprefix = sys.argv[1] # get 1st command-line argument lines = open('courses.txt').readlines() for line in lines: if line.startswith(cprefix): print line, # note the ','. "line" has an '\n' at the end already
โปรแกรมดังกล่าวเรียกให้ทำงานโดยสั่ง python find-courses.py เลขรหัสขึ้นต้นวิชา เช่นเราสามารถใช้เลขรหัสขึ้นต้นเป็น 420 เพื่อหารายวิชา 420* ได้
สองบรรทัดแรกของโปรแกรมเป็นการอ่าน command-line argument ส่วนเมท็อด startswith จะตรวจสอบสตริงว่าขึ้นต้นด้วยสตริงที่ให้มาหรือไม่
ให้สังเกตคำสั่ง print ถ้าเราใส่เครื่องหมายลูกน้ำไว้ตอนท้าย คำสั่งจะไม่ขึ้นบรรทัดใหม่ให้ แต่ในกรณีของข้อนี้ แต่ละบรรทัด (ในตัวแปร line) มีเครื่องหมายขึ้นบรรทัดใหม่ต่อท้ายอยู่แล้ว
แบบฝึกหัด: นับหน่วยกิตเฉพาะรายวิชา
จงเขียนแก้โปรแกรม find-courses.py ด้านบน ให้พิมพ์จำนวนหน่วยกิตรวม ของรายวิชาที่ค้นหามาได้ด้วย ตัวอย่างการทำงานเช่น ถ้าสั่ง python find-courses.py 420 จะได้ผลลัพธ์เป็น
420111,3 420113,1 420112,3 Total: 7 credits
การประมวลผลในลิสต์
เรามีฟังก์ชันมากมายในการประมวลผลในลิสต์ ด้านล่างแสดงตัวอย่างการใช้งานที่นำมาจากเว็บของ Python
>> a = [66.25, 333, 333, 1, 1234.5] >>> print a.count(333), a.count(66.25), a.count('x') #> 2 1 0 >>> a.insert(2, -1) >>> a.append(333) >>> a #> [66.25, 333, -1, 333, 1, 1234.5, 333] >>> a.index(333) #> 1 >>> a.remove(333) >>> a #> [66.25, -1, 333, 1, 1234.5, 333] >>> a.reverse() >>> a #> [333, 1234.5, 1, 333, -1, 66.25] >>> a.sort() >>> a #> [-1, 1, 66.25, 333, 333, 1234.5]
นอกจากการใช้งานฟังก์ชันดังกล่าวแล้ว เรายังสามารถใช้งานช่วงของลำดับได้ด้วย พิจารณาตัวอย่างด้านล่าง
ฟังก์ชั่นอื่น ๆ ดูได้ที่ http://docs.python.org/lib/typesseq-mutable.html
tuple (ทูเปิล)
ข้อมูลแบบทูเปิลมีลักษณะไม่ต่างจากข้อมูลแบบลิสต์ เพียงแต่ว่าเราจะไม่สามารถเปลี่ยนค่าข้อมูลย่อยในทูเปิลได้ ภาษา Python เรียกชนิดข้อมูลที่ไม่สามารถแก้ไขได้ว่าเป็นข้อมูลแบบ immutable ตัวอย่างของข้อมูลแบบ immutable เช่น จำนวนต่าง ๆ สตริง หรือทูเปิล (สังเกตว่าเราสามารถเปลี่ยนค่าของจำนวนต่าง ๆ ได้แต่เมื่อเปลี่ยนแล้วจำนวนนั้นก็ไม่ใช่จำนวนเดิมอีกต่อไป)
เราเขียนทูเปิลโดยระบุสมาชิกเรียงตามลำดับในวงเล็บ เช่น (2,3,4) หรือ ('today','monday',2) เป็นต้น ข้อมูลแบบทูเปิลมักถูกใช้เป็นกุญแจในข้อมูลแบบพจนานุกรมที่อธิบายถัดไป
dictionary (พจนานุกรม)
โครงสร้างข้อมูลอีกชนิดของ Python คือพจนานุกรม โครงสร้างข้อมูลชนิดนี้รองรับการสืบค้นโดยใช้กุญแจ (key) เพื่อโยงไปถึงค่าที่เก็บไว้ โดยกุญแจจะเป็นข้อมูลแบบ immutable เช่น ตัวเลข สตริง หรือลำดับ (tuple) ก็ได้
การระบุพจนานุกรมเราจะเขียนข้อมูลในวงเล็บปีกกา โดยระบุเป็นรายการของคู่ลำดับ กุญแจ-ค่า ดังแสดงในตัวอย่างการใช้งานด้านล่าง (คัดลอกมาจาก http://docs.python.org/tut/node7.html)
>>> tel = {'jack': 4098, 'sape': 4139} >>> tel['guido'] = 4127 >>> tel #> {'sape': 4139, 'guido': 4127, 'jack': 4098} >>> tel['jack'] #> 4098 >>> del tel['sape'] >>> tel['irv'] = 4127 >>> tel #> {'guido': 4127, 'irv': 4127, 'jack': 4098} >>> tel.keys() #> ['guido', 'irv', 'jack'] >>> tel.has_key('guido') #> True >>> 'guido' in tel #> True
ตัวอย่างด้านล่างแสดงวิ่งไปในข้อมูลแบบพจนานุกรมผ่านทางรายการของกุญแจ (เรียกด้วยเมท็อด keys) ด้วยคำสั่ง for
>>> x = {'204111':3, '420111':4, '417111':3} >>> for k in x.keys(): ... print k, x[k] 417111 3 420111 4 204111 3
โปรแกรมด้านล่างอ่านแฟ้ม courses.txt แล้วรับรหัสวิชาจากผู้ใช้แล้วพิมพ์หน่วยกิต
f = open('courses.txt','r') lines = f.readlines() credits = {} for line in lines: items = line.strip().split(',') credits[items[0]] = int(items[1]) print "Enter course number (type 'end' to quit):" c = raw_input() while c!='end': if c in credits: print credits[c] else: print 'Course not found' c = raw_input()
สังเกตว่าโปรแกรมข้างต้นใช้โครงสร้างควบคุมแบบ while
แบบฝึกหัด: คำนวณเกรดเฉลี่ย 1 คน
แฟ้ม my_grades.txt เก็บเกรดของวิชาต่าง ๆ ของนิสิตคนหนึ่ง ในแต่ละบรรทัดของแฟ้มดังกล่าว จะมีข้อมูลในรูปแบบ
รหัสวิชา,เกรด
โดยเกรดจะเป็นจำนวนจริงแทนแต้มคะแนนของเกรดนั้น ๆ (เช่น 2.5 แทน C+ เป็นต้น)
ให้เขียนโปรแกรม compute_gpa.py ที่อ่านแฟ้มดังกล่าวและแฟ้ม courses.txt จากนั้นคำนวณเกรดเฉลี่ยของนิสิตคนนั้น
คำใบ้ ในการคำนวณเราจำเป็นต้องทราบหน่วยกิตของแต่ละวิชา ให้ดูตัวอย่างในส่วนพจนานุกรม สำหรับการสร้างพจนานุกรมชื่อ credits ที่มีกุญแจเป็นรหัสวิชา และมีค่าเป็นหน่วยกิตของวิชานั้นได้