Python by exercises:basic types and control structures

From Blognone

Jump to: navigation, search

ในส่วนนี้เราจะทดลองรูปแบบข้อมูลและโครงสร้างควบคุมพื้นฐานใน 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 ที่มีกุญแจเป็นรหัสวิชา และมีค่าเป็นหน่วยกิตของวิชานั้นได้