Sunday, April 4, 2010

Python Programming

More on Function
ประพัฒน์ สุริยผล

def calculateRectangleArea():

____print "Program to calculate Area of Rectangle"

____base = getUserInput("Please enter base -> ")

____height = getUserInput("Please enter height -> ")

____print "Rectangle area of base", base, "and height", height, "is", base*height

def calculateTriangleArea():

____print "Program to calculate Area of Triangle"

____base = getUserInput("Please enter base -> ")

____height =getUserInput("Please enter height -> ")

____print "Triangle area of base", base, "and height", height, "is", 0.5*base*height

def calculateCircleArea():

____print "Program to calculate Area of Circle"

____radius = getUserInput("Please enter radius -> ")

____print "Circle area with radius", radius, "is", 3.14159 *radius**2

def calculateTrapezoidsArea():

____print "Program to calculate Area of Trapezoids"

____parallelbase1 = getUserInput("Please enter parallel base1 -> ")

____parallelbase2 = getUserInput("Please enter parallel base2 -> ")

____height = getUserInput("Please enter height -> ")

____print "Trapozoids area of parallel base1", parallelbase1, "parallel base2", parallelbase2,\

__________"and height", height, "is", 0.5*(parallelbase1 + parallelbase2)*height

def getUserInput(text_to_display):

____input = raw_input(text_to_display)

____return int(input)

choice = raw_input("Which type of area you would like to calculate (R/T/C/Z)? -> ")

if choice == "R" or choice == "r":

____calculateRectangleArea()

elif choice == "T" or choice == "t":

____calculateTriangleArea()

elif choice == "C" or choice == "c":

____calculateCircleArea()

elif choice == "Z" or choice == "z":

____calculateTrapezoidsArea()

else:

____print "Please type R,T,C or Z to choose the type of area to calculate"


เราจะเริ่มต้นจาก code ข้างต้น จุดหนึ่งที่ผมไม่ค่อยชอบ และทำให้เงื่อนไขของ if ดูยาวโดยไม่จำเป็น และเราจำเป็นต้องหยุดคิดชั่วขณะว่าชื่อตัวแปรทั้งสองอัน คือตัวแปรเดียวกันหรือเปล่า ซึ่งจะพบว่าเป็นตัวแปรเดียวกันคือ choice คำถามคือมีทางทำให้เงื่อนไขนี้อ่านง่ายขึ้นไหม


วิธีหนึ่งที่นิยมใช้กันก็คือแปลงตัวอักษรให้เป็นตัวเล็กหรื่อตัวใหญ่เสีย หลังจากนั้นเราก็สามารถเปรียบเทียบได้ด้วยเงือนไขเดียว เช่นเราแปลงตัวอักษรให้เป็นตัวใหญ่ด้วยคำสั่ง


choice.upper()

เมื่อ python ทำงานตามคำสั่งนี้แล้ว ตัวอักษรที่อยู่ใน choice ก็จะเปลี่ยนเป็นตัวใหญ่ทั้งหมด ไม่ว่าเดิมจะเคยเป็นตัวเล็กหรือตัวใหญ่ก็ตาม


คำสั่งเงื่อนไขจึงกลายเป็น


if choice.upper() == "R":

____...

elif choice.upper() == "T":

____...


อีกจุดหนึ่งที่ทำให้ดูค่อนข้างยากคือคำสั่ง print ที่มีการคั่นไปมาของเครื่องหมาย comma (,) โปรแกรม python แก้ปัญหานี้ด้วยการใช้ string formatting


print "Rectangle area of base", base, "and height", height, "is", base*height


เราสามารถเปลี่ยนคำสั่ง print นี้ให้กลายเป็น


print "Rectangle area of base %d and height %d is %f" % (base, height, base*height)


จะเห็นว่าสิ่งที่ต้องการพิมพ์อยู่ในเครื่องหมายคำพูดคู่เดียว ส่วนตำแหน่งที่เราต้องการพิมพ์ค่าตัวแปร จะถูกแทนที่ด้วยรหัส ซึี่่งในที่นี่เรามีรหัส %d และ %f เราใช้ %d สำหรับ base และ height เพราะเป็นเลขจำนวนเต็ม (integer) ส่วนผลการคำนวณมีโอกาสเป็นตัวเลขทศนิยม (floating point) เราจึงแทนที่ด้วย %f วิธีอ่าน string formatting ทำได้ง่ายๆ ด้วยการไล่ลำดับ %d ตัวแรกสำหรับ base ตัวที่สองสำหรับ height และ %f ตัวที่สามสำหรับ base*height


ข้อดีอีกประการหนึ่งของการใช้ %f ในการพิมพ์ค่าทศนิยม คือเราสามารถกำหนดได้ว่าเราต้องการพิมพ์ทศนิยมกี่ตำแหน่ง ตัวอย่างเช่นเราต้องการพิมพ์ทศนิยม 2 ตำแหน่ง เราใช้เป็น %0.2f ตัวเลข 0 หมายถึงเราไม่สนใจส่วนที่เป็นตัวเลขหน้าทศนิยม ให้ python พิมพ์ตามจริง ส่วนตัวเลข 2 ที่อยู่ด้านหลังนั้น หมายถึงจำนวนทศนิยมที่เราต้องการ


คำสั่ง print ของเราจึงเป็น


print "Rectangle area of base %d and height %d is %0.2f" % (base, height, base*height)


String formatting เราสามารถใช้กับตัวแปรตัวอักษรได้เช่นกัน เช่นที่เราเห็นว่า text_to_display ของ getUserInput มี pattern แบบเดียวกัน ซึ่งเราสามารถเปลี่ยนแปลงการเรียกให้สั้นลง ด้วยการย้าย pattern ไปไว้ในฟังก์ชัน getUserInput เสีย ดังนี้


base = getUserInput("Please enter base -> ")


และเปลี่ยน ฟังก์ชัน getUserInput เป็น


def getUserInput(parameter):

____text_to_display = "Please enter %s -> " % (parameter)

____input = raw_input(text_to_display)

____return int(input)


แบบฝึกหัด

1. เปลี่ยนเงื่อนไข if ให้เปรียบเทียบแค่ค่าเดียว และใช้ method ชื่อ lower() เพื่อเปลี่ยนค่าตัวอักษรใน choice ให้กลายเป็นตัวเล็กให้หมด (ในแบบฝึกหัดนี้ เราจะไม่ใช้ upper() เหมือนที่ยกตัวอย่างไว้ แต่ให้ใช้ lower() แทน)


2. เปลี่ยนฟังก์ชัน getUserInput เป็นแบบใหม่ แล้วปรับ code ที่เหลือตาม


3. เปลี่ยน code ตรงส่วนที่พิมพ์ผล ให้ใช้เป็น string formatting เพื่อหลีกเลี่ยงการแทรกตัวแปรอยู่ในตำแหน่งต่างๆ และให้กำหนดพิมพ์ทศนิยม 3 ตำแหน่ง สำหรับผลลัพธ์ที่คำนวณได้


While Loop


ครั้งนี้ เราจะพัฒนาโปรแกรมต่อจากครั้งที่แล้ว หลังจากที่โปรแกรมของเราสามารถรับค่าเป็นเลขทศนิยมได้ แสดงผลได้สวยงาม เราก็อยากจะเพิ่มความสามารถเข้าไปอีก แหมจะใช้ให้โปรแกรมช่วยคิดให้ทั้งที แถมการบ้านเรื่องหาพื้นที่ก็มักจะมาทีละเยอะๆ การรันโปรแกรมทีละข้อ ก็เริ่มจะไม่สนุก ทางที่ดีคือให้โปรแกรมวนกลับมารับค่าจนกว่าผู้ใช้จะบอกว่าพอดีกว่าโจทย์ครั้งนี้จะทำให้ยากเข้า เพื่อเป็นการฝึกให้อ่านข้อมูลใน help ของ python ได้ด้วย (ถ้ามีความจำเป็น) เอาเป็นว่า ผมจะบอกความต้องการของโปรแกรม และให้คำแนะนำอีกนิดหน่อยดังนี้ครับ


แบบฝึกหัด


ให้เขียนโปรแกรมวนรับคำสั่งจากผู้ใช้ว่าต้องการหาพื้นที่ของรูปร่างแบบไหน และให้คำตอบออกมา จนกระทั่งผู้ใช้กดปุ่ม Q (ตัวเล็กหรือใหญ่ก็ได้) แล้วจึงค่อยออกจากโปรแกรมโดยพิมพ์ Thank you for using my program ก่อนที่จะจบโปรแกรม


คำแนะนำ

ใช้คำสั่งวนลูป ด้วยคำสั่ง while โดยมีโครงสร้างดังนี้


while <เงื่อนไข>

____code block for while loop


ส่วนของโปรแกรมที่ย่อหน้าเข้าไปถัดจากคำสั่ง while จะวนทำงานไปเรื่อย ตราบใดที่เงื่อนไขของ while เป็นจริง เพราะฉะนั้น ต้องคิดให้ดี


การเขียนโปรแกรมโดยใช้ while มี 3 จุดที่ต้องพิจารณาคือ เมื่อ python พบคำสั่ง while ครั้งแรก สามารถตรวจสอบเงื่อนไขได้หรือไม่ บางครั้งตัวแปรที่เราใช้ในเงื่อนไขของ while ยังไม่เคยถูกกำหนดมาก่อน ก็จะเกิดความผิดพลาดขึ้น


จุดที่สองคือ การวนลูปของ while มีโอกาสเปลี่ยนแปลงเงื่อนไขหรือไม่ ตัวแปรที่ใช้อยู่ใน while มีการเปลี่ยนแปลงระหว่างวนลูป หรือไม่ ถ้าหากไม่มีการเปลี่ยนแปลงใดๆ แสดงว่าเงื่อนไขก็จะเป็นจริงตลอด ไม่มีทางที่จะหลุดออกมาจาก while loop ได้เลย


จุดที่สามคือตรงส่วนเงื่อนไขของ while เอง ที่ต้องตรวจสอบว่าเป็นไปตามประสงค์หรือไม่ คิดง่ายว่า while หมายถึง "ตราบเท่าที่" เพราะฉะนั้น เราพอจะอ่านได้ว่า ตราบเท่าที่เงื่อนไขของ while เป็นจริง ให้รันโปรแกรมในส่วนของ while ไปเรื่อยๆ จนกว่าเงื่อนไขจะเป็นเท็จ


ครั้งนี้คงให้ข้อมูลเพียงเท่านี้ เท่าที่ผ่านมา เห็นทำกันได้ดี จึงให้แบบฝึกหัดยากขึ้นครับ


1 comment:

  1. http://www.4shared.com/file/258233565/b93a2d42/THAI_Bioinformatics-April_2010.html?

    นี่เป็น link สำหรับ download นิตยสารฉบับ PDF ของเดือนเมษายนครับ

    ReplyDelete