The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.
Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by Araya Pothisorn Florence, 2020-04-26 12:12:39

Compro63

บทที่ 4


ฟังก์ชั่นทางคณิตศาสตร์ อักขระและข้อความ


(Mathematical Functions, Characters and Strings)


ั่
ในบทนี้จะเป็นการทบทวนการใช้งานฟังก์ชนทางคณิตศาสตร์ที่ได้กล่าวถึงในบทที่ 2 แล้ว จะกล่าวถึง
ฟังก์ชั่นต่างๆที่มีไว้ใช้งานเพื่อจัดการเกี่ยวกับอักขระ รวมถึงเรื่องของวัตถุชนิดข้อความหรือที่เรียกว่าสตริง
(String) และเมธอดเกี่ยวกับสตริง


4.1 ฟังก์ชั่นทางคณิตศาสตร์ (Mathematical Functions)

ใน Python มีฟังก์ชั่นทางคณิตศาสตร์ให้เรียกใช้งานได้รวบรวมอยู่ในโมดูลหลักๆชื่อว่า math
อย่างไรก็ตาม CPython หรือ C implementation บน Python มีโมดูล cmath ให้ผู้พัฒนาเรียกใช้งาน ซึ่ง

มีความแตกต่างจาก math module และบางอย่างสามารถรองรับการค านวณเชิงวิศวกรรมได้ดีกว่า รายการ
ฟังก์ชั่นที่จ าเป็นทางคณิตศาสตร์ อยู่ในบทที่สองในส่วนของฟังก์ชั่นทางคณิตศาสตร์และรายละเอียดอยู่ใน
https://docs.python.org/3/library/math.html


ฟังก์ชั่นที่ใช้บ่อยใน math สามารถแบ่งแยกประเภทได้เป็น 3 ประเภทใหญ่ๆ ได้แก่ ฟังก์ชั่นที่
เกี่ยวกับตรีโกณ ฟังก์ชั่นที่เกี่ยวกับการยกก าลัง และฟังก์ชั่นที่เกี่ยวกับการปัดเศษ สองประเภทแรกได้กล่าวถึง
ในรายละเอียดแล้วในบทที่ 2 ดังตารางที่ 2.9 ส่วนฟังก์ชั่นเกี่ยวกับการปัดเศษที่ควรรู้จักได้แก่


ceil (x) ใช้ส าหรับให้ค่าเพดาน คือการปัดเศษขึ้นให้ใกล้ค่าจ านวนเต็มที่ใกล้ที่สุดด้านบน ค่าจ านวนเต็มนี้
จะถูกส่งกลับในรูปแบบข้อมูลชนิด double เช่น


ceil(2.1) ได้ค่าที่ส่งกลับคือ 3.0
ceil(2.0) ได้ค่าที่ส่งกลับคือ 2.0
ceil(-2.7) ได้ค่าที่ส่งกลับคือ -2.0


floor(x) ใช้ส าหรับให้ค่าพื้น คือการปัดเศษลงให้ใกล้ค่าจ านวนเต็มที่ใกล้ที่สุดด้านล่าง เช่นเดียวกับ
ceil(x) ค่าที่ส่งกลับมาอยู่ในรูปแบบของข้อมูลชนิด double

floor(2.1) ได้ค่าที่ส่งกลับคือ 2.0

floor(2.9) ได้ค่าที่ส่งกลับคือ 2.0
floor(-2.1) ได้ค่าที่ส่งกลับคือ -3.0
floor(2.0) ได้ค่าที่ส่งกลับคือ 2.0


93 | Page













Araya's Creation

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

ตัวอย่างสามารถใช้ค่าทดสอบจาก สามจุดคือ (1,3), (-2,-2) และ (3,-1)
http://www.teacherschoice.com.au/maths_library/trigonometry/triangle_given_3_points.htm

















รูปที่ 4.1 แสดงการหาค่ามุมทั้งสามของสามเหลี่ยมใดๆจากพิกัดของทั้งสามมุม (Liang, 2013)

Listing 4.1 ComputeAngles\main.py
1. '''
2. Created on 28Jul.,2016

3. @author: Araya
4. '''
5. import math
6. if __name__ == '__main__':
7. pass
8. #Prompt the user to enter three points
9. x1 = int(input("Enter coordinate p1 (x1,y1) x1:"))
10. y1 = int(input("Enter coordinate p1 (x1,y1) y1:"))
11. x2 = int(input("Enter coordinate p2 (x2,y2) x2:"))
12. y2 = int(input("Enter coordinate p2 (x2,y2) y2:"))
13. x3 = int(input("Enter coordinate p3 (x3,y3) x3:"))
14. y3 = int(input("Enter coordinate p3 (x3,y3) y3:"))
15. #Compute three sides
16. a = math.sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2
- y3))
17. b = math.sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1
- y3))
18. c = math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1
- y2))
19. #Obtain A,B,C angles in radians
20. A = math.acos((a * a - b * b - c * c) / (-2 * b * c))
21. B = math.acos((b * b - a * a - c * c) / (-2 * a * c))
22. C = math.acos((c * c - b * b - a * a) / (-2 * a * b))
23. #Display the angles in degrees
24. print("The three angles are {0:.2f}, {1:.2f},
{2:.2f}.\n".format(math.degrees(A), math.degrees(B),
math.degrees(C)))


94 | Page








Araya's Creation

จาก Listing ข้างต้น บรรทัดที่ 24 เป็นการจัดรูปแบบของผลลัพท์ออกทางหน้าจอ เมื่อเราต้องการ
แสดงผลข้อความออกทางหน้าจอ และประกอบไปด้วยค่าตัวเลขที่เป็นผลของการค านวณ สิ่งที่อยู่ภายใต้

double quote นั้นคือสตริง สตริงมีเมธอดชื่อว่า format( ) ที่ใช้ส าหรับจัดรูปแบบการแสดงผล ซึ่งจะใช้
ควบคู่กับ { } ดังที่เห็นในบรรทัดที่ 24 ให้สังเกตุว่าสิ่งที่อยู่ในวงเล็บหลัง .format นั้นมีอยู่สามอย่าง และใน
ข้อความที่เรียก .format ( ) ก็มี { } อยู่สามที่ แต่ละที่จะใช้ index 0, 1, 2 เพื่ออ้างถึงสิ่งที่อยู่
ในวงเล็บหลัง .format ตัวแรกคือ 0 อ้างถึง math.degrees(A) ตัวที่สองคือ 1 อ้างถึง

math.degrees(B) ตัวที่สามคือ 2 อ้างถึง math.degrees(C)และในส่วนของ { } ก็มีรูปแบบคือ
{index:format} ในส่วนของ format ที่อยู่ใน { } จะใช้งานเหมือน % ที่ได้อธิบายไว้ในบทที่สอง
กล่าวคือ f หมายถึงเลข floating point และ d หมายถึงเลขจ านวนเต็ม เป็นต้น ดังนั้น {0:.2f}
หมายถึงให้จัดรูปแบบค่าของ math.degrees(A) ด้วยรูปแบบทศนิยมสองต าแหน่ง นั่นเอง


4.2 ชนิดข้อมูลอักขระและการกระท าเกี่ยวกับอักขระ (Character Data Type and Operations)


ข้อมูลชนิดอักขระใน Python คือข้อมูลชนิดสตริง หรือข้อความ ซึ่งสามารถก าหนดไดด้วย ' ' single
quote หรือ " " double quote ก็ได้ โดยทั่วไปในภาษาโปรแกรมอื่นๆมักก าหนดให้ใช้ single quote
ส าหรับอักขระ และ double quote ดังนั้นการก าหนดอักขระในวิชานี้ ควรก าหนดโดยใช้ single quote เช่น

letter = 'a';
numCh = '4';

4.2.1 รหัสแอสกี้ (ASCII code)


คอมพิวเตอร์ใช้เลขฐานสอง (0 และ 1) แทนการเก็บข้อมูลต่างๆในหน่วยความจ า ซึ่งเวลาประมวลผล
นี้ข้อมูลที่เป็นเลขฐานสองก็จะถูกแปลงเป็นสัญญาณทางไฟฟ้าที่มีลักษณะสูงต่ า (0 และ 5 โวลท์) การเก็บ
อักขระในหน่วยความจ าจะเป็นการเก็บอนุกรมของเลขฐานสอง การเข้ารหัสอักขระแต่ละตัวให้เป็นอนุกรมของ
เลข 0 และ 1 เรียงกนเรียกวา encoding ปกติแล้วคอมพิวเตอร์ทั่วไปใช้ ASCII (American Standard Code


for information Interchange) ในการเข้ารหัสข้อมูลขนาด 8 บิทส าหรับตัวอักขระทั้ง ตัวเล็ก (lowercase)
ตัวใหญ่ (capital) ตัวเลข เครื่องหมาย และรหัสควบคุมต่างๆตัวอย่างของ ASCII code ที่ใช้บ่อยแสดงใน
ตาราง 4.1


ตาราง 4.1 ASCII Code for Commonly Used Characters (Liang, 2013)

Characters ASCII Code Binary
‘0’ to ‘9’ 48 to 57 0011 0000 to 0011 1001
‘A’ to ‘Z’ 65 to 90 0100 0001 to 0101 1010
‘a’ to ‘z’ 97 to 122 0110 0001 to 0111 1010


หากต้องการรหัสแอสกี้ของอักขระใดๆ สามารถสั่ง

>>> ord(‘a)

95 | Page













Araya's Creation

>>> 97

หรือหากต้องการท าตรงข้าม กล่าวคือต้องการอักขระจากรหัสแอสกี้ใดๆ ท าได้โดย


>>> chr(97)
>>>a
การอ่านอักขระเข้ามาจากคีย์บอร์ดสามารถใช้งานฟังก์ชั่น input() ได้ตามปกติเสมือนที่ท ากับ
การอ่านค่าตัวเลขเข้ามาจากคีย์บอร์ดแต่เลือกใช้รูปแบบ


4.2.2 อักขระควบคุมพิเศษ (Escape Sequences for Special Characters)

อักขระควบคุมพิเศษหรือที่เรียกว่าเอสเคปซีเควนซ์ (escape sequence) คืออักขระที่มีความหมาย

พิเศษในตัวมันเอง เสมือนเครื่องหมายพิเศษที่ใช้บอกตัวแปลภาษา เช่น ถ้าเราต้องการแสดงผลเครื่องหมาย "
(double quote) ออกไปที่หน้าจอ จะต้องเพิ่มเครื่องหมายพิเศษนี้เข้าไปเพื่อบอกให้รู้ว่าอักขระต่อมาเป็น
อักขระพิเศษ เพราะเครื่องหมาย " ใช้ในการก าหนดข้อความ ดังตัวอย่าง


หากต้องการให้การแสดงข้อความบนที่หน้าจอดังนี้

He said "Programming is fun"

จะต้องใช้ escape sequence เข้าช่วยดังนี้

print ("He said \"Programming is fun\"\n")


ตารางที่ 4.2 แสดง escape sequence ที่ใช้ได้ใน Python
Escape Sequence Name ASCII Code
\b Backspace 8
\t Tab 9
\n Linefeed (new line) 10
\f Formfeed 12
\r Carriage Return (Enter) 13
\\ Backslash 92
\" Double Quote 34


4.2.3 การแปลงระหว่างอักขระกับตัวเลข (Casting between string and Numeric)

อักขระสามารถแปลงไปเป็นตัวเลขได้ เช่นเดียวกันกับตัวเลขที่แปลงมาเป็นอักขระได้ โดย Built-in

Functions ในการแปลง รายการ Built-in Functions ใน Python อยู่ในบทที่สองหน้า 45 ฟังก์ชั่นที่ใช้บ่อย
ได้แก่

int (var1) แปลง var1 ให้กลายเป็นจ านวนเต็ม

float (var1) แปลง var1 ให้กลายเป็นเลขทศนิยม
str (num1) แปลง num1 ให้กลายเป็นสตริง
ord (ch1) ให้ค่า ASCII ของ ch1 ในเลขฐานสิบ
chr (asc1) ให้อักขระของเลข ASCII ฐานสิบ asc1


96 | Page








Araya's Creation

4.2.4 ฟังก์ชั่นเกี่ยวกับอักขระ (Character functions)


ใน Python มีฟังก์ชั่นไว้ส าหรับใช้งานเกี่ยวกับอักขระ ให้เรียกใช้งาน รายชื่อฟังก์ชั่นต่างๆเหล่านี้แสดง
อยู่ในตาราง 4.3

ตาราง 4.3 Character Functions


Function Description
isdigit(ch) ส่งค่ากลับเป็น 1 (true) ถ้า ch เป็นตัวเลข
isalpha(ch) ส่งค่ากลับเป็น 1 (true) ถ้า ch เป็นอักขระอักษร
isalnum(ch) ส่งค่ากลับเป็น 1 (true) ถ้า ch เป็นตัวเลขหรืออกขระอกษร


islower(ch) ส่งค่ากลับเป็น 1 (true) ถ้า ch เป็นอักขระอักษรตัวพิมพ์เล็ก
isupper(ch) ส่งค่ากลับเป็น 1 (true) ถ้า ch เป็นอักขระอักษรตัวพิมพ์ใหญ่
isspace(ch) ส่งค่ากลับเป็น 1 (true) ถ้า ch เป็นอักขระช่องไฟ (ช่องว่าง)
lower(ch) ส่งค่าส าเนาเป็นอักขระอักษรตัวพิมพ์เล็กของ ch
upper(ch) ส่งค่าส าเนาเป็นอักขระอักษรตัวพิมพ์ใหญ่ของ ch






4.3 ชนิดข้อมูลข้อความ (The string Type)


ข้อมูลชนิดสตริงใน Python ถือเป็นข้อมูลแบบเรียงล าดับ (Sequence) ซึ่งข้อมูลประเภทนี้มี
ความส าคัญอย่างมากในการจัดการปัญหาเกี่ยวกับข้อมูล และการค านวณเชิงวิศวกรรม ข้อมูลประเภทนี้
ประกอบไปด้วย str, unicode, list, tuple, bytearray, buffer และ
xrange ชนิดข้อมูลเหล่านี้สามารถเรียกใช้ Built-in function ต่างๆส าหรับข้อมูลแบบเรียงล าดับได้

ฟังก์ชั่นหลักๆที่อาจเกี่ยวข้องกับการเขียนโปรแกรมในรายวิชานี้ รวมถึงตัวกระท าพิเศษได้ถูกกล่าวถึงในตาราง
ที่ 2.5 และ 2.6 ในบทที่สองแล้ว ตัวอย่างการใช้งานสามารถดูได้ใน
https://docs.python.org/2/library/stdtypes.html#typesseq



















97 | Page













Araya's Creation

This page intentionally left blank.
























































98 | Page








Araya's Creation

1309 200 Computer Programming Laboratory
ปฏิบัติการที่ 4: Mathematic Calculation, Characters and


Strings


วัตถุประสงค์


1. สามารถเขียนโปรแกรมค านวณสมการคณิตศาสตร์อย่างง่ายได้ และแสดงผลได้อย่างเหมาะสม
2. สามารถเขียนโปรแกรมจัดการเกี่ยวกับอักขระและข้อความได้อย่างถูกตอง




ทฤษฎีที่เกี่ยวข้อง


นอกจากการค านวณทางคณิตศาสตร์แล้ว การเขียนโปรแกรมเพื่อแก้ปัญหาเชิงวิศวกรรมนั้น บางครั้ง

เกี่ยวข้องกับการจัดการข้อมูล ไม่ว่าจะเป็นการหาค่าที่มากที่สุด น้อยที่สุด การจัดการเกี่ยวกับข้อความและ
อักขระ สิ่งเหล่านี้ใน Python มีฟังก์ชั่นส าเร็จให้เรียกใช้งานอยู่แล้วโดยที่ผู้เขียนโปรแกรมไม่ต้องเขียนฟังก์ชั่น

เหล่านั้นขึ้นมาเองแต่สามารถเรียกใช้งานได้เลยหากท าการประกาศไลบรารี่ที่เหมาะสมไว้ สิ่งส าคัญที่ต้องพึง
ตระหนักไว้คือชนิดข้อมูลแบบสตริง (str) เป็นชนิดที่แตกต่างจาก int และ float ในลักษณะที่สตริง

เป็นข้อมูลแบบเรียงล าดับ คือมี index ให้ใช้งานด้วย ดังนั้นการเรียกใช้ก็จะมีฟังก์ชั่นที่เกี่ยวเนื่องกันกับข้อมูล
แบบเรียงล าดับชนิดอื่นๆ ที่จะได้ศึกษาต่อไปในบทที่ 7


ปฏิบัติการส่วนที่ 1 การใช้งานฟังก์ชั่นทางคณิตศาสตร์


Listing 4.2 แสดงการรับข้อมูลเข้ามาจากผู้ใช้เป็นเลขสามจ านวน แล้วหาค่าเฉลี่ยของจ านวนทั้งสาม


Listing 4.2 Exercise51\main.py


1. '''
2. Created on 28Jul.,2016

3. @author: Araya
4. '''

5. if __name__ == '__main__':
6. pass

99 | Page













Araya's Creation

7. num1 = float(input("Enter the first number: "))
8. num2 = float(input("Enter the second number: "))
9. num3 = float(input("Enter the last number: "))
10. avg = (num1 + num2 + num3)/3
11. print("The average of {0:.2f}, {1:.2f} and {2:.2f} is
{3:.2f}".format(num1, num2, num3, avg))



★ค าสั่ง จงท าการแก้ไขปรับปรุง Listing 4.2 ให้แสดงค่าเฉลี่ยของสามจ านวนที่เป็นค่าเพดาน โดยใช้ข้อมูล
ทดสอบดังต่อไปนี้ พร้อมทั้งก าหนดการแสดงผลชิดขวา โดยก าหนด Field width เป็น 4 อีกทั้งให้แสดงค่าที่

มากที่สุดในชุดข้อมูลแต่ละชุด


ชุดที่ 1 ประกอบด้วย 3 3 และ 2
ชุดที่ 2 ประกอบด้วย 4 3 และ 3



ปฏิบัติการส่วนที่ 2 อักขระและข้อความ
Listing 4.3 เป็นการรับชื่อเล่นของผู้ใช้ เข้ามาในโปรแกรม หลังจากนั้นท าเช็คทีละอักขระในชื่อที่รับเข้ามาแล้ว

ท าการ พิมพ์รหัสแอสกี้ของอักขระนั้นๆออกไปที่หน้าจอ

Listing 4.3 Excercise52\main.py
1. '''
2. Created on 28Jul.,2016
3. @author: Araya
4. This program input a nickname then prints ascii of each
character in that name
5. '''
6. if __name__ == '__main__':
7. pass
8. nickname = input("Enter your nickname: ")
9. for letter in nickname:
10. print(ord(letter))


★ค าสั่ง จงท าการปรับปรุง Listing 4.3 ให้ท าการนับจ านวนสระในชื่อที่ป้อนเข้ามาได้ พร้อมทั้งแสดงออกทาง
หน้าจอว่าชื่อที่ป้อนเข้ามามีสระกี่ตัว

หมายเหต: Listing ดังกล่าวมีการใช้งาน for loop ซึ่งยังไม่มีการกล่าวถึงในบทเรียน ทั้งนี้การแก้ไขตามค าสั่ง

ให้แก้ไขการตรวจสอบและนับสระ ให้ท าใน บล็อคของ for loop (บรรทัดที่ 10 เป็นต้นไป)






100 | Page








Araya's Creation

แบบฝึกหัด

1. จากสมการต่อไปนี้ จงเขียนนิพจน์ทางคณิตศาสตร์เพื่อใช้ในการเขียนโปรแกรม
x+y
1.1) A=
(z+w)-2
_________________________________________________________________________

_____________________________________________________________________


1.2) B=2xy+4z +3w
3
2
_________________________________________________________________________
_____________________________________________________________________


-1
1.3) C=cos (y log 3 )× log y e √2
3 3 -10
√ |y|
y
_________________________________________________________________________

_____________________________________________________________________

1.4) D=|x +xyz-1|
2

_________________________________________________________________________

_____________________________________________________________________


★ค าสั่ง ให้นักศึกษาน ารหัสนักศึกษาของตนเอง modulus ด้วย 4 หากได้เศษ 0 ให้ท าข้อ 4 เศษ 1 ท าข้อ 1
เศษ 2 ท าข้อ 2 และเศษ 3 ท าข้อ 3 โดยท าการเขียนโค้ดในโปรเจ็คใหม่ เพื่อหาผลลัพท์ของการท า modulo

รหัสนักศึกษาของตนเองก่อนท าการเขียนโค้ด ตามโจทย์ของข้อที่ได้ต่อไปนี้


1. Generate 10 random numbers in the range 0 to 129. If the number represents
a printable character, print the character with an appropriate message that indicates the
following:

The character is a lowercase letter.
The character is an uppercase letter.
The character is a digit.

The character is a space.
If the character is none of these, display its value in integer format.


101 | Page













Araya's Creation

2. Write a C program that accepts a string from the console and displays the string one word
per line.

3. จงเขียนโปรแกรมรับชื่อเข้ามาจาก Console input แล้วท าการปรับตัวเล็กให้เป็นตัวใหญ่และปรับตัวใหญ่
ให้เป็นตัวเล็ก

4. จงเขียนโปรแกรมให้รับข้อมูลเกี่ยวกับผู้ใช้เข้ามาได้แก่ ชื่อ นามสกุล เกรดเฉลี่ย และภาควิชาเข้ามาจากผู้ใช้
แล้วท าการแสดงผลโดยก าหนดให้ส่วนของภาควิชาต้องแสดงผลดังนี้

ME ส าหรับภาคเครื่องกล IE ส าหรับอุตสาหการ

EE ส าหรับไฟฟ้า CE ส าหรับโยธา
ChE ส าหรับเคมี EnvE ส าหรับสิ่งแวดล้อม






























































102 | Page








Araya's Creation

บทที่ 5





การกระท้าซ ้าและการวนรอบ (Repetition and Loops)


บ่อยครั้งที่การเขียนโปรแกรมคอมพิวเตอร์มีความต้องการที่จะท างานแบบเดียวกันหลายๆครั้ง เช่น

ต้องการพิมพออกหน้าจอ 10 ครั้ง

print("Welcome to Python\n")
print("Welcome to Python\n")
...
print("Welcome to Python\n") // 10 times


แทนการพิมพ์ชุดค าสั่งเดิมๆ 10 ครั้ง ใน Python มีโครงสร้างการเขียนโปรแกรมแบบกระท าซ้ าและวนรอบ
หรือเรียกว่า ลูป (loops) อยู่ 2 ชนิดให้เลือกใช้ ได้แก่ while และ for


5.1 The while Loop

ลูปชนิดนี้จะท าค าสั่งที่ถูกก าหนดไว้ในลูปเมื่อเงื่อนไขที่ก าหนดเป็นจริง ดังนั้นเมื่อเงื่อนไขดังกล่าวเป็น

เท็จ การท างานของลูปก็จะสิ้นสุดหรือที่เรียกว่า หลุดออกจากลูป ผังงานของ while loop แสดงในรูปที่ 5.1
ส่วนรูปแบบของ while loop คือ
while (เงื่อนไขทท าให้ลูปท างาน) :
ี่


//Loop body
statement(s) //ชุดค าสั่งที่ต้องการให้ท าซ้ า





















103 | Page














Araya's Creation

รูปที่ 5.1 ผังงานของโครงสร้างแบบ while loop

การท างานในแต่ละครั้งของลูปเรียกว่า Iteration (อ่านว่าไอเทอเรชั่น) การพิมพ์ออกหน้าจอ 10 ครั้ง

จากตัวอย่างข้างต้น สามารถน ามาเขียนเป็นลูปได้ดังนี้ แต่ละ iteration จะท าการพิมพออกหน้าจอและ
เปลี่ยนแปลงค่าใน count ขึ้นครั้งละหนึ่ง (เรียกอีกอย่างหนึ่งว่าอัพเดทค่า count หรือ อพเดทตัวนับลูป)

count = 0
while (count <= 10):
print("Welcome to C\n")
count += 1

อีกตัวอย่างหนึ่งที่จะท าให้เข้าใจการท างานของลูปมากขึ้น โค้ดต่อไปนี้เป็นการบวกเลขตั้งแต่ค่า 0 ถึง
9 โดยโค้ดนี้ลูปจะท างานทั้งหมด 9 ครั้ง

1: sum = 0
2: i = 1
3: while (i < 10):
4: sum = sum + i # same as sum+=i
5: i += 1
6: print(sum)
สามารถอธิบายได้ดังนี้
บรรทัดที่ 1, 2 เป็นการก าหนดค่าเริ่มต้นก่อนเข้าไปในลูป บางครั้งเรียกว่าการรีเซ็ทค่า

บรรทัดที่ 3 เป็นค าสั่ง while ที่มีเงื่อนไขว่าจะท าในสิ่งที่อยู่ในย่อหน้าต่อไปนี้ หากเงื่อนไขในวงเล็บหลัง
while เป็นจริง
บรรทัดที่ 4 – 5 เป็นส่วนที่จะถูกกระท าซ้ า สิ่งที่เกดขึ้นในแต่ละครั้งที่ลูปท างาน ส าหรับ iteration ที่ 1 เป็น

การรันครั้งแรกกอนเข้าไปในลูป i มีค่าเป็น 1 ดังนั้นท าให้เงื่อนไขของ while เป็นจริง จึงท าการประมวลผล

ค าสั่งในบรรทัดที่ 4 และ 5 (ในย่อหน้า) ซึ่งท าให้ ค่า sum เปลี่ยนแปลงเป็น 1 และคา i เปลี่ยนแปลงเป็น 2

เมื่อท าการทดสอบเงื่อนไข พบว่าค่า i ยังน้อยกว่า 10 ท าให้เงื่อนไขเป็นจริง จึงประมวลผลสิ่งที่อยู่ในย่อหน้า
อีก เป็นการท า iteration ที่ 2 และท าต่อเนื่องไปเรื่อยๆ ลูปจะหยุดท างาน หรือบางครั้งเรียกว่าหลุดออกจาก


104 | Page








Araya's Creation

ลูปเมื่อเงื่อนไขเป็นเท็จ ซึ่งเกิดขึ้นเมื่อค่า i ถูกเพิ่มจาก 9 เป็น 10 หลังจากท า iteration ที่ 9 เพราะ i ไม่ได้
น้อยกว่า 10 อีกต่อไป ค่าของตัวแปรทั้งสองจะเปลี่ยนไปในแต่ละ iteration ดังจะปรากฏในตาราง 5.1


ตาราง 5.1 แสดงสิ่งที่เก็บอยู่ใน sum และ i

Iteration# sum i
0 (ก่อนเข้าลูป) 0 1
1 1 2
2 3 3
3 6 4
4 10 5
... ... ...
9 45 10


โค้ดดังกล่าว หากเขียนผิดพลาด ลืมใส่บรรทัดที่ 5 ซึ่งเป็นการปรับค่าที่ท าให้ลูปวิ่ง หรือเรียกได้ว่าตัว
ควบคุมลูป ซึ่งกคือค่า i ก็จะท าให้เกิดลูปไม่สิ้นสุด หรือทเรียกว่า infinity loop (อ่านว่าอินฟินิตี้ลูป)
ี่

เนื่องจากไม่มีการเปลี่ยนแปลงค่า i ท าให้เงื่อนไขเป็นจริงตลอดทุกๆ iteration โปรแกรมก็จะรันแบบไม่สิ้นสุด
การออกจากโปรแกรมอาจท าได้โดยการกดปุ่ม Ctrl ค้างไว้แล้วกด z จะท าให้หลุดออกจากการท างานของ
โปรแกรม


จากบทที่ 3 ในเรื่องโครงสร้างแบบทางเลือก ในส่วนของปฏิบัติการที่ 4 Listing 3.5 เป็นโปรแกรมเดา
ค าตอบของการลบเลขสองจ านวน หากท าการปรับปรุงโค้ดดังกล่าวเพอให้สามารถเดาคาตอบไปเรื่อยๆจนกว่า
ื่


ค าตอบที่ถกจะถูกใส่เข้าไป ดังแสดงใน Listing 5.1
Listing 5.1 RepeatSubtractionQuiz\main.c
1. '''
2. Created on 26Jul.,2016
3. @author: Araya
4. '''
5. import random
6. if __name__ == '__main__':
7. pass
8. #1. Generate two random single-digit integers
9. number1 = int(random.random()*100 % 10)
10. number2 = int(random.random()*100 % 10)
11. # 2. If number1 < number2, swap number1 with number2
12. if (number1 < number2):
13. number1, number2 = number2, number1
14. # 3. loop prompt user for answer
15. answer = int(input("What is {} - {}
?".format(number1,number2)))
16. while (number1 - number2 != answer):

105 | Page














Araya's Creation

17. print("Your answer is wrong.\n Try again!")
18. answer = int(input("What is {} - {}
?".format(number1,number2)))
19. print("You are correct!")
















รูปที่ 5.2 ผลตอบสนองของโปรแกรมจาก Listing 5.1


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

ว่าจะต้องท ากครั้ง แต่ทราบเงื่อนไขที่จะให้ออกจากลูป ดังตัวอย่างของเกมลบเลขใน Listing ที่ 5.2 เราไมมี
ทางทราบได้ว่าผู้ใช้จะต้องท าการเดาค าตอบกี่ครั้ง แต่เราทราบว่าจะออกจากลูปเมื่อค าตอบที่ผู้ใช้ใส่เข้ามาเป็น
ค าตอบที่ถกต้อง

การใช้ลูปส าหรับผู้เขียนโปรแกรมที่เพิ่งฝึกเขียนอาจจะเป็นเรื่องยากและสับสน ดังนั้นการออกแบบลูป


ให้ค านึงถงสิ่งต่อไปนี้
1. แยกแยะให้ออกว่าชุดค าสั่งไหนที่ต้องการท าซ้ า
2. ห่อหุ้มชุดค าสั่งดังกล่าวด้วยย่อหน้า โดยมีลักษณะดังนี้
while (true):
statement
statement
3. ท าการเพิ่มเงื่อนไขที่จะท าให้ลูปท างาน และชุดค าสั่งที่ปรับค่าตัววิ่งของลูป ทั้งนี้สองส่วนนี้จะต้อง
สัมพันธ์กัน ซึ่งจะท าให้ลูปมีลักษณะดังนี้
while (เงื่อนไขทท าให้ลูปท างาน):
ี่
statements

ชุดค าสั่งที่ใช้ควบคุมลูป (อพเดทค่าให้กับตัวแปรที่ท าให้ลูปวิ่ง)

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


continueLoop = 'Y'

while (continueLoop == 'Y' or continueLoop =='y'):


106 | Page








Araya's Creation

print("Do something")

continueLoop = input("Enter Y or y to continue: ")

5.2 The do-while Loop

จริงๆแล้วโครงสร้าง do-while loop ไม่มีใน Python ลักษณะของลูปชนิดนี้จะทาการทดสอบ

ื่

เงื่อนไขกอนค่อยท าหากเงอนไขเป็นจริง ผังงานของลูปชนิดนี้แสดงในรูปที่ 5.2 รูปแบบทั่วไปของ do-
while คือ
do
{
//loop body, do what you want to do
Statement(s)
} while (เงื่อนไขที่จะท าให้ลูปท างานต่อ)















รูปที่ 5.3 ผังงานของ do-while loop (Liang, 2013)



อย่างไรก็ตาม หากปัญหาบางอย่างต้องการการใช้งานลูปประเภทนี้ สามารถใช้การเขียน while loop
ในลักษณะของ while true loop ได้ดังนี้

while(True):
ch = input("Enter a character(q to quit): ")
if(ch == 'q'):
break
print("End")


จากโค้ดตัวอย่างในส่วนที่ 5.1 ที่ใช้ while loop ในการบวกเลขจาก 0 ถึง 9 สามารถดัดแปลงให้อยู่ใน

รูปของ while true loop ได้ดัง Listing 5.3

Listing 5.3 TestDoWhile\main.py


1. '''
2. Created on 26Jul.,2016

107 | Page














Araya's Creation

3. @author: Araya
4. '''
5. import random
6. if __name__ == '__main__':
7. pass
8. sum = 0
9. i = 1
10. while True:
11. if (i < 10):
i. sum = sum + i # same as sum+=i
ii. i += 1
12. else:
i. break
13. print(sum)


การสังเกตค่าของ i และ sum สามารถท าได้โดยการใช้ Debugging mode ใน IDE เพื่อให้เห็นภาพ

ชัดเจนว่าเกิดอะไรขึ้น โปรแกรมดังกล่าวอาจให้ผลเหมือนกัน แต่หากลองปรับโค้ดใน Listing 5.1 ให้ใช้ do-
while ก็สามารถทดแทนกันได้ ดังแสดงตัวอย่างใน Listing 5.4


Listing 5.4 DoWhileSubtractionQuiz\main.py
1. '''
2. Created on 26Jul.,2016

3. @author: Araya
4. '''
5. import random
6. if __name__ == '__main__':
7. pass
8. #1. Generate two random single-digit integers
9. number1 = int(random.random()*100 % 10)
10. number2 = int(random.random()*100 % 10)
11. # 2. If number1 < number2, swap number1 with number2
12. if (number1 < number2):
13. number1,number2 = number2,number1
14. # 3. loop prompt user for answer
15. #answer = int(input("What is {} - {}
?".format(number1,number2)))
16. while True:
17. answer = int(input("What is {} - {}
?".format(number1,number2)))
18. if(number1 - number2 != answer):
19. print("Your answer is wrong.\n Try again!")
20. else:
21. print("You are correct!")
22. break

108 | Page








Araya's Creation

5.4 The for Loop


ลูปชนิดนี้ จริงๆแล้วคือ while loop ที่ถูกเขียนในรูปแบบดังนี้

i= start (ค่าเริ่มต้น)
while (i < stop):
#Loop body
...
i+=step # ปรับค่า i ที่ใช้ควบคุมลูป



เมื่อน ามาเขียนให้อยู่ในรูปของ for loop ท าได้ดังนี้
int i= initialValue (ค่าเริ่มต้น)
for i in sequence:
# loop body

รูปแบบทั่วไปของ for loop คือ

for ตัวแปร iteration in range (start:stop:step):
#loop body
ผังงานของ for loop แสดงในรูปที่ 5.3































รูปที่ 5.4 ผังงานของ for loop

จากโค้ดตัวอย่างในส่วนที่ 5.1 ที่ใช้ while loop ในการบวกเลขจาก 0 ถึง 9 ที่ถกแปลงเป็น do-
while loop ดังแสดงใน Listing 5.3 สามารถแปลงเป็น for loop ได้ดังแสดงใน Listing 5.4
109 | Page














Araya's Creation

Listing 5.4 ForLoop\main.py

1. '''
2. Created on 26Jul.,2016

3. @author: Araya
4. '''
5. if __name__ == '__main__':
6. pass
7. sum = 0
8. for i in range(0,10):
9. sum += i
10. print(sum)



ข้อสังเกต


1. for loop มักถูกใช้กับกรณีที่รู้แน่นอนว่าท ากี่ครั้ง หรือกรณีที่รู้ชัดเจนเกี่ยวกับสเต็ปของลูป

2. การตั้งค่าเริ่มต้นและปรับสเต็บของลูปสามารถท าได้กับหลายตัวแปรพร้อมกัน เช่น
for i,j in enumerate(x):
#do something
3. ในส่วนของช่วงการท าลูป ใช้ range (stop) หรือ range (start:stop) หรือ
range (start:stop:step)


5.5 ค้าสั่งส้าหรับควบคุมทิศทาง

5.5.1 ค้าสั่งประกอบการควบคุมทิศทาง break
เป็นค าสั่งที่ใช้ออกจากวงจรท างาน หรือให้จบการท างาน จึงอาจใช้ค าสั่ง break เพอออกจากการ
ื่

ท างานในคาสั่ง while และ for เพื่อสั่งให้ออกจากโปรแกรมการท างานนั่นเอง
5.5.2 ค้าสั่งประกอบการควบคุมทิศทาง continue


เป็นค าสั่งให้กลับไปท างานยังค าสั่งแรกของค าสั่งควบคุม หรือเป็นการสั่งให้ข้ามค าสั่งที่เหลือในวงจร

แล้วกลับไปเริ่มทางานที่ต้นวงจรอีกครั้ง ค าสั่ง continue จึงไม่ใช่ค าสั่งจบรอบการท างานในโปรแกรม จึง

สามารถใช้ค าสั่ง continue กับค าสั่ง while และ for ได้


***Note ค าสั่งควบคุมทิศทางทั้งสองนี้ สามารถท าให้โปรแกรมอาจดูง่ายเข้า แต่หากใช้มากๆ จะท าให้

สับสน ควรหลีกเลี่ยง***






110 | Page








Araya's Creation

5.6 Nested Loops

ลูปสามารถไปอยู่ในอีกลูปหนึ่งได้ การซ้อนลูปนี้จะได้ใช้งานมากในส่วนของ arrays ที่เป็นสองมิติ ใน

ลักษณะของแมทริกซที่มีหลักและแถว ท าให้ต้องวนท างานให้ครบทุกแถวและทุกหลัก Listing 5.5 แสดงการ
ใช้งานลูปซ้อนลูป ในการแสดงตารางสูตรคูณแบบสองมิติ สังเกตได้ว่าบรรทัดที่ 10 และ 17 มีการใช้ j ทั้ง

สองลูป การเขียนโปรแกรมแบบนี้ j ที่อยู่ในลูปด้านในของ i จะเป็นคนละ j ที่อยู่ด้านนอก
Listing 5.5 MultiplicationTable\main.py
1. '''
2. Created on 29Jul.,2016

3. @author: Araya
4. '''
5. import sys
6. if __name__ == '__main__':
7. pass
8. print("=============================================
===========\n")
9. print(" Multiplication Table\n")
10. print("=============================================
===========\n")
11. j=0
12. i=0
13. #Display the number title
14. sys.stdout.write(" | ")
15. for j in range(1,13):
16. sys.stdout.write("%4d" % j)
17. print("\n")
18. # Display table body
19. for i in range(2,13):
20. sys.stdout.write("%4d| " % i)
21. for j in range(1,13):
22. #Display the product and align properly
23. sys.stdout.write("%4d" % (i*j))
24. print("\n")


ข้อสังเกตุ : การใช้ print ( ) จะได้ new line มาด้วยเสมอ หากไม่ต้องการบรรทัดใหม่ให้ใช้

sys.stdout.write( ) ในการแสดงผลออกทางหน้าจอ


111 | Page














Araya's Creation

ข้อผิดพลาดที่เกิดบ่อยในการใช้ loops

1. ใช้ for loop สร้าง empty loop เช่น
for i in range(1:100)


การใช้งานลูปหรือการวนรอบเป็นหัวใจส าคัญของการเขียนโปรแกรม ทุกครั้งที่ใช้งานลูปจงพึงระลึกว่า
1. ล าดับของ statement และกลุ่มของ statement ที่ห่อหุ้มด้วยย่อหน้า

2. ทดลงกระดาษเสมอ เพื่อค านวณว่าเกิดอะไรขึ้นกับตัวแปรแต่ละตัวในลูป ในแต่ละ iteration ของลูป

3. ใช้ variables window ใน Debugger Perspective ช่วยในการดูค่าที่เปลี่ยนแปลงในตัวแปรในช่วงของ
การวนลูป






























































112 | Page








Araya's Creation

1309 200 Computer Programming Laboratory

ปฏิบัติการที่ 5: Using Loop Constructs



วัตถุประสงค์
1. สามารถใช้งานค าสั่งในรูปแบบ while ได้

2. สามารถใช้งานค าสั่งในรูปแบบ while true loop ได้
3. สามารถใช้งานค าสั่งในรูปแบบ for ได้

ทฤษฎีที่เกี่ยวข้อง


ลูปเป็นโครงสร้างของการกระท าซ้ า ถ้ากระท าซ้ าอย่างต่อเนื่องไม่มีที่สิ้นสุดคือ infinity loop ซึ่งอาจเกิดได้

บ่อยเมอผู้เขียนโปรแกรมเริ่มต้น ท าการเขียนโปรแกรมใหม่ๆ ความผิดพลาดที่อาจะเกิด infinity loop อาจ
ื่
เนื่องมาจาก

1. ไม่เข้าใจตรรกะที่แท้จริงของการแก้ปัญหา

2. น าลูปมาใช้ในงานที่ไม่ต้องใช้ลูป
3. ไม่เข้าใจโครงสร้างของลูปอย่างแท้จริง

4. ไม่มการทดสอบลูปด้วยการทดลงกระดาษกอนน าไปใช้งานจริง


ลูปในบทนี้มี 3 ชนิด ได้แก่ while, while True และ for loops แต่ละชนิดใช้งานแตกต่างกันไป
โดยมีข้อสังเกตดังนี้


1. หากมีจุดสิ้นสุดที่ชัดเจน เช่นรู้ว่าจะท ากี่ครั้ง while และ for ใช้แทนกันได้

2. while หรือ while True สามารถน ามาใช้ในการเขียนโปรแกรมให้รันแล้วรันเล่าจนกว่าผู้ใช้
จะป้อนค่าที่เหมาะสมให้ออกจากโปรแกรม


3. for เหมาะส าหรับใช้งานกับพวกอาร์เรย์ หรือลิสต์ หรือขอมูลที่เป็นล าดับ ซึ่งจะได้เรียนในบท
ต่อๆไป
4. เช็คเงื่อนไขของการวนลูป และการออกจากลูปหากพบว่าลูปที่เขียนท างานไม่ถูกต้อง

5. อย่าลืม : หลัง while, for clauses








113 | Page














Araya's Creation

ปฏิบัติการส่วนที่ 1 การน าแสดงเมนูเพื่อรับค่าจากผู้ใช้ให้ออกจากโปรแกรม


จากบทที่ 3 ในปฏิบัติการที่ 4 Listing 3.6 เป็นการสร้างเมนูอย่างง่าย สังเกตได้ว่าหากใส่ค่าตัวเลือก

เข้าไป จะแสดงผลตามที่ตั้งไว้ในเคส และจบโปรแกรมทันทดังแสดงในรูปที่ 5.4 Listing 5.6 เป็นการปรับให้มี
การแสดงเมนูอีก จนกว่าผู้ใช้จะใส่ ‘e’ หรือ ‘E’ เพื่อออกจากโปรแกรม




























รูปที่ 5.4 ผลตอบสนองของโปรแกรมใน Listing 3.6


Listing 5.6 WhilePressE\main.py


'''
Created on 26Jul.,2016

@author: Araya
'''

if __name__ == '__main__':
pass
# Greeting user
while True:
print("Welcome to my program!\nInput E or e to exit\n")

print("1.Latte\n2.Cappuccino\n3.Americano\n4.Espresso\n5.Choco
late\n")
# getting user's pick
choice = input("Please pick your choice:")
# check what's the order
114 | Page








Araya's Creation

if(choice=='E' or choice == 'e'):
print("Bye!")
break
if(choice == '1'):
# do what you have to if user pick 1
print("\nHere is your cup of latte.\n")
elif(choice == '2'):
# do what you have to if user pick 2
print("\nHere is your cup of cappuccino.\n")
# do what you have to if user pick 3
elif(choice == '3'):
# do what you have to if user pick 3
print("\nHere is your cup of americano.\n")
elif(choice == '4'):
# do what you have to if user pick 4
print("\nHere is your cup of espresso.\n")
elif(choice == '5'):
# do what you have to if user pick 5
print("\nHere is your cup of chocolate.\n")
else:
# default://if the input is not in our cases
print("\nInvalid choice, bye!\n")
ขั้นตอนของการแก้ไขโค้ดท าดังนี้


1. แก้ไข Listing 3.6 ให้มี if ของ ‘e’ และ ‘E’ โดยการก าหนดว่าถ้าเป็นอกขระใดอักขระหนึ่งก็

ให้ก าหนดค่าให้ choice เป็น ‘E’ ส าหรับการออกจากลูป

2. สร้าง while true block ดังนี้

while True:
if(choice=='E' or choice == 'e'):
print("Bye!")
break
# from previous Listing

3. น าโค้ดที่แกในข้อ 1 เข้าไปใส่ในย่อหน้าของข้อสอง

ี่
★ค าสั่ง จากตัวอย่างข้างต้น ให้ท าการแก้ไขโค้ดทได้ท าในปฏิบัติการส่วนที่ 3 ปฏิบัติการที่ 4 เรื่องของการท า
เมนูเลือกค านวณ พื้นที่วงกลม เส้นรอบวง และปริมาตรทรงกลม (โปรเจ็ค CircleMenu) โดยให้ท าการรัน
จนกว่าผู้ใช้จะใส่ค่าที่ก าหนดให้เข้าไปเพื่อให้หลุดออกจากโปรแกรมดังตัวอย่าง Listing 5.6 ข้างต้น


★ค าสั่ง จงท าการแก้ไขโปรเจ็คที่ได้ข้างต้น ให้อยู่ในรูปของ while loop
115 | Page














Araya's Creation

ปฏิบัติการที่ 2 การใช้ for loop


จาก Listing ที่ 5.5 เป็นการสร้างตารางสูตรคูณแบบสองมิติ


★ค้าสั่ง จงท าการปรับปรุงแก้ไข Listing 5.5 ให้แสดงสูตรคูณของแม่ใดแม่หนึ่ง โดยรับค่าแม่สูตรคูณเข้ามา

ื่
จากผู้ใช้ ทั้งนี้โปรแกรมต้องถูกครอบด้วยลูปและเมนู เพื่อให้รันจนกว่าจะกด E เพอออกจากโปรแกรม โดย
ผลตอบสนองของโปรแกรมอาจมีลักษณะดังรูปที่ 5.8



































รูปที่ 5.8 ผลตอบสนองของโปรแกรมแม่สูตรคูณที่มีเมนูวนซ้ า





























116 | Page








Araya's Creation

แบบฝึกหัด




★ค้าสั่ง ให้นักศกษาน ารหัสนักศึกษาของตนเอง modulus ด้วย 4 หากได้เศษ 0 ให้ท าข้อ 4 เศษ 1 ท าขอ 1
เศษ 2 ท าข้อ 2 และเศษ 3 ท าข้อ 3 โดยท าการเขียนโค้ดในโปรเจ็คใหม่ เพื่อหาผลลัพท์ของการท า modulo

รหัสนักศึกษาของตนเองกอนท าการเขียนโค้ด ตามโจทย์ของข้อที่ได้ต่อไปนี้

1. (Probability) The probability that a telephone call will last less than t minutes can be
approximated by the exponential probability function:

Probability that a call lasts less than t minutes = 1 −
a is the average call length.
e is Euler’s number (2.71828).

For example, assuming the average call length is 2 minutes, the probability that a call will
last less than 1 minute is calculated as 1 - e-1/2 = 0.3297. Using this probability equation,
write a C program that calculates and displays a list of probabilities of a call lasting less than
1 minute to less than 10 minutes, in 1-minute increments.


2. (Numerical Analysis) The Fibonacci sequence is 0, 1, 1, 2, 3, 5, 8, 13, . . . the first two
terms are 0 and 1, and each term thereafter is the sum of the two preceding terms—that is,
Fib[n] = Fib[n - 1] + Fib[n - 2]. Using this information, write a C program that calculates the

nth number in a Fibonacci sequence, where the user enters n into the program interactively.
For example, if n = 6, the program should display the value 5.

3. (Numerical Analysis) A prime integer number is one that has exactly two different

divisors, namely 1 and the number itself. Write, run, and test a C program that finds and
prints all the prime numbers less than 100. (Hint: 1 is a prime number. For each number
from 2 to 100, find Remainder = Number % n, where n ranges from 2 to sqrt(number). If n is
greater than sqrt(number), the number is not equally divisible by n. Why? If any Remainder

equals 0, the number is not a prime number.)

4. (Misc. Application) According to legend, the island of Manhattan was purchased from
the native Indian population in 1626 for $24. Assuming this money was invested in a Dutch

bank paying 5% simple interest per year, construct a table showing how much money the
native population would have at the end of each 50-year period, starting in 1626 and ending
400 years later.


117 | Page














Araya's Creation

This page is intentionally left blank.






















































118 | Page








Araya's Creation

บทที่ 6



ฟังก์ชั่นที่ผู้ใช้ก ำหนดเอง และกำรเรียกตัวเอง

(User Defined Functions and Recursive)

การเขียนโปรแกรมคอมพิวเตอร์เพื่อแก้ปัญหาการค านวนเชิงวิศวกรรมโดยพื้นฐานแล้วเป็นการรับ

ข้อมูลเข้ามาเพื่อประมวลผลและแสดงผลข้อมูลออกไป สามารถแสดงได้ในรูป 6.1 โดยกล่องคือกระบวนการ มี
การรับ input เข้ามา และส่ง output ออกไปหลังจากผ่านกระบวนการแล้ว ในความเป็นจริง โปรแกรมที่มี
ขนาดใหญ่ ก็มีแนวคิดในลักษณะเดียวกัน แต่มีการแบ่งขั้นตอนการประมวลผลออกเป็นส่วนย่อยที่เรียกว่า
โมดูล (module) แต่ละโมดูลท าหน้าที่เสมือนกล่องในรูป 6.1 เมื่อโมดูลเหล่านี้ประกอบกันอยู่ก็สามารถท างาน

ที่ซับซ้อนได้ ดังแสดงในรูป 6.2 อีกทงแต่ละโมดูลสามารถน าไปใช้งานซ้ าได้ (re-use) หลักการนี้ถูกน ามาใช้ใน
ั้
การเขียนโปรแกรมที่แบ่งการท างานออกเป็นฟังก์ชั่น ซึ่งลักษณะการใช้งานก็คล้ายคลึงกับฟังก์ชั่นทาง
คณิตศาสตร์ที่ได้กล่าวถึงไปแล้วในบทที่ 2 และ 4

















รูปที่ 6.1 หลักการพื้นฐานของการเขียนโปรแกรมเพื่อแก้ปัญหา

















รูปที่ 6.2 แสดงการแบ่งปัญหาเป็นโมดูลย่อย






119 | Page













Araya's Creation

ฟังก์ชั่น สามารถใช้เพื่อก าหนดส่วนของโปรแกรมเป็นส่วนย่อยๆที่น ามาใช้งานได้หลายๆครั้ง การ
ก าหนดโค้ดเป็นส่วนย่อยๆนี้จะท าให้โปรแกรมอ่านง่าย ลดความซ้ าซ้อนของโค้ด ท าความเข้าใจง่าย ทั้งยังแก้ไข

ข้อบกพร่องผิดพลาดของโปรแกรมได้ง่ายกว่าการไม่แบ่งแยกเป็นโมดูล




ยกตัวอย่างเช่น หากต้องการบวกเลขจาก 1 ถึง 10 จาก 20 ถึง 37 และจาก 35 ถึง 49 ตามล าดับ ก็จะต้องท า
การเขียนโค้ดสามชุดดังนี้

sum, i = 0
for i in range (1,10):
sum += i
print("Sum from 1 to 10 is %d.\n" % sum)


sum, i = 0
for i in range (20,37):
sum += i
print("Sum from 20 to 37 is %d.\n" % sum)

sum, i = 0
for i in range (35,49):
sum += i
print("Sum from 35 to 49 is %d.\n" % sum)

หากลองสังเกตดูจะเห็นว่ามีความคล้ายคลึงของโค้ดทั้งสามชุดอยู่ ทั้งนี้ สามารถน ามาเขียนเป็นฟังก์ชั่นแล้วให้
ท าการเรียกใช้งานฟังก์ชั่นดังกล่าวในฟังก์ชั่นหลัก ได้ดังนี้
1. def mysum(x,y):
2. summ = 0
3. for i in range(x,y):
4. summ+=i
5. return summ
6. if __name__ == '__main__':
7. pass

8. print("Sum from 1 to 10 is " + str(mysum(1, 10)))
9. print("Sum from 1 to 10 is " + str(mysum(20, 37)))
10. print("Sum from 1 to 10 is " + str(mysum(35, 49)))
จากโค้ดข้างต้น บรรทัดที่ 1 – 5 เป็นการก าหนดฟังก์ชั่นที่ชื่อ mysum โดยฟังก์ชั่นนี้ส่งค่ากลับ
(return) เป็นชนิด integer (int) และต้องการพารามิเตอร์สองตัวคือ x, y ซึ่งเป็นชนิด integer เช่นกัน

บรรทัดที่ 8 – 10 ในส่วนของฟังก์ชั่นหลัก เป็นการเรียกใช้งานฟังก์ชั่น mysum โดยเรียก mysum
(1,10), mysum(20,37) และ mysum(35,49) ตามล าดับ จะสังเกตได้ว่าแทนการเขียนโค้ดชุด

เดียวกัน 3 ครั้ง แต่ท าการเขียนฟังก์ชั่นครั้งเดียว แล้วท าการเรียกใช้งานฟังก์ชั่นดังกล่าว 3 ครั้งด้วย
พารามิเตอร์ที่แตกต่างกันไป



120 | Page








Araya's Creation


ประเภทของฟงก์ชั่น สามารถแบ่งออกเป็นสองอย่าง คือ ฟังก์ชั่นมาตรฐานของภาษาไพธอน และฟังก์ชั่นที่ผู้ใช้
ก าหนดเอง หรือสร้างขึ้นเอง


ฟังก์ชั่นมำตรฐำนของภำษำไพธอน (Python Built-in Functions)
ฟังก์ชั่นที่สามารถเรียกใช้งานโดยไม่ต้องเขียนตัวฟังก์ชั่นขึ้นเอง เช่นฟังก์ชั่น int() ฟังก์ชั่นรับค่า
input() ฟังก์ชั่นแสดงผล print() เป็นต้น โดยการใช้งานฟังก์ชั่นเหล่านี้ต้องทราบว่าฟังก์ชั่น

ดังกล่าวถูกก าหนดไว้ในไลบราลีใด จึงก าหนด import นั้นในส่วนหัวโปรแกรม หากเป็นฟังก์ชั่นที่อยู่ในโมดูล

ฟังก์ชั่นที่ผู้ใช้สร้ำงขึ้นเอง (User Define Function)
ฟังก์ชั่นที่ผู้ใช้เขียนขึ้นมาเองโดยอาจแยกส่วนออกจากโปรแกรมหลังเพื่ออ่านโปรแกรมได้ง่าย และลด

ความซ้ าซ้อนของบรรทัดค าสั่ง หรือเขียนขึ้นเพื่อเป็นค าสั่งใหม่เนื่องจากในฟังก์ชั่นมาตรฐานของภาษาไพธอน
ไม่ได้ก าหนดไว้


กำรก ำหนดต ำแหน่งของฟงก์ชั่น
ภาษา ไพธอน นั้นสามารถเขียนฟังก์ชั่นไว้ในต าแหน่งใดๆ ก็ได้ในโปรแกรม อีกทั้งสามารถเขียนไว้ใน


ฟังก์ชั่นได้อกด้วย ทั้งนี้ไม่จ าเป็นต้องประกาศต้นแบบของฟงก์ชั่น (Function Prototype) เพียงแต่ขอให้
ประกาศฟังก์ชั่นก่อนการเรียกใช้งานฟังก์ชั่นเท่านั้นเอง
ทั้งนี้เพอความสะดวกในการอานโค้ด โดยปกติฟังก์ชั่นจะเขียนไว้ส่วนบนทั้งหมด เพอให้ทราบว่าใน
ื่
ื่

โปรแกรมมฟังก์ชั่นอะไรบ้างและมีรูปแบบการใช้งานอย่างไร ซึ่งจะท าให้สะดวกในการใช้งานและ การ

ตรวจสอบในภายหลัง

6.1 กำรก ำหนดฟังก์ชั่น (Defining a Function)



การก าหนดฟังก์ชั่นประกอบไปด้วย ชื่อฟงก์ชั่นที่เป็นไปตามหลักการตั้งชื่อ (function name),

พารามิเตอร์หรือรายการสิ่งที่ต้องส่งเข้าไปในฟังก์ชั่นเวลาเรียกใช้งานฟงก์ชั่น (parameters), ชนิดของค่าที่
ส่งกลับ (return value type) และ ส่วนของตัวฟังก์ชั่น (body) รูปแบบทั่วไปคือ

def functionName (list of parameters):

#function body
return













121 | Page













Araya's Creation

ตัวอย่างของฟังก์ชั่นและองค์ประกอบต่างๆแสดงในรูปที่ 6.3




















รูปที่ 6.3 แสดงฟังก์ชั่น องค์ประกอบของฟงก์ชั่น และการเรียกใช้ฟังก์ชั่น

Listing 6.1 เป็นตัวอย่างการเรียกใช้ฟังก์ชั่น max ที่อยู่ในรูป 6.3 ฟังก์ชั่น max เป็นฟังกชั่นที่รับ

พารามิเตอร์เป็นเลขจ านวนเต็มสองจ านวน แล้วส่งค่ากลับเป็นเลขจ านวนเต็มตัวที่มากทสุดในสองจ านวนนั้น
ี่
Listing 6.1 TestMax\main.py


'''
Created on 29Jul.,2016
@author: Araya
'''

if __name__ == '__main__':
pass
def mymax(num1, num2):
if (num1 > num2):
result = num1
else:
result = num2
return result
i = int(input("Enter a number: "))
j = int(input("Enter a number: "))
k = int(mymax(i, j))
print("The maximum between %d and %d is %d.\n" %(i,j,k))


หากน า Listing 6.1 นี้ไปท าการ Debug จะเห็นค่าที่เปลี่ยนแปลงไปในตัวแปรแต่ละตัวในแต่ละ
ี่
บรรทัดขณะเรียกใช้ mymax สิ่งที่ถูกส่งเข้าไปในฟังก์ชั่นเป็นส าเนาของค่าทอยู่ในตัวแปร i และ j ดังนั้น
หลังจากเรียกใช้งานฟังก์ชั่นแล้วค่าของ i และ j ก็ไม่มีการเปลี่ยนแปลง การส่งค่าในลักษณะนี้เรียกว่า pass-
by-value



การท างานของโปรแกรมใน Listing 6.1 เริ่มต้นที่ในฟงก์ชั่นหลัก เมื่อมีการเรียกใช้งานฟังก์ชั่น

mymax ก็จะกระโดดไปประมวลผลบรรทัดที่อยู่ในฟังก์ชั่น mymax โดยมีการส่งค่า i และ j จากฟงก์ชั่น
122 | Page








Araya's Creation

หลักเข้าไปท างานในส่วนของฟังก์ชั่น mymax โปรดสังเกตว่าสิ่งที่ส่งเข้าไปคือส าเนาของค่าที่อยู่ในตัวแปร i

ี่
และ j เมื่อประมวลผลส่วนดังกล่าวเสร็จก็จะมีการกลับมาท างานทฟังก์ชั่นหลักต่อ


เมื่อฟังก์ชั่น mymax ถูกเรียกใช้งานจะมีการน าค่าที่อยู่ในตัวแปรแต่ละค่าที่ใช้ส่งผ่านเข้าไปในฟังก์ชั่น

ไปเก็บไว้ในหน่วยความจ าที่เรียกว่า stack (อ่านว่าสแตค) ใน stack นี้มีการท างานในลักษณะที่เข้าก่อนออก
หลัง (first in last out) เสมือนการวางแผ่น ซีดีลงไปในหลอดเก็บ ซีดี แผ่นที่ถูกวางลงไปก่อน จะสามารถถูก


น าออกมาได้ก็ต่อเมื่อแผ่นที่เขาไปที่หลังที่อยู่ข้างบนถูกน าออกมาแล้วเท่านั้น ความเปลี่ยนแปลงใน
หน่วยความจ าส่วนนี้สามารถอธิบายได้ในรูปที่ 6.4 ในรูปใช้ชื่อฟังก์ชั่นว่า max
































รูปที่ 6.5 แสดง stack เมื่อฟงก์ชั่น max ถูกเรียกใช้งาน (Liang 2013)

6.2 ฟังก์ชั่นที่ไม่ส่งค่ำกลับ (void Functions)


ในไพธอน ชนิดของข้อมูลเป็น dynamic คือมีการเปลี่ยนแปลงได้ตลอด และผู้พัฒนาไม่จ าเป็นต้อง

ก าหนดชนิดของข้อมูลที่จะส่งกลับ การเขียนฟังก์ชั่นที่ไม่ส่งค่ากลับมาที่ฟังก์ชั่นหลักสามารถท าได้โดยไม่ต้องมี
ชุดค าสั่ง return หรือมีชุดค าสั่ง return None ก็ได้ เช่น



def greeting(flag):
if (flag == '1'):
print("Welcome to my program.")
else:

123 | Page













Araya's Creation

print("Thank you for using my program.")
#return None


ฟังก์ชั่นนี้สามารถน าไปเรียกใช้ในตอนเริ่มโปรแกรมและก่อนออกจากโปรแกรมได้ด้วยการส่งค่า
flag เข้าไปในฟังก์ชั่นเพื่อเป็นการก าหนดว่าจะเป็นการทักทายผู้ใช้ตอนเริ่มโปรแกรมหรือตอนจะออกจาก


โปรแกรม ให้สังเกตว่า return None จะมีหรือไม่มีก็ได้ หรือจะมีแค return ก็ได้ การก าหนดฟังก์ชั่น

ก็ยังถอว่าถูกต้องตามหลักของภาษาอยู่ ไม่ม error แต่อย่างใด




6.3 กำรเรียกด้วยค่ำหรือกำรเรียกด้วยตัวอ้ำงอิง (Pass by Value or Pass by Reference)


โดยปกติแล้วการส่งผ่านพารามิเตอร์ให้กับฟงก์ชั่นในการเขยนโปรแกรมนั้นสามารถท าได้ 2 รูปแบบ


คือการส่งผ่านด้วยค่า หรือส่งผ่านด้วยตัวอ้างอิง ในไพธอนเป็นการส่งผ่าน object reference คือตัวอ้างอิง
วัตถุ ซึ่งไม่ใช่ reference เสียทีเดียวเหมือนภาษาอื่นๆ และก็ไม่ใช่ตัวแปร เพราะการใช้ชื่อหรือตัวแปรในไพ
ธอน เป็นการท า name tagging อย่างไรก็ตามเพอให้เข้าใจได้ง่ายขึ้น การส่งผ่านทั่วไปสามารถอธิบายได้ดังนี้
ื่
หากเป็นตัวแปรที่เป็นชนิดข้อมูลแบบพื้นฐานเช่น จ านวนเต็ม จ านวนทศนิยม จะเป็นการส่งผ่านด้วยค่า คือท า


ส าเนาค่าของตัวแปรดังกล่าวแล้วส่งส าเนาเข้าไปในฟังก์ชั่นเวลาที่เรียกใช้งานฟงก์ชั่น แต่หากเป็นตัวอ้างอิงที่

เอาไว้อ้างอิงข้อมูลชนิดวัตถุ หรือเป็นชื่อของอาร์เรย์หรือลิสต์ เมื่อส่งตัวอ้างองผ่านเข้าไปในฟังก์ชั่น จะท าให้
สามารถเปลี่ยนแปลงค่าในหน่วยความจ าที่ตัวอ้างอิงนั้นชี้อยู่ได้ ลักษณะนี้เรียกว่า Call by Reference


ในไพธอนแตกต่างจากที่ได้อธิบายข้างต้นคือ แรกเลยไพธอนจะจัดการเหมือน Call by reference

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

หรือชื่อนั้นๆ ไพธอนจะเปลี่ยนไปจัดการเหมือน Call by value ทันที

Listing 6.2 แสดงตัวอย่างของการส่งผ่านด้วยค่า ซึ่งมีปัญหาหากต้องการเปลี่ยนแปลงค่าที่อยู่ในตัว
แปรที่ถูกใช้เป็น arguments หรือสิ่งที่ส่งเข้าไปในฟังก์ชั่นเวลาเรียกใช้งานฟังก์ชั่น โปรแกรมนี้พยายามที่จะ

เพิ่มคาของ x โดยการเรียกใช้ฟังก์ชั่น increment(x) แต่ไม่มการเปลี่ยนแปลงค่าของ x แต่อย่างใด


เนื่องจากเป็นการส าเนาค่าของ x ส่งเข้าไปในฟังก์ชั่น ไม่ใช่การส่งต้นฉบับเข้าไป ผลตอบสนองของโปรแกรม
แสดงในรูปที่ 6.6

Listing 6.2 Increment\main.py
def increments(x):
x+=1
print("x inside function is " +str(x))
x = 1
print("x before call increments(x) is "+ str(x))
increments(x)
print("x after call increments(x) is "+ str(x))
124 | Page








Araya's Creation

รูปที่ 6.6 ผลตอบสนองของโปรแกรมใน Listing 6.2


การท าความเข้าใจกับพารามิเตอร์ของฟงก์ชั่นในไพธอนนี้ต้องเข้าใจเรื่องของ mutable และ

immutable objects เสียก่อน immutable type ในไพธอนได้แก int, float, complex, string, tuple,

frozen set และ bytes เมื่อบอกว่าเป็น immutable หมายความว่าวัตถุนั้นเปลี่ยนแปลงไม่ได้ เช่น เมื่อ

ก าหนด x = 1 แล้วก าหนด x = 2 เป็นการสร้างจ านวนเต็ม 1 และจ านวนเต็ม 2 ขึ้นมา และเมื่อใช้ชื่อ x ไว้
อ้างถงจ านวนเต็ม 2 แล้ว จ านวนเต็ม 1 นั้นก็หาทางย้อนกลับไปอ้างถึงอีกไม่ได้เนื่องจากได้อ้าง x กับจ านวน

เต็ม 2 ไปแล้ว (ย้อนกลับไปดูบทที่ 2 เกี่ยวกับ name tagging idea ของไพธอน)


ส่วน mutable objects คือวัตถุที่สามารถปรับเปลี่ยนค่าได้ เช่น list, dictionary, set และ byte
array เปลี่ยนค่าได้ในที่นี้หมายถึงปรับเปลี่ยนค่าของวัตถุทถูกสร้างขึ้นมาแล้ว ตัวอย่างต่อไปนี้ ใช้ id( ) ในการ
ี่
อธิบายต าแหน่งที่อยู่ของตัวแปรในหน่วยความจ าเพื่อให้เห็นภาพของ mutable และ immutable objects
ในการใช้งานฟังก์ชั่น


def ref_demo(x):
print ("x= "+ str(x) + " id=" + str(id(x)))
x=42
print ("x= " + str(x) + " id=" + str(id(x)))
x = 10
print("x id is " +str(id(x)))
ref_demo(x)
print("x id after ref_demo(x) called is " +str(id(x)))



125 | Page













Araya's Creation

เมื่อท าการรัน จะได้ผลดังรูปที่ 6.7 ซึ่งจะเห็นได้ว่ามีการสร้างจ านวนเต็ม 42 ขึ้นมาใหม่ และ id หรือ

ต าแหน่งที่อยู่ของวัตถุจ านวนเต็ม 42 ก็ไม่ได้อยู่ที่เดียวกับจ านวนเต็ม 10 และจะเห็นได้ว่าหลังจากที่เรียก
ฟังก์ชั่น ref_demo(x) แล้ว id(x) ก็ยังเป็นตัวเดิม ต าแหน่งเดิมอยู่ ไม่ได้เปลี่ยนไปในการก าหนด

ด้วย = ในฟังก์ชั่นแต่อย่างใด ฟังก์ชั่น id( ) เป็นการเรียกดู identity ของวัตถุ จะเห็นได้ว่าไพธอนจะ


ปฏิบัติต่อพารามิเตอร์ในการเรียกใช้ ref_demo(x) เสมือน call by reference แต่เมื่อมีการกาหนดค่า
ให้กับ x ด้วยเครื่องหมายก าหนดค่า ( = ) แล้ว ไพธอนจะเปลี่ยนไปจัดการแบบ call by value ทันที

เนื่องจาก x เป็นจ านวนเต็ม และเป็น immutable type object























รูปที่ 6.7 แสดงผลตอบสนองของโปรแกรมที่เรียกใช้ ref_demo( )


เหตุการณ์จะเปลี่ยนไปเมื่อสิ่งที่เป็นพารามิเตอร์ของฟังก์ชั่นเป็น mutable type object ดังตัวอย่างนี้
จะได้ผลตอบสนองดังแสดงในรูปที่ 6.8


def func1(list):
print("Inside funct1 before assignment")
print(list)
list = [10, 20]
print("Inside funct1 after assignment")
print(list)
fib = [1,2,3,4,5,7,8]
print("Before calling func1(fib)")
print(fib)
func1(fib)
print("After calling func1(fib)")
print(fib)
จะสังเกตเห็นว่าสิ่งที่อยู่ใน fib เปลี่ยนไปในส่วนของฟังก์ชั่น แต่เมื่อหลุดออกมาจากฟังก์ชั่นแล้วจะ

พบว่าสิ่งที่อยู่ใน fib ไม่ได้ถูกเปลี่ยนแปลงแต่อย่างใด ทั้งๆที่ fib นั้นเป็น mutable object ควรจะถูก

ปฏิบัติแบบ call by reference ซึ่งก็เป็นไปตามนั้นในการพิมพ์สิ่งที่อยู่ใน fib ด้วย print(list) ใน

126 | Page








Araya's Creation

ส่วนของ func1( ) หากแต่การปฏิบัติต่อ fib เปลี่ยนไป เมื่อมีการก าหนด fib ด้วยเครื่องหมาย

ก าหนดค่า ( = ) ท าให้ไพธอนปฏิบัติต่อ fib ในลักษณะของ call by value สังเกตผลตอบสนองดังรูปที่ 6.8

























ี่
รูปท 6.8 แสดงผลตอบสนองของโปรแกรมที่เรียกใช้ func1(fib)

เหตุการณ์จะเปลี่ยนไปในอกลักษณะหนึ่งเมื่อ แทนที่เครื่องหมายก าหนดค่าด้วยการใช้เมธอด
.append หรือการใช้ += แทน = ดังนี้
def func1(list):
print("Inside funct1 before assignment")
print(list)
list += [10, 20] #list.append(10) list.append(20)
print("Inside funct1 after assignment")
print(list)
fib = [1,2,3,4,5,7,8]
print("Before calling func1(fib)")
print(fib)
func1(fib)
print("After calling func1(fib)")
print(fib)
ผลตอบสนองจะเป็นดังรูปที่ 6.9 การปฏิบัติต่อ fib จะเป็น call by reference ดังเดิม ไม่มีการ
เปลี่ยนไปเป็นลักษณะของ call by value แต่อย่างใด










127 | Page













Araya's Creation

รูปที่ 6.9 แสดงผลตอบสนองของโปรแกรมที่เรียกใช้ func1(fib) ที่มีเมธอด .append

หากไม่ต้องการให้เกิดการเปลี่ยนแปลงกับลิสต์ที่มีอยู่ใน fib ก็สามารถโยนส าเนาของ fib ด้วยการ

เรียกใช้งาน func1(fib[:]) ก็จะท าให้ไพธอนปฏิบัติต่อ fib[:] แบบ immutable object และ
จะได้ผลดังผลตอบสนองในรูปที่ 6.8


6.4 Dynamic type return
ข้อดีของการเขียนฟังก์ชั่นในไพธอนเทียบกับภาษาโปรแกรมมิ่งอื่นๆคือ ไพธอนเป็น Dynamic type

ื่
return นั่นหมายความว่าผู้พัฒนาไม่ต้องเขียน function overloading เพอรองรับชนิดข้อมูลที่แตกต่างกันแต่
อย่างใด เนื่องจากไพธอนสามารถจัดการกับชนิดข้อมูลที่ส่งเข้าไปในฟังก์ชั่นได้โดยอตโนมัติ เช่นหากส่งจ านวน


เต็มเข้าไป ผลของการส่งค่ากลับก็สามารถเป็นจ านวนเต็ม หรือหากส่งจ านวนทศนิยมเขาไป ผลของการส่งค่า
กลับก็สามารถเป็นทศนิยมได้ โดยไม่ต้องเขียนฟังก์ชั่นขึ้นมาใหม่เพอ override ให้ท าการ overload ฟังก์ชั่น
ื่
แต่อย่างใด เช่น Listing ที่ 6.1 มีฟังก์ชั่น mymax หากลองปรับเปลี่ยนการเรียกใช้งานดัง Listing ที่ 6.3 จะ

ได้ผลตอบสนองดังรูปที่ 6.10


Listing 6.3 TestMax\main.py

'''
Created on 29Jul.,2016
@author: Araya
'''
if __name__ == '__main__':
pass

def mymax(num1, num2):
if (num1 > num2):
result = num1
else:
128 | Page








Araya's Creation

result = num2
#num2=10
return result
i = float(input("Enter a number: "))
j = float(input("Enter a number: "))
k = float(mymax(i, j))
print("The maximum between %5.2f and %5.2f is %5.2f.\n"
%(i,j,k))
ซึ่งจะสังเกตได้ว่า ในส่วนของฟังก์ชั่น ยังเป็นลักษณะเดียวกับ Listing 6.1 ทุกอย่าง ซึ่งจุดนี้เป็นข้อดี

ของภาษาไพธอนที่เป็นประโยชน์และประหยัดเวลาส าหรับผู้พัฒนาที่จะเขียนฟงก์ชั่นส าหรับรองรับชนิดข้อมูล
ที่แตกต่างกันของพารามิเตอร์ อย่างไรก็ตาม ให้พึงระลึกเสมอว่าล าดับของพารามิเตอร์นั้นส าคัญ และต้อง
ตามล าดับเสมอในการเรียกใช้งาน


6.5 กำรเขียนโปรแกรมแบบโมดูล (Modularity)



การแบ่งเป็นโมดูลท าให้การอานโค้ดง่ายและเข้าใจได้ง่ายขึ้น อีกทั้งเป็นการลดการซ้ าซ้อนของโค้ดดังที่
ได้กล่าวไปก่อนหน้านี้แล้ว Listing 6.4 เป็นตัวอย่างของโปรแกรมที่ค านวณค่าพื้นที่ของสามเหลี่ยม ซึ่งถูก
ดัดแปลงให้เป็น Listing 6.5 ในรูปแบบของการใช้ฟังก์ชั่นเข้าช่วยในการเขียนโปรแกรม โปรแกรมดังกล่าว

สามารถเขียน pseudo-code ได้ดังนี้


● greeting user
● input radius
● calculate area
● output area

● greeting user


Listing 6.4 CalculateArea\main.py

'''
Created on 4Aug.,2016

@author: Araya
'''
from math import pi, pow
if __name__ == '__main__':
pass
print("Welcome to my program, this program calculate a
circle area.")

129 | Page













Araya's Creation

radius = float(input("Enter a radius: "))
area = pi*pow(radius,2)
print("The area of the circle is %5.3f." % area)
print("Thank you for using my program.")



เมื่อท าการปรับปรุง Listing 6.4 ข้างต้นให้อยู่ในรูปของการใช้งานฟังก์ชั่น จะท าให้อ่านง่ายและ
สามารถหาข้อผิดพลาดของโปรแกรมได้ง่ายกว่า เมื่อเปรียบเทียบกับ pseudo-code แล้วจะพบว่าการเขียน

โปรแกรมในรูปแบบของโมดูล หรือใช้งานฟังก์ชั่น จะท าให้เข้าใจง่ายกว่าการเขียนโปรแกรมทั่วไป


Listing 6.5 CalculateAreaUsingModule\main.py


'''
Created on 4Aug.,2016

@author: Araya
'''
from math import pi, pow
if __name__ == '__main__':
pass
def greeting(flag):
if (flag == '1'):
print("Welcome to my program.")
else:
print("Thank you for using my program.")
#return None
def calculate(radius):
area = pi*pow(radius,2)
return area
def show_result(area):
print("The area of the circle is %5.3f." % area)
#main starts here
greeting(1)
radius = float(input("Enter a radius: "))
area = calculate(radius)
show_result(area)
greeting(0)



***Note ตัวอย่างนี้อาจมีจ านวนบรรทัดมากกว่าการไม่เขียนฟังก์ชั่น แต่หากโปรแกรมมีการท างานซ้ าซ้อนกัน

หลายๆครั้ง เช่นท าการค านวณหาพื้นที่ของวงกลมหลายๆครั้งด้วยค่ารัศมีที่แตกต่างกัน การเขียนเป็นฟังก์ชั่น


จะท าให้เข้าใจได้ง่ายกว่าการเขียนแบบไม่มฟังก์ชั่น***
130 | Page








Araya's Creation

6.4 สโคปของตัวแปร (Variable Scope)

ในการเขียนโปรแกรมที่ผ่านมาจะสามารถประกาศตัวแปรเพื่อใช้งานได้ทั้งในส่วนของฟังก์ชั่นหลักและ



ในฟังก์ชั่นย่อยต่างๆ นอกจากนี้ยังสามารถประกาศตัวแปรไว้นอกฟงก์ชั่นต่างๆ ซึ่งเป็นตัวแปรที่มีคณสมบัติ
แตกต่างกับตัวแปรที่ประกาศไว้ในฟังก์ชั่น โดยสามารถแบ่งชนิดของตัวแปรออกเป็น 3 แบบดังนี้



ตัวแปรร่วม (Global Variable) คือ ตัวแปรที่ประกาศคาไว้นอกฟังก์ชั่นต่างๆ ซึ่งตัวแปรดังกล่าวจะ

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



ตัวแปรประจ ำที่ (Local Variable) คือ ตัวแปรที่ประกาศค่าไว้ในฟังก์ชั่นต่างๆ ซึ่งฟงกชั่นที่ประกาศ
ค่าจะเป็นเจ้าของตัวแปรนั้น ฟังก์ชั่นอื่นๆ รวมทั้งฟังก์ชั่นหลักจะไม่สามารถอ้างถึงหรือเรียกใช้ได้เฉพาะฟงก์ชั่น


ที่ท าการประกาศคาเพียงฟังก์ชั่นเดียว และค่าของมันจะเปลี่ยนแปลงเฉพาะในฟังก์ชั่นที่ประกาศตัวแปรนี้
global variable เป็นการประกาศตัวแปรที่อยู่นอกฟงก์ชั่น main ท าให้สามารถเรียกใช้งานตัวแปร

ดังกล่าวได้ทั้งใน main และในฟังก์ชั่นอื่นๆที่อยู่ในไฟล์เดียวกัน การใช้ global variable นี้ไม่แนะน าในการ
เขียนโปรแกรมในรายวิชานี้
ให้นักศกษาพึงระวังในการตั้งชื่อตัวแปรที่อาจจะซ้ ากัน แต่อยู่ในสโคปที่แตกต่างกัน เช่นมีตัวแปรชื่อ x


อยู่ในฟังก์ชั่นสองฟังก์ชั่น จะถอว่าเป็นคนละ x กัน


6.7 กำรเรียกตัวเอง (Recursion)


Recursion (อ่านว่ารีเคอร์ชั่น) เป็นการเรียกตัวเองของฟังกชั่น ซึ่งเป็นประโยชน์อย่างมากส าหรับการ

เขียนโปรแกรมในการแก้ปัญหาที่มีการเรียกย้อนกลับ เช่นการหาค่า factorial, Fibonacci และการค้นหรือ

เรียงข้อมูล ตัวอย่างของการใช้งาน recursion แสดงใน Listing 6.6 เป็นการก าหนดฟังก์ชั่น factorial การหา
ค่าของ factorial มีหลักการดังนี้


0! = 1


n! = n*(n-1)! เมื่อ n > 0


สามารถน ามาเขียนโค้ดได้ดังนี้
if (n == 0):
return 1
else:
return n*factorial(n-1)


131 | Page













Araya's Creation

Listing 6.6 ComputeFactorial\main.py


'''
Created on 4Aug.,2016

@author: Araya
'''

if __name__ == '__main__':
pass
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
n = int(input("Enter a non negative integer: "))
print("Factorial(%d) is %d." % (n, factorial(n)))

ในบทนี้ ผู้เขียนได้ครอบคลุมการเขียนโปรแกรมแบบโมดูล คือการแยกปัญหาให้เป็นระดับย่อย แล้ว


แยกส่วนย่อยนั้นมาเขียนเป็นองค์ประกอบที่เรียกว่าฟังก์ชั่น ปกติแล้วจะท าการเขียนฟังก์ชั่นย่อยแล้วมีฟงก์ชั่น

หลักที่ชื่อในการเรียกใช้งานฟงก์ชั่นย่อยเหล่านั้นในฟังก์ชั่นหลัก ซึ่งการเขียนโปรแกรมแบบนี้จะท าให้การหา

ข้อผิดพลาด และทาความเข้าใจกับโค้ดได้ง่ายขึ้น ในบางครั้งสามารถลดจ านวนบรรทัดของโค้ดได้ด้วย




































132 | Page








Araya's Creation

1309 200 Computer Programming Laboratory

ปฏิบัติกำรที่ 6: User defined Functions




วัตถุประสงค์


ื่
1. สามารถเขียนฟังก์ชั่นแบบผู้ใช้ก าหนดเองเพอแบ่งการท างานเป็นโมดูลย่อยได้
2. สามารถเรียกใช้งานฟังก์ชั่นแบบที่ผู้ใช้ก าหนดเองได้


ทฤษฎีที่เกี่ยวข้อง


ฟังก์ชั่น(Function)

กลุ่มค าสั่งที่เขียนขึ้นเพอให้โปรแกรมท างานในจุดประสงค์เฉพาะอย่างใดอย่างหนึ่งประโยชน์ของ
ื่
ฟังก์ชั่นคือ จะช่วยลดการเขียนค าสั่งที่ซ้ ากันท าให้โปรแกรมกะทัดรัดขึ้นซึ่งจะช่วยให้อ่านโปรแกรมได้สะดวก
แก้ไขโปรแกรมได้ง่ายสามารถน ามาใช้ต่อไปในภายหลังได้ นอกจากนี้ยังสามารถแบ่งการเขียนโปรแกรม

ออกเป็นส่วนๆ ช่วยให้สร้างและพัฒนาโปรแกรมได้เร็วยิ่งขึ้น



ประเภทของฟงก์ชั่น สามารถแบ่งออกเป็นสองอย่าง คือ ฟังก์ชั่นมาตรฐานของภาษา และฟังก์ชั่นที่ผู้ใช้ก าหนด
เอง หรือสร้างขึ้นเอง


ฟังก์ชั่นมำตรฐำนของภำษำ (Standard or Build-in Function)

ฟังก์ชั่นที่สามารถเรียกใช้งานโดยไม่ต้องเขียนตัวฟังก์ชั่นขึ้นเอง เช่นฟังก์ชั่น ceil()

floor() abs() และอกหลายฟังก์ชั่นที่ได้เรียกใช้ไปในการค านวณทางคณิตศาสตร์ โดยการใช้งาน

ฟังก์ชั่นเหล่านี้ต้องทราบว่าฟังก์ชั่นดังกล่าวถูกก าหนดไว้ในไลบรารี่ใด จึงก าหนด import นั้นในส่วนหัว

โปรแกรม


ฟังก์ชั่นที่ผู้ใช้สร้ำงขึ้นเอง (User Define Function)


ฟังก์ชั่นที่ผู้ใช้เขียนขึ้นมาเองโดยอาจแยกส่วนออกจากโปรแกรมหลังเพื่ออ่านโปรแกรมได้ง่าย และลด

ความซ้ าซ้อนของบรรทัดค าสั่ง หรือเขียนขึ้นเพื่อเป็นค าสั่งใหม่เนื่องจากในฟังก์ชั่นมาตรฐานของภาษา ไมได้

ก าหนดไว้ ในปฏิบัติการนี้เน้นในส่วนของฟังก์ชั่นแบบที่สอง คือฟงก์ชั่นที่ผู้ใช้เขียนขึ้นเอง

ปฏิบัติกำรที่ 1 การเขียนโปรแกรมแบบโมดูล


133 | Page













Araya's Creation

Listing 6.7 เป็นการพิมพ์จ านวนเฉพาะตั้งแต่ 2 ถึง n โดยรับค่า n เข้ามาจากผู้ใช้ แล้วท าการวนลูป

เพื่อทดสอบว่าแต่ละค่าเป็นจ านวนเฉพาะหรือไม่ ถ้าใช่ก็ให้พิมพ์ออกทางหน้าจอ โดยก าหนดให้พิมพ์ 10 ค่าต่อ
หนึ่งบรรทัด


Listing 6.7 PrimeNumber\main.py


'''
Created on 4Aug.,2016

@author: Araya
'''
if __name__ == '__main__':
pass
n = int(input("Find all prime numbers <= n, enter n: "))
num = 2
NUM_PER_LINE = 10
count = 0
while (num <=n):
isPrime = True
for divisor in range(2,int(num**0.5)+1):
if not num % divisor :
isPrime = False
break
if(isPrime):
count += 1
if(count%NUM_PER_LINE == 0):
print("%d\n" % num)
else:
print("%d\t" % num)
num += 1
print("\n%d number of primes <= %d.\n" % (count, n))

★ค ำสั่ง จงท าการปรับปรุง Listing 6.7 ให้เป็นการเขียนโปรแกรมแบบโมดูล โดยก าหนดให้มีฟังก์ชั่นดังนี้


bool isPrime(int number)

เป็นฟังก์ชั่นที่ใช้ทดสอบว่าจ านวนเต็ม number เป็นจ านวนเฉพาะหรือไม่ ส่งค่ากลับเป็น True หาก

number เป็นจ านวนเฉพาะ ส่งค่ากลับเป็น False หาก number ไม่ใช่จ านวนเฉพาะ


ปฏิบัติกำรที่ 2 Recursion





134 | Page








Araya's Creation

จาก Listing 6.9 เป็นโปรแกรมในการค านวณหาค่า factorial ของจ านวนใดๆ เลข Fibonacci เป็น

ลักษณะของการเรียกตัวเองเช่นเดียวกับ factorial โดยมีนิยามดังนี้


fib(0) = 0

fib(1) = 1


fib(n) = fib(n-2) + fib(n-1) เมื่อ n >= 2


เขียนเป็นโค้ดได้ดังนี้

if (n == 0):
return 0
elif (n ==1):
return 1
else:
return fib(n-1) + fib(n-2)

★ค ำสั่ง จงท าการเขียนโปรแกรมส าหรับแสดงค่า Fibonacci ของ n เมื่อ n เป็นจ านวนเต็มใดๆที่รับเข้ามา
จากผู้ใช้


แบบฝึกหัด



★ค ำสั่ง ให้นักศกษาน ารหัสนักศึกษาของตนเอง modulus ด้วย 4 หากได้เศษ 0 ให้ท าข้อ 4 เศษ 1 ท าขอ 1
เศษ 2 ท าข้อ 2 และเศษ 3 ท าข้อ 3 โดยท าการเขียนโค้ดในโปรเจ็คใหม่ เพื่อหาผลลัพท์ของการท า modulo
รหัสนักศึกษาของตนเองกอนท าการเขียนโค้ด ตามโจทย์ของข้อที่ได้ต่อไปนี้


1. (Data Processing) a. The time in hours, minutes, and seconds is to be passed to a
function named totsec(). Write totsec() to accept these values, determine the total number

of seconds in the passed data, and display the calculated value.

b. Include the totsec() function written for Exercise 5a in a working program. The
main() function should correctly call totsec() and display the value the function

returns. Use the following test data to verify your program’s operation: hours = 10,
minutes = 36, and seconds = 54. Make sure to do a hand calculation to verify the result
your program displays.


2. (Conversion) a. Write and test a C function named MakeMilesKmTable() to

135 | Page













Araya's Creation

display a table of miles converted to kilometers. The arguments to the function should
be the starting and stopping values of miles and the increment. The output should be

a table of miles and their equivalent kilometer values. Use the relationship that 1 mile
= 1.61 kilometers.

b. Modify the function written for Exercise 9a so that two columns are printed. For

example, if the starting value is 1 mile, the ending value is 20 miles, and the
increment is 1, the display should look like the following:
Miles = Kilometers Miles = Kilometers
1 1.61 11 17.70

2 3.22 12 19.31
. . . .
. . . .
10 16.09 20 32.18

(Hint: Find split = (start + stop)/2. Let a loop execute from miles = start to split, and
calculate and print across one line the values of miles and kilometers for both miles and
(miles - start + split + 1).)


3. (Data Processing) a. Write a function named daycount() that accepts a month, day,
and year as its input arguments calculates an integer representing the total number of days

from the turn of the century to the date that’s passed and returns the calculated integer to
the calling function. For this problem, assume each year has 365 days and each month has
30 days. Test your function by verifying that the date 1/1/00 returns a day count of 1.
b. Include the daycount() function written for Exercise 6a in a working program. The main()

function should correctly call daycount() and display the integer returned by the function.

4. (Numerical) A value that’s sometimes useful is the greatest common divisor of two
integers, n1 and n2. Euclid discovered an efficient method to do this more than 2000 years

ago. For this exercise, however, a stub is enough. Write the integer function stub gcd(n1,
n2). Simply have it return a value that suggests it received its arguments correctly. (Hint: N1
+ N2 is a good choice of return values. Why isn’t N1 / N2 a good choice?)














136 | Page








Araya's Creation

บทที่ 7



ลิสต์ (Lists) และอาร์เรย์ (Arrays)



การเขียนโปรแกรมคอมพิวเตอร์เพื่อแก้ปัญหาการค านวนเชิงวิศวกรรมบางครั้งมีความจ าเป็นที่จะต้อง
เก็บขอมูลไว้ในหน่วยความจ าส่วนหนึ่งชั่วคราวเพื่อประมวลผล ก่อนที่จะแสดงออกไปที่หน้าจอหรือแม้แต่เขียน

ลงไฟล์ ข้อมูลดังกล่าวอาจจะไม่ใช่แค่จ านวนเต็มแค่ สองสามจ านวน หากแต่บางครั้งอาจจะเป็นจ านวนเต็ม

100 จ านวน หรือเป็นคะแนนเก็บของนักศึกษาทั้งหมด 200 คน การเก็บข้อมูลในลักษณะดังกล่าว มีความ
จ าเป็นในการใช้ตัวแปรชนิดพิเศษที่มีดัชนีชี้ไปที่แต่ละค่าได้ ในไพธอนมีโครงสร้างส าหรับกลุ่มของข้อมูลให้ใช้
นั่นคือ ลิสต์ ซึ่งเทียบได้กับอาร์เรย์ในภาษาโปรแกรมอื่นๆ แต่มีความพิเศษบางอย่างที่แตกต่างไป


ข้อมูลที่สามารถใช้งานลิสต์อาจมีลักษณะดังนี้

1. ไม่จ าเป็นชนิดข้อมูลเดียวกันทั้งหมด แต่เป็นกลุ่มของข้อมูลที่เกี่ยวข้องกัน

2. อาจเป็นข้อมูลลักษณะเดียวกัน เช่นเป็นกลุ่ม คะแนนเก็บของนักศึกษาวิชาคอมโปร

3. เป็นข้อมูลที่มีลักษณะเป็นล าดับ หรือเป็นรายการต่อเนื่องกน เช่น ข้อมูลจากเซนเซอร์ 3 ตัว
ความแตกต่างของตัวแปรปกติทั่วไปกับตัวแปรที่เป็นลิสต์ แสดงในรูปที่ 7.1 ซึ่งจะเห็นได้ว่าวัตถุชนิด

จ านวนเต็ม ถูกเรียกว่า var1 ในขณะที่ var2 นั้นเป็นชื่อของกลุ่มของวัตถุ ซึ่งได้แก่ 20, 21, 29 และ 4.0 ซึ่ง
ปะปนกันทั้งจ านวนเต็มและทศนิยม การจะอ้างถึงวัตถุ 4.0 จะต้องบอกต าแหน่ง หรือ index ของลิสต์ เช่น
var2[3] จงพึงระลึกว่า index ของลิสต์ เริ่มที่ 0 เสมอ


Listing 7.1 แสดงตัวอย่างใช้งานอาร์เรย์ โปรแกรมนี้ท าการรับข้อมูลเข้ามาจากผู้ใช้ เป็นเลขจ านวน
เต็มทั้งหมด 10 ค่า โปรแกรมท าการหาค่าเฉลี่ยของข้อมูลทั้งหมด แล้วท าการตรวจสอบแต่ละค่าว่ามีทั้งหมดกี่
ค่าที่มีค่ามากกว่าค่าเฉลี่ย เสร็จสิ้นแล้วแสดงผลออกหน้าจอ


Listing 7.1 AnalyzeNumbers\main.py

'''
Created on 6Aug.,2016
@author: Araya
'''
import numpy
if __name__ == '__main__':
pass
data = []
summ = 0
for i in range(10):
data.append(int(input("Enter a number: ")))
summ += data[i]
print(data)
print("sum of data is %d" % summ)
print(numpy.average(data))
above = 0
belowOrEq = 0
137 | P a g e





Araya's Creation

for i in data:
if (i > myavg):
above += 1
else:
belowOrEq += 1
print("There are %d numbers above the average." % above)
print("There are %d numbers below or equal the average." %
belowOrEq)


7.1 เบื้องต้นเกี่ยวกับลิสต์ (List Basics)



ลิสต์สามารถใช้งานในลักษณะของอาร์เรย์ได้ เพื่อใช้ส าหรับเก็บขอมูลที่เป็นชนิดเดียวกัน แต่ละ
สมาชิก (element) ในลิสต์สามารถถูกเรียกใช้งานได้โดยดัชนี (index) และแต่ละสมาชิกของลิสต์สามารถถูก
ใช้งานได้เสมือนตัวแปรตัวหนึ่ง


การประกาศลิสต์ (Declaring Lists)

การประกาศลิสต์มีรูปแบบทั่วไปดังนี้

list_name = [ ]




เมื่อ list_name คือชื่อของลิสต์ที่ถกต้องตามหลักการตั้งชื่อ ลิสต์ไม่มขนาด ไม่จ าเป็นต้องก าหนด

ขนาด และสามารถเพิ่มขอมูลเข้าไปในลิสต์ได้เมื่อต้องการ ลบข้อมูลออกจากลิสต์ได้ ถามขนาดของลิสต์ได้
ตัวอย่างการประกาศลิสต์ชื่อ myList
myList = [ ]


หลังจากค าสั่งนี้แล้วก็สามารถที่จะเพิ่มขอมูลเข้าไปในลิสต์ด้วยค าสั่ง append ได้ เช่น

myList.append(some_object)

จากการประกาศลิสต์ข้างต้น สามารถท าการก าหนดค่าต่างๆให้กับสมาชิกของลิสต์ได้ดังนี้

myList[0] = 5.6


myList[1] = 4.5
myList[2] = 3.3


...
myList[9] = 111.23

ดังแสดงในรูปที่ 7.1 ซึ่งลิสต์ myList มีดัชนีตั้งแต่ 0 – 9 หากต้องการกล่าวถึงสมาชิกตัวที่ 5 ก็

จะต้องเรียกหา myList[5] โดยค่าที่เก็บอยู่คือ 34.33








138 | P a g e





Araya's Creation

รูปที่ 7.1 แสดงอาร์เรย์ myList ขนาด 10 อิลิเมนต์ โดยค่าดัชนีคือ 0 – 9


หรืออาจก าหนดลิสต์ในหนึ่งชุดค าสั่งดังนี้

myList = [5.6, 4.5, 3.3, 13.2, 4.0, 34.33, 34.0, 45.45,
99.993, 111.23]

ี่
ปกติแล้วการเขียนโปรแกรมทเกี่ยวข้องกับลิสต์จะใช้ for loops เข้ามาช่วยในการท่องไปในลิสต์
เพื่อเข้าถึงสมาชิกแต่ละตัว การวนลูปเพื่อท่องไปในลิสต์นี้ จะต้องพึงระลึกไว้เสมอว่าค่าดัชนีนั้นเป็นตั้งแต่ 0 ถึง

len(list_name) การอ้างถงวัตถุใดๆในลิสต์จะต้องอ้างด้วยชื่อของลิสต์และต าแหน่งของสมาชิกว่า
หมายถึงสมาชิกตัวไหนในลิสต์

การก าหนดค่าเริ่มต้นให้กับลิสต์สามารถท าได้หลายรูปแบบดังนี้


1. ใช้ลูปในการท่องไปในแต่ละอลิเมนต์เพื่อก าหนดค่าให้สมาชิกแต่ละตัว เช่น
for i in range(SIZE):
myList[i] = 1 #ทุกอิลิเมนต์มีค่า 1
2. สั่ง
myList = [1]*n #ทุกอิลิเมนต์มีค่า 1 ได้ลิสต์ขนาด n อิลิเมนต์
3. ก าหนดค่าเริ่มต้นด้วยปีกกา เช่น

myList = [1.2, 2.3, 3.5, 2.2]
พึงระวังว่า ชื่อในไพธอนเป็นเสมือน tag สามารถน าไปใช้แปะวัตถุใดๆก็ได้ หากน าชื่อมาใช้เรียก

ลิสต์แล้ว ชื่อจะหมายถึงทั้งลิสต์
ิ่
4. สามารถเพมวัตถุเข้าไปในลิสต์ได้ด้วย list_name.append(object)
5. สามารถหาขนาดของลิสต์ได้ด้วย len(list_name) ขนาดของลิสต์ไม่จ ากัด ความ
ี่
รับผิดชอบอยู่ทคนเขียนโปรแกรมเอง
6. การเปลี่ยนแปลงค่าอิลิเมนต์ในลิสต์ที่เกี่ยวข้องกับเครื่องหมาย = ต้องก าหนด index ให้กับลิสต์
เพื่อเฉพาะเจาะจงอิลิเมนต์ การใช้ for i in list_name ใช้ได้ส าหรับการอ่านลิสต์
เท่านั้น
7. sublist หรือ slicing คือการอ้างถงบางส่วนของลิสต์ เช่น myList[2:4] คือส่วนหนึ่งของ

myList เลือกเอาเฉพาะอิลิเมนต์ที่ 2 ถึง 4 รูปแบบคือ list_name[start:end]


139 | P a g e





Araya's Creation

7.2 การจัดการกับลิสต์ (Processing Lists)

เนื่องจากสมาชิกแต่ละตัวของลิสต์เป็นลักษณะของล าดับ (sequence) และสามารถหาขนาดของ


ลิสต์ได้ด้วย len(list_name) ดังนั้น โดยธรรมชาติ การจัดการกับลิสต์ก็มกจะใช้ for loops อย่างไร
ก็ตาม ชุดค าสั่งต่างๆที่เกี่ยวข้องกับลิสต์แสดงในตารางที่ 7.1


ตารางที่ 7.1 รวบรวมชุดค าสั่งและความหมายที่เกี่ยวกับลิสต์
ชุดค าสั่ง ความหมาย
a = [] initialize an empty list
a = [1, 4.4, ’run.py’] initialize a list
a.append(elem) add elem object to the end
a + [1,3] add two lists
a.insert(i, e) insert element e before index i
a[3] index a list element
a[-1] get last list element
a[1:3] slice: copy data to sublist (here: index 1, 2)
del a[3] delete an element (index 3)
a.remove(e) remove an element with value e
a.index(’run.py’) find index corresponding to an element’s value
’run.py’ in a test if a value is contained in the list
a.count(v) count how many elements that have the value v
len(a) number of elements in list a
min(a) the smallest element in a
max(a) the largest element in a
sum(a) add all elements in a
sorted(a) return sorted version of list a
reversed(a) return reversed sorted version of list a
b[3][0][2] nested list indexing
isinstance(a, list) is True if a is a list
type(a) is list is True if a is a list


ตัวอย่างการจัดการกับลิสต์ต่อไปนี้ ใช้กับการก าหนดให้มีการประกาศลิสต์ดังนี้
myList =[] #create an empty list
for i in range(10):
สร้างลิสต์ว่าง แล้ววนลูปเพื่อสร้างสมาชิกสิบตัว ภายในลูปสามารถ
1. รับค่าจากผู้ใช้เข้ามาเกบไว้ในสมาชิกแต่ละตัว

myList.append(int(input("Enter an integer number:
")))
2. ก าหนดค่าเริ่มต้นให้กับลิสต์ด้วยการสุ่มค่า เช่น สุ่มค่า ระหว่าง 0 – 99 มาเก็บในลิสต์
myList.append(random.randint(0,99))
3. แสดงสิ่งที่เก็บอยู่ในลิสต์
print(myList)
4. การท าส าเนาลิสต์ สร้างลิสต์ว่างอีกหนึ่งอันชื่อ list2 แล้วท าส าเนาค่าที่อยู่ใน myList
ไปที่ list2

ไม่สามารถสั่งในลักษณะนี้ได้ list2 = myList เนื่องจากชื่อของลิสต์เป็นการอ้างถึง
วัตถุ ดังนั้นการท าส าเนาลิสต์ต้องใช้เมธอดส าเนา ดังนี้

140 | P a g e





Araya's Creation




list2 = [] #สรางลิสต์ว่าง สังเกตว่าไม่ตอง for loop ดวย range อีก
list2 = myList.copy()
5. การหาค่าผลรวมของสิ่งที่อยู่ในลิสต์ ท าได้ดังนี้
myList = []
summ = 0
for i in range(10):
myList.append(random.randint(0,99))
summ += myList[i]
ี่
6. การหาค่าทมากที่สุดในลิสต์
max(myList)
7. หาต าแหน่งของค่าที่มากที่สุดในลิสต์
myList.index(max(myList))
8. การสลับค่าสมาชิกแบบสุ่ม หรือที่เรียกว่า shuffling เหมือนกันสับไพ่ ให้ import
random เพื่อเรียกใช้งานการ shuffle แล้วสั่ง
random.shuffle(myList)
9. การขยับสมาชิกที่เรียกว่า shifting สามารถท าได้โดยขยับไปซ้ายหรือขวาได้ดังนี้
ท าลิสต์ให้เป็น deque ด้วยการสั่ง from random import deque
เมื่อได้ลิสต์ที่เป็น deque แล้วสามารถสั่ง rotate ซ้ายขวาทีละ n ต าแหน่งได้ เช่น
print(myList2)
myList2.rotate(1)
print(myList2)
myList2.rotate(-2)
print(myList2)

***อย่าลืมว่า index เริ่มที่ 0 เสมอ ***


7.3 การส่งลิสต์เข้าไปในฟังก์ชั่น


การส่งลิสต์เข้าไปในฟงก์ชั่น เกี่ยวข้องกับการเรียกใช้ฟงก์ชั่นในลักษณะของ call by value และ


call by reference ซึ่งได้อธิบายไว้ในส่วนของฟังก์ชั่นแล้ว ในไพธอนจะจัดการกับการเรียกแบบ call by
reference แต่เมื่อใดก็ตามที่มีการใช้การก าหนดค่าให้แก่ชื่อที่ส่งเข้าไปในฟังก์ชั่น ไพธอนจะจัดการกับชื่อนั้น

แบบ call by value ทันที Listing 7.2 แสดงความแตกต่างของการส่งลิสต์เข้าไปในฟังกชั่น สังเกตความ
เปลี่ยนแปลงหลังจากการเรียกใช้งานฟงก์ชั่น ผลตอบสนองเป็นดังรูปที่ 7.2

Listing 7.2 EffectOfPassingArray\main.py
1:def func1(list):
2: print(list)
3: list = [25, 12]
4: print(list)
5:def func2(list):
6: print(list)
7: list += [25, 12]
8: print(list)
9:def func3(list):
10: list2 = []
11: list.reverse()
12: list2 = list.copy()
141 | P a g e





Araya's Creation

13: return list2
14:#main starts here
15:fib = [1,2,3,4,5]
16:func1(fib)
17:print(fib)
18:func2(fib)
19:list3 = []
20:list3 = func3(fib[:])
21:print(list3)
22:print(fib)



























รูปที่ 7.2 แสดงผลตอบสนองของโปรแกรมใน Listing 7.2
ฟังก์ชั่นแรก func1 (list) รับพารามิเตอร์หนึ่งตัวชื่อ list ในการท างานของฟังก์ชั่นจะท าการพมพ์สิ่งที่

อยู่ใน list ออกมา หลังจากนั้นจะท าการก าหนดค่าให้ list มีสมาชิกสองตัวคือ 25 และ 12 แล้วท าการพิมพ์สิ่ง
ที่อยู่ใน list ออกมาอีกครั้ง


def func1(list):
print(list)
list = [25, 12]
print(list)
จากผลตอบสนองในรูปที่ 7.2 จะเห็นได้ว่าหลังจากที่มีการก าหนด

fib = [1,2,3,4,5]
func1(fib)
เมื่อเรียกใช้ func1(fib) เป็นการส่ง fib เข้าไปในฟังก์ชั่นแบบ pass by reference เมื่อท าการ
print(list) ในฟังก์ชั่น ก็จะเสมือนสั่ง print(fib) นั่นเอง ท าให้ได้ผลตอบสนองคือ [1, 2, 3, 4, 5] ดังบรรทัด
แรกในรูปที่ 7.2 แต่เมื่อท าการก าหนดค่า list = [25, 12] ในส่วนของฟังก์ชั่น ไพธอนจะท าการ pass by
value ให้กับ list ทันที เนื่องจากมีการก าหนดค่า บรรทัดที่ 3 ของ Listing 7.2 จึงเสมือนก าหนดค่าให้ list


ไม่ใช่การก าหนดค่าให้กับ fib ที่ส่งเข้าไปในฟังก์ชั่นแต่อย่างใด เมื่อท าการ print(list) จึงเป็นการพมพ์สิ่งที่อยู่
ใน list ไม่ใช่สิ่งที่อยู่ใน fib ท าให้ได้ผลตอบสนองคือ [25, 12] ตามรูปที่ 7.2



142 | P a g e





Araya's Creation


Click to View FlipBook Version