Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore เชี่ยวชาญการเขียนโปรแกรมด้วยไพธอน = Programming Expert with Python

เชี่ยวชาญการเขียนโปรแกรมด้วยไพธอน = Programming Expert with Python

Description: เชี่ยวชาญการเขียนโปรแกรมด้วยไพธอน = Programming Expert with Python.

Search

Read the Text Version

จากตวั อยา่ ง โปรแกรมขา้ งตน้ จะเกดิ ขอ้ ผดิ พลาดขน้ึ เน่อื งจาก tuples จะไมอ่ นุญาตให้ เปลย่ี นแปลง หรอื แกไ้ ขขอ้ มลู ใดๆ หลงั จากทม่ี ปี ระกาศตวั แปรแลว้ สาหรบั การลบตวั แปรแบบทพั เพลิ สามารถกระทาไดโ้ ดยใชค้ าสงั่ del และตามดว้ ยช่อื ตวั แปร tup = ('physics', 'chemistry', 1997, 2000); print (tup); del tup; print (\"After deleting tup : \",tup) ('physics', 'chemistry', 1997, 2000) Traceback (most recent call last): OUTPUT File \"C:/Python33/testx.py\", line 4, in <module> print (\"After deleting tup : \",tup) NameError: name 'tup' is not defined เมอ่ื สงั่ รนั โปรแกรม ในบรรทดั ท่ี 2 สามารถพมิ พข์ อ้ มลู ของ tup ได้ แต่เมอ่ื ใชค้ าสงั่ ลบตวั แปร ดว้ ย del แลว้ ทาการสงั่ พมิ พต์ วั แปรดงั กลา่ วอกี ครงั้ จะเกดิ ขอ้ ผดิ พลาดขน้ึ เพราะตวั แปรดงั กลา่ วถกู ลบ ออกจากหน่วยความจาของเครอ่ื งไปแลว้ นนั่ เอง ตวั ดาเนินการพื้นฐานท่ีใช้กบั ทพั เพิล (Basic tuples operations) สาหรบั ตวั แปรแบบทพั เพลิ จะสามารถใชส้ ญั ลกั ษณ์ * และ + เช่นเดยี วกบั ลสิ ต์ โดย (+) ใช้ สาหรบั เชอ่ื มสมาชกิ ระหวา่ งทพั เพลิ เขา้ ดว้ ยกนั และใช้ (*) สาหรบั ทาซ้าขอ้ มลู สมาชกิ สาหรบั ตวั อยา่ ง ของการใชง้ านตวั ดาเนินการพน้ื ฐานมดี งั ต่อไปน้ี สมมตุ ใิ ห้ tup1 = (1, 2, 3) และ tup2 = (4, 5, 6) len(tup1) = 3 # จานวนของสมาชกิ หรอื ความยาวของ tup1 เทา่ กบั 3 tup1 + tup2 = (1, 2, 3, 4, 5, 6) # tuple concatenation tup1 * 3 = (1, 2, 3, 1, 2, 3, 1, 2, 3) 3 in tup1 # 3 อยใู่ น tup1 หรอื ไม่ คาตอบคอื จรงิ (True) for x in tup1: print (x) # พมิ พข์ อ้ มลู สมาชกิ ใน tup1 โดยใช้ for คาตอบคอื 1, 2, 3 ตวั อยา่ งการโปรแกรมใชง้ านตวั แปรทพั เพลิ ดงั น้ี tup1 = (1, 2, 3); tup2 = (4, 5, 6) print(\"length of tup1 :\",len(tup1)) print(\"tup1 + tup2 :\",tup1 + tup2) print(\"tup1 * 3 :\",tup1*3) print(\"Elements in tup1 are :\") for x in tup1: print (x) ห น้ า 82

length of tup1 : 3 tup1 + tup2 : (1, 2, 3, 4, 5, 6) OUTPUT tup1 * 3 : (1, 2, 3, 1, 2, 3, 1, 2, 3) Elements in tup1 are : 1 2 3 การเขา้ ถงึ ขอ้ มลู ในตวั แปรชนดิ ทพั เพลิ เหมอื นกบั ตวั แปรชนดิ ลสิ ต์ ดงั ตวั อยา่ งต่อไปน้ี tup1 = ('physics', 'chemistry', 1997, 2000); tup2 = (1, 2, 3, 4, 5, 6, 7); print (\"tup1[0]:\", tup1[0]) print (\"tup1[-1]:\", tup1[-1]) print (\"tup2[3]:\", tup2[3]) print (\"tup2[-4]:\", tup2[-4]) print (\"tup2[1:5]:\", tup2[1:5]) print (\"tup2[::2]:\", tup2[::2]) tup1[0]: physics tup1[-1]: 2000 OUTPUT tup2[3]: 4 tup2[-4]: 4 tup2[1:5]: (2, 3, 4, 5) tup2[::2]: (1, 3, 5, 7) การเปรยี บเทยี บขอ้ มลู ในตวั แปรทพั เพลิ สามารถทาไดเ้ หมอื นสตรงิ โดยใชต้ วั ดาเนินการคอื <, <=, >, >=, ==, !=, in และ not in ดงั ต่อไปน้ี tup1 = (1,2,3,4,5) tup2 = (9,8,7,6,5) tup3 = (9,8,7,6,5) tup4 = (8,7) print(\"Tup1 < Tup2 :\",tup1 < tup2) print(\"Tup1 > Tup2 :\",tup1 > tup2) print(\"Tup2 >= Tup1 :\",tup2 >= tup1) print(\"Tup2 == Tup3 :\",tup2 == tup3) print(\"8 in Tup3 :\",8 in tup2) print(\"Tup4 not in Tup2 :\",tup4 not in tup2) Tup1 < Tup2 : True Tup1 > Tup2 : False OUTPUT Tup2 >= Tup1 : True Tup2 == Tup3 : True 8 in Tup3 : True Tup4 not in Tup2 : True การเปรยี บเทยี บในทพั เพลิ จะเป็นการเปรยี บเทยี บในลกั ษณะค่าต่อค่า หรอื สมาชกิ ต่อสมาชกิ ที ละตวั ไปเรอ่ื ยๆ ในกรณแี รก Tup1 < Tup2 โปรแกรมจะเรม่ิ ตรวจสอบค่ขู อง Tup1 และ Tup2 คแู่ รกก่อน ในทน่ี ้คี อื 1 (Tup1[0]) กบั 9 (Tup2[0]) ผลทไ่ี ดค้ อื 1 < 9 จรงิ ดงั นนั้ ผลลพั ธท์ ไ่ี ดจ้ ะเป็นจรงิ (True) สาหรบั ตวั ดาเนินการแบบ in และ not in จะเป็นการตรวจสอบสมาชกิ ทอ่ี ย่ภู ายในทพั เพลิ วา่ มอี ยหู่ รอื ไม่ จากตวั อยา่ ง 8 อยใู่ น Tup3 ดงั นนั้ ผลลพั ธท์ ไ่ี ดค้ อื เป็นจรงิ ห น้ า 83

ดิกชนั นารี (Dictionary) ดกิ ชนั นารเี ป็นตวั แปรชนดิ เปลย่ี นแปลงขอ้ มลู ไดต้ ลอดเวลา (Mutable) คลา้ ยกบั ลสิ ต์ และมี ลกั ษณะการเกบ็ ขอ้ มลู ทเ่ี หมอื นกบั ลสิ ตแ์ ละทเู พลิ คอื สามารถเกบ็ ขอ้ มลู ไดห้ ลายคา่ และต่างชนิดกนั ได้ พรอ้ มๆ กนั คณุ สมบตั พิ เิ ศษทแ่ี ตกต่างของดกิ ชนั นารคี อื จะเกบ็ ขอ้ มลู เป็นคู่ คอื คยี ์ (Key) ซง่ึ จะตอ้ งไม่ ซ้ากนั กบั ขอ้ มลู (Value) ซง่ึ ขอ้ มลู ทงั้ สองตอ้ งมคี วามสมั พนั ธก์ นั โดยทค่ี ยี เ์ ปรยี บเหมอื นตวั ช้ี (Identification) เพอ่ื อา้ งองิ ไปยงั ขอ้ มลู จรงิ ทต่ี อ้ งการใชง้ าน การประกาศตวั แปรดกิ ชนั นารจี ะใช้ สญั ลกั ษณ์ {…} ในการประกาศตวั แปร สาหรบั การเกบ็ ขอ้ มลู ค่ขู องสมาชกิ จะใชส้ ญั ลกั ษณ์ : เช่อื ม ระหวา่ งคยี แ์ ละขอ้ มลู และใชส้ ญั ลกั ษณ์ , ในการแยกแยะระหวา่ งสมาชกิ ในดกิ ชนั นารี สาหรบั การเขา้ ถงึ ขอ้ มลู ของดกิ ชนั นารจี ะใชส้ ญั ลกั ษณ์ […] เหมอื นกบั ลสิ ต์ และทพั เพลิ ดงั ตวั อยา่ งต่อไปน้ี dict1 = {} #empty dictionary dict2 = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} dict3 = { 'abc': 456 }; dict4 = { 'abc': 123, 98.6: 37 }; print(dict1) print(dict2) print(dict3) print(dict4) OUTPUT {} {'Alice': '2341', 'Cecil': '3258', 'Beth': '9102'} {'abc': 456} {98.6: 37, 'abc': 123} Note: ควรจาไวว้ ่า คยี ์ (Key) จะตอ้ งมคี ่าทไ่ี มซ่ ้ากนั (Unique) และเป็นชนิดอะไรกไ็ ด้ แต่มขี อ้ แมว้ า่ ตอ้ งเป็นขอ้ มลู ประเภททไ่ี มเ่ ปลย่ี นแปลง (Immutable) เช่น สตรงิ เลขจานวน หรอื ทพั เพลิ จากการประกาศตวั แปรดกิ ชนั นารขี า้ งตน้ ตวั แปร dict1 ประกาศใหม้ สี มาชกิ ว่าง เมอ่ื แสดงผลจะ ปรากฎสญั ลกั ษณ์ { } แสดงถงึ ไมม่ สี มาชกิ ใดๆ เกบ็ อยใู่ นตวั แปรดงั กล่าว ในตวั แปร dict2 ไดป้ ระกาศ ชนดิ ของตวั แปรทเ่ี กบ็ หลายประเภทในตวั แปรดกิ ชนั นารตี วั เดยี วกนั โดยสมาชกิ ตวั แรกจะมคี ยี ค์ อื Alice เพอ่ื ชไ้ี ปยงั ขอ้ มลู จรงิ คอื 2341 คนั่ ดว้ ยเครอ่ื งหมาย : และ Cecil เป็นคยี ช์ ไ้ี ปยงั ขอ้ มลู 3258 เป็นตน้ สาหรบั dict3, dict4 นนั้ เป็นการประกาศตวั แปรโดยใช้ ; ปิดทา้ ยคาสงั่ (เหมอื นในภาษาซ)ี การเขา้ ถงึ ขอ้ มลู ในดกิ ชนั นารสี ามารถเขา้ ถงึ ไดโ้ ดยใชเ้ ครอ่ื งหมาย […] รว่ มกบั ช่อื คยี ์ เหมอื นกบั ตวั แปรลสิ ต์ และทพั เพลิ เชน่ Name Age Class dict: Zara 7 First ห น้ า 84

dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; print (\"dict['Name']: \", dict['Name']); print (\"dict['Age']: \", dict['Age']); dict['Name']: Zara dict['Age']: 7 OUTPUT จากตวั อยา่ งดา้ นบน เมอ่ื การตอ้ งการเขา้ ถงึ ขอ้ มลู ชอ่ื Zara ใหอ้ า้ งองิ ไปทต่ี วั แปรช่อื dict โดยใช้ คยี ค์ อื Name รว่ มกบั เครอ่ื งหมาย [..] ดงั น้ี dict[‘name’] เมอ่ื ผเู้ ขยี นโปรแกรมพยายามทจ่ี ะอา้ งองิ ไปยงั ขอ้ มลู ทไ่ี ม่มคี ยี ป์ รากฎอยใู่ นตวั แปรดกิ ชนั นารี จะทาใหเ้ กดิ ขอ้ ผดิ พลาดขน้ึ Tips: คยี ์ (key) สามารถใชค้ ่าวา่ งได้ เช่น dict1 = {'':111, \" \":222} แต่ไมแ่ นะนาให้ กระทา เพราะคยี ค์ วรสอ่ื ความหมาย เพ่อื ใชอ้ า้ งองิ ถงึ ขอ้ มลู ทม่ี คี วามสมั พนั ธก์ นั ในกรณที ผ่ี เู้ ขยี นโปรแกรมยงั ไมท่ ราบขอ้ มลู ทจ่ี ะใส่ลงไปในดกิ ชนั นารแี น่ชดั ในเบอ้ื งตน้ แต่วางแผนไวว้ า่ จะใสข่ อ้ มลู ในภายหลงั ใหก้ าหนดเป็นดกิ ชนั นารวี ่างเตรยี มไวก้ ่อน แลว้ จงึ ปรบั ปรงุ ขอ้ มลู ภายหลงั เช่น dict1 = {}; print(\"Original dict : \",dict1) dict1['Key1'] = 123; print(\"Update data1 to dict : \",dict1) dict1['Key2'] = 456; print(\"Update data2 to dict : \",dict1) Original dict : {} Update data1 to dict : {'Key1': 123} OUTPUT Update data2 to dict : {'Key1': 123, 'Key2': 456} จากตวั อยา่ งโปรแกรมขา้ งบน เป็นการปรบั ปรงุ ขอ้ มลู ในดกิ ชนั นารโี ดยการเพม่ิ คขู่ องคยี แ์ ละ ขอ้ มลู ใหด้ กิ ชนั นารเี ขา้ ไปได้เรอ่ื ยๆ มขี อ้ แมว้ า่ ตอ้ งมกี ารประกาศตวั แปรดกิ ชนั นารแี บบว่างเปล่าไวก้ ่อน เสมอ คอื dict1 = { } ต่อจากนนั้ จงึ สามารถเพม่ิ ขอ้ มลู ได้ ในการใชง้ านดกิ ชนั นารขี นั้ สงู นนั้ ผเู้ ขยี น โปรแกรมสามารถสรา้ งคยี ์ และขอ้ มลู ไดห้ ลายรปู แบบ เชน่ คยี ห์ น่งึ ค่ากบั ขอ้ มลู หน่ึงคา่ คยี ห์ น่งึ ค่ากบั ขอ้ มลู หลายค่า คยี ห์ ลายค่ากบั ขอ้ มลู หน่งึ ค่า และคยี ห์ ลายคา่ กบั ขอ้ มลู หลายคา่ ดงั ตวั อยา่ ง numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9); # tuples chars = ('a', 'b', 'c', 'd', 'e', 'f'); # tuples DummyDict = {}; # Empty dictionary DummyDict['001'] = 'John'; #One to One Dict print(\"One to One Dictionary :\",DummyDict) DummyDict['001'] = numbers; #One to Many Dict print(\"One to Many Dictionary :\",DummyDict) DummyDict = {}; DummyDict[numbers] = 'Python'; #Many to One Dict print(\"Many to One Dictionary :\",DummyDict); DummyDict[numbers] = chars; #Many to Many Dict print(\"Many to Many Dictionary :\",DummyDict) ห น้ า 85

One to One Dictionary:{'001': 'John'} One to Many Dictionary:{'001': (0,1,2,3,4,5,6,7,8,9)} OUTPUT Many to One Dictionary:{(0,1,2,3,4,5,6,7,8,9): 'Python'} Many to Many Dictionary : {(0,1,2,3,4,5,6,7,8,9): ('a', 'b', 'c', 'd', 'e', 'f')} การแกไ้ ขขอ้ มลู ในดกิ ชนั นารสี ามารถทาไดโ้ ดยการอา้ งถงึ ดว้ ยคยี ์ และกาหนดค่าโดยใช้ เครอ่ื งหมาย '=' เช่น dict1['Key1'] = 'xyz' (กาหนดให้ Key1 ชข้ี อ้ มลู xyz) เป็นตน้ แต่ถา้ ไมม่ คี ยี อ์ ยใู่ น ตวั แปรดกิ ชนั นารที ป่ี ระกาศไว้ ไพธอนถอื ว่าเป็นการสรา้ งค่ขู องคยี แ์ ละขอ้ มลู ใหม่ ตวั อยา่ งเช่น dict1 มี ขอ้ มลู ดงั น้ี >>> dict1 = {'Key1': 123} เมอ่ื ทาการเพมิ่ คขู่ องคยี แ์ ละขอ้ มลู เขา้ ไป (Key2: 345) โดยท่ี dict1 ไมม่ ขี อ้ มลู ชุดน้อี ยกู่ ่อนหน้า จะทาให้ dict1 มขี อ้ มลู ดงั น้ี >>> dict1['Key2'] = 456 >>> dict1 {'Key2': 456, 'Key1': 123} การลบขอ้ มลู ออกจากดกิ ชนั นารที าไดใ้ น 3 รปู แบบคอื ลบเฉพาะสมาชกิ ทต่ี อ้ งการ เคลยี รค์ า่ ขอ้ มลู ทงั้ หมด หรอื ลบตวั แปรดกิ ชนั นารอี อกจากหน่วยความจา โดยใชค้ าสงั่ del สาหรบั การลบขอ้ มลู เฉพาะสมาชกิ ทต่ี อ้ งการทาไดโ้ ดยใชร้ ปู แบบคาสงั่ del ช่อื ตวั แปร[คยี ]์ การเคลยี รข์ อ้ มลู มรี ปู แบบคอื ชอ่ื ตวั แปร.clear() และการลบตวั แปรดกิ ชนั นารมี รี ปู แบบ del ชอ่ื ตวั แปร ดงั ตวั อยา่ ง dict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'}; print(\"Original dict :\",dict); del dict['Name']; # remove entry with key 'Name' print(\"After removed 'Name' :\",dict); dict.clear(); # remove all entries in dict print(\"After cleared all :\",dict); del dict ; # delete entire dictionary print(\"After deleted form memory :\",dict); Original dict : {'Class': 'First', 'Name': 'Zara', 'Age': 7} After removed 'Name' : {'Class': 'First', 'Age': 7} OUTPUT After cleared all : {} After deleted form memory : <class 'dict'> สมาชกิ ในดกิ ชนั นารี สามารถเป็นไดท้ งั้ ลสิ ต์และทพั เพลิ กรณที ส่ี รา้ งดกิ ชนั นารโี ดยมคี ยี เ์ ป็น ทพั เพลิ และขอ้ มลู สมาชกิ เป็นสตรงิ ตวั อยา่ งเช่น >>> Number = {(-1, 0, 1): 'Integer', (1.0, 0.0, -1.0): 'Float'} >>> Number {(-1, 0, 1): 'Integer', (1.0, 0.0, -1.0): 'Float'} หรอื กรณที ส่ี รา้ งดกิ ชนั นารโี ดยทม่ี คี ยี เ์ ป็นสตรงิ และขอ้ มลู สมาชกิ เป็นสตรงิ จานวนเตม็ หรอื ลสิ ต์ เชน่ ห น้ า 86

>>> myBoat = {\"NAME\":\"KaDiMa\", \"LOA\":18, \"SAILS\":[\"main\",\"jib\"]} >>> myBoat {'SAILS': ['main', 'jib'], 'NAME': 'KaDiMa', 'LOA': 18} NAME, LOA และ SAILS คอื คยี ท์ เ่ี ป็นสตรงิ สาหรบั ขอ้ มลู สมาชกิ ทเ่ี ป็นสตรงิ คอื KaDiMa, จานวนเตม็ คอื 18 และลสิ ตค์ อื [\"main\",\"jib\"] ตามลาดบั การแสดงผลขอ้ มลู ในดกิ ชนั นารที ม่ี คี วามยาวมากๆ นิยมใชค้ าสงั่ ทาซา้ ช่วยในการแสดงผล เช่น for เป็น ตน้ ดงั ตวั อยา่ งต่อไปน้ี dict1 = {1:\"Python\", 2:'Programming', 3:\"Language\", 4:\"!!!.\"} for i in dict1: print(dict1[i]) dict2 = {1:\"Python\", 2:(1, 2), '3':[3, 4, 5], 4:{\"Name\":\"Suchart\"}} for i in dict1: print(dict2[i]) Python Programming OUTPUT Language !!!. Python (1, 2) [3, 4, 5] {'Name': 'Suchart'} จากตวั อยา่ ง dict1 เป็นตวั แปรชนดิ ดกิ ชนั นารที ม่ี คี ยี เ์ ป็น จานวนเตม็ และขอ้ มลู สมาชกิ เป็น สตรงิ ในตวั อยา่ งเลอื กใช้ for ในการแสดงผลขอ้ มลู สมาชกิ ทงั้ หมด โดย การดงึ คยี อ์ อกมาจาก dict1 ทลี ะ คา่ (for i in dict1) และใชค้ ยี ด์ งั กล่าว เขา้ ถงึ ขอ้ มลู สมาชกิ ทเ่ี กบ็ จรงิ เช่น เมอ่ื คยี เ์ ท่ากบั 1 คยี ด์ งั กลา่ วจะ ถูกเกบ็ ไวใ้ นตวั แปร i ต่อจากนนั้ ใชต้ วั แปร i เพ่อื อา้ งองิ ไปยงั ขอ้ มลู จรงิ อกี ครงั้ ดว้ ย dict1[i] = dict1[1] = \"Python\" สาหรบั การแสดงผลขอ้ มลู ใน dict2 กจ็ ะทาในลกั ษณะเชน่ เดยี วกนั คณุ สมบตั ิของดิกชนั นารีท่ีควรต้องจดจา ประการแรก: ตามทฤษฏแี ลว้ คยี ใ์ นดกิ ชนั นารจี ะตอ้ งมคี ่าไมซ่ ้ากนั เลย แต่ในสถานะการณ์จรงิ ไพธอนยอมใหส้ ามารถประกาศคยี ท์ เ่ี หมอื นกนั ในดกิ ชนั นารไี ด้ (ไพธอนไมไ่ ดต้ รวจสอบขณะประกาศ ขอ้ มลู ในตวั แปร) ส่งผลใหก้ ารอ้างองิ ขอ้ มลู ทม่ี คี ยี เ์ หมอื นกนั เกดิ ขอ้ ผดิ พลาดคอื ไพธอนจะดงึ ขอ้ มลู รายการสุดทา้ ยทเ่ี จอในดกิ ชนั นารอี อกมาแสดงผล โดยขอ้ มลู ทซ่ี ้ากนั ในลาดบั ก่อนหน้าจะไมถ่ กู นามาใช้ งานเลย ยกตวั อยา่ งเชน่ dict = {'Name': 'Zara', 'Age': 7, 'Name': 'Manni'}; print (\"dict['Name']: \", dict['Name']); ห น้ า 87

dict['Name']: Manni OUTPUT จากตวั อยา่ งโปรแกรมขา้ งบน แสดงใหเ้ หน็ ว่ามคี ยี เ์ หมอื นกนั 2 ตาแหน่งในดกิ ชนั นารี คอื Name เมอ่ื ทาการเรยี กใชง้ านขอ้ มลู ปรากฎว่าโปรแกรมจะนาขอ้ มลู หลงั สดุ ของดกิ ชนั นารมี าแสดงผล เสมอ สง่ ผลใหค้ ่ขู องขอ้ มลู 'Name':'Zara' จะไมถ่ ูกนามาประมวลผลเลย ประการท่ีสอง: โดยปกตคิ ยี จ์ ะตอ้ งเป็นค่าทไ่ี มค่ วรเปลย่ี นแปลง เพราะเป็นค่าทใ่ี ชอ้ า้ งองิ ถงึ ขอ้ มลู จรงิ ตวั อยา่ งในชวี ติ ประจาวนั เช่น นกั ศกึ ษาตอ้ งมหี มายเลข ID ของนกั ศกึ ษา และไมค่ วรเปลย่ี น ID ไปเรอ่ื ยๆ ฉนั ใดกฉ็ นั นัน้ คยี ไ์ มค่ วรเปลย่ี นแปลงบ่อยเชน่ เดยี วกนั แมว้ ่าเราสามารถใชข้ อ้ มลู หลาย ประเภทเป็นคยี ไ์ ด้ เช่น สตรงิ ตวั เลข หรอื ทพั เพลิ แต่ไพธอนไมแ่ นะนาใหใ้ ชค้ ยี ใ์ นลกั ษณะทค่ี ยี ถ์ ูกครอบ ดว้ ย […] เพราะจะทาใหไ้ พธอนเกดิ ความสบั สนในการอา้ งถงึ ขอ้ มลู และเกดิ ความผดิ พลาด เช่น dict = {['Name']: 'Zara', 'Age': 7}; print (\"dict['Name']: \", dict['Name']); Traceback (most recent call last): OUTPUT File \"C:/Python33/testx.py\", line 1, in <module> dict = {['Name']: 'Zara', 'Age': 7}; TypeError: unhashable type: 'list' แต่ถา้ จาเป็นตอ้ งการใช้ […] เป็นคยี จ์ รงิ ๆ สามารถทาได้โดยใชเ้ ครอ่ื งหมาย '' ในลกั ษณะดงั น้ี '[KeyName]'แทน เช่น dict = {'[Name]': 'Zara', 'Age': 7}; print (\"dict['[Name]']: \", dict['[Name]']); dict['[Name]']: Zara OUTPUT เซต (Sets) เซต ในทางคณติ ศาสตรเ์ ป็นคาทใ่ี ชบ้ ง่ บอกถงึ กลุ่มของสงิ่ ต่างๆ วา่ สงิ่ ใดอยใู่ นกลุ่ม สงิ่ ใดไมอ่ ยใู่ น กลมุ่ เชน่ เซตสระในภาษาองั กฤษ หมายถงึ กลุ่มของสระองั กฤษ a, e, i, o และ u เซตของจานวนนบั ท่ี น้อยกว่า 10 หมายถงึ กลุม่ ตวั เลข 1, 2, 3, 4, 5, 6, 7, 8 และ 9 เป็นตน้ สงิ่ ทอ่ี ยใู่ นเชต็ เรยี กวา่ สมาชกิ (Element หรอื Members) คุณสมบตั ขิ องเซตคอื สมาชกิ ไมจ่ าเป็นตอ้ งเรยี งลาดบั และสมาชกิ ตอ้ งไมซ่ ้า กนั สาหรบั การดาเนนิ งานกบั เซตพน้ื ฐานประกอบไปดว้ ย การทดสอบความเป็นสมาชกิ การขจดั สมาชกิ ทซ่ี ้ากนั ทงั้ หมดในเซต, union, intersection, difference และ symmetric difference เป็นตน้ ในไพธอน จะใชส้ ณั ลกั ษณ์ {…} สาหรบั สรา้ งตวั แปรชนิดเซต และใช้ set() ในการกาหนดว่าเป็นเซตว่าง ดงั ตวั อยา่ ง ต่อไปน้ี ห น้ า 88

>>> setx = set(); # empty set >>> type(setx); <class 'set'> จากตวั อยา่ งคาสงั่ ขา้ งบน เป็นการสรา้ งตวั แปร setx ใหเ้ ป็นเซตว่าง เมอ่ื เรยี กคาสงั่ type(setx) จะแสดง ประเภทของตวั แปร setx คอื set Note: ควรจาไวว้ ่า การประกาศตวั แปรเซตใหเ้ ป็นเซตวา่ ง จะตอ้ งใชฟ้ ังชนั set() เทา่ นนั้ ผใู้ ช้ ไมส่ ามารถใช้ setx = { } ได้ เพราะไพธอนจะมองว่าเป็นตวั แปรชนดิ ดกิ ชนั นารี และไม่ สามารถใชร้ ปู แบบ setx = ( ) ได้ เพราะจะเป็นตวั แปรทพั เพลิ และ setx = [ ] จะเป็นตวั แปร ชนิดลสิ ตแ์ ทน ตวั อยา่ งการประกาศตวั แปรเซตทไ่ี มว่ ่าง basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} print(basket) # show that duplicates have been removed {'banana', 'orange', 'apple', 'pear'} OUTPUT จากโปรแกรมตวั อยา่ งขา้ งบน เป็นการประกาศตวั แปรชนดิ เซต basket พรอ้ มกาหนดคา่ ของสมาชกิ เป็น apple, orange, pear, banana เหน็ ไดว้ า่ สมาชกิ ทก่ี าหนดลงไปในเซตจะมคี ่าทซ่ี า้ กนั แต่เมอ่ื สงั่ รนั โปรแกรมผลลพั ธท์ ไ่ี ดค้ อื เซตจะทาการกาจดั สมาชกิ ทซ่ี ้ากนั ออก จงึ เหลอื แค่ 4 ตวั เท่านนั้ การสรา้ งเซตในไพธอนสามารถสรา้ งจากลสิ ต์ และทพั เพลิ ได้ โดยการประกาศตวั แปร และขอ้ มลู ชนดิ ลสิ ตก์ ่อน แลว้ จงึ เรยี กฟังชนั เพ่อื เปลย่ี นค่าตวั แปรจากชนิดลสิ ตม์ าเป็นเซต โดยใชฟ้ ังชนั set() ดงั น้ี List_x = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana'] type(list_x) <class 'list'> # Declear list_x was List setList = set(list_x) # Converting List to Set print(setList) {'banana', 'orange', 'apple', 'pear'} # remove duplicate member type(setList) <class 'set'> tuple_x = (\"hello\", \"world\", \"of\", \"words\", \"of\", \"world\") type(setTuple) # Declear tuple_x was Tuple <class 'tuple'> setTuple = set(tuple_x) # Converting Tuple to Set print(setTuple) {'world', 'of', 'hello', 'words'} ผเู้ ขยี นโปรแกรมสามารถประกาศเซตจากตวั อกั ษร หรอื ตวั เลขทไ่ี มซ่ ้ากนั ไดใ้ นครงั้ เดยี ว โดยใช้ รปู แบบคอื set('ตวั เลขหรอื ตวั อกั ษร') ดงั น้ี ห น้ า 89

setA = set('abracadabra') setB = set('alacazam') setC = set('112768730893488746249') print(setA) print(setB) print(setC) {'b', 'r', 'a', 'd', 'c'} {'z', 'c', 'a', 'l', 'm'} OUTPUT {'2', '3', '0', '1', '6', '7', '4', '8', '9'} การตรวจสอบขอ้ มลู ในเซต ทาไดโ้ ดยใชค้ าสงั่ in ดงั น้ี เมอ่ื setA มคี ่าเทา่ กบั {'b', 'r', 'a', 'd', 'c'} >>> 'a' in setA True >>> 'z' in setA False จากตวั อยา่ งโปรแกรมขา้ งตน้ แสดงใหเ้ หน็ วา่ 'a' เป็นสมาชกิ ทอ่ี ยใู่ น setA และ 'z' ไมเ่ ป็น สมาชกิ ใน setA ไพธอนเตรยี มคาสงั่ ไวใ้ หผ้ ใู้ ชง้ านสามารถดาเนินการเกย่ี วกบั เซต เชน่ union (|), intersection (&), difference (-), symmetric difference (^) ไวอ้ ยา่ งครบถว้ น ดงั น้ี กาหนดให้ S1 = {1, 2, 3, 5, 8, 13} และ S2 = {2, 3, 5, 7, 11, 13} ยเู นียน (Union) ของเซต S1 และ S2 คอื เซตทป่ี ระกอบดว้ ยสมาชกิ ของเซต S1 หรอื S2 ใชส้ ญั ลกั ษณ์ '|' ดงั รปู 4.2 รปู ท่ี 4.2 S1 | S2 S1=set((1,1,2,3,5,8,13)) S2=set((2,3,5,7,11,13)) print(\"Set S1 :\",S1) print(\"Set S2 :\",S2) print(\"Set S1 | S2 :\",S1|S2) Set S1 : {1, 2, 3, 5, 8, 13} Set S2 : {2, 3, 5, 7, 11, 13} OUTPUT Set S1 | S2 : {1, 2, 3, 5, 7, 8, 11, 13} ห น้ า 90

อินเตอรเ์ ซคชนั (Intersection) ของเซต S1 และ S2 คอื เซตทป่ี ระกอบดว้ ยสมาชกิ ของเซต S1 และ S2 ใชส้ ญั ลกั ษณ์ '&' ดงั รปู 4.3 รปู ท่ี 4.3 S1 & S2 print(\"Set S1 :\",S1) print(\"Set S2 :\",S2) print(\"Set S1 & S2 :\",S1&S2) Set S1 : {1, 2, 3, 5, 8, 13} Set S2 : {2, 3, 5, 7, 11, 13} OUTPUT Set S1 & S2 : {2, 3, 5, 13} ผลต่าง (Difference) ของเซต S1 และ S2 คอื เซตทป่ี ระกอบดว้ ยสมาชกิ ทเ่ี ป็นสมาชกิ ของเซต S1 แต่ ไมเ่ ป็นสมาชกิ ของเซต S2 ใชส้ ญั ลกั ษณ์ '-' ดงั รปู 4.4 รปู ท่ี 4.4 S1 - S2 print(\"Set S1 :\",S1) print(\"Set S2 :\",S2) print(\"Set S1 - S2 :\",S1-S2) Set S1 : {1, 2, 3, 5, 8, 13} Set S2 : {2, 3, 5, 7, 11, 13} OUTPUT Set S1 - S2 : {8, 1} ผลต่างสมมาตร (Symmetric difference) ของเซต S1 และ S2 คอื เซตทป่ี ระกอบดว้ ยสมาชกิ ทอ่ี ยใู่ น เซต S1 หรอื เซต S2 แต่ไมใ่ ช่สมาชกิ ทอ่ี ย่ทู งั้ ใน S1 และ S2 ใชส้ ญั ลกั ษณ์ '^' ดงั รปู 4.5 ห น้ า 91

รปู ที่ 4.5 S1 ^ S2 print(\"Set S1 :\",S1) print(\"Set S2 :\",S2) print(\"Set S1 ^ S2 :\",S1^S2) Set S1 : {1, 2, 3, 5, 8, 13} Set S2 : {2, 3, 5, 7, 11, 13} OUTPUT Set S1 ^ S2 : {1, 7, 8, 11} ตวั ดาเนินการท่ีใช้เปรยี บเทียบสาหรบั เซต (Set comparison operators) สาหรบั ตวั ดาเนนิ การทใ่ี ชก้ บั เซตประกอบไปดว้ ย <, <=, >, >=, ==, !=, in , not in ซง่ึ จะอธบิ าย ไวอ้ ยา่ งละเอยี ดในหวั ขอ้ นพิ จน์ ตวั ดาเนินการ และตวั ถกู ดาเนินการ แต่ในหวั ขอ้ น้จี ะอธบิ ายการใชง้ าน กบั ตวั ดาเนนิ การพน้ื ฐาน เพ่อื ใหเ้ ขา้ ใจการทางานของเซตในเบอ้ื งตน้ ตวั ดาเนินการทใ่ี ชบ้ อ่ ยๆ คอื in และ not in ความหมายคอื เป็นสมาชกิ หรอื ไมเ่ ป็นสมาชกิ ตวั อยา่ งเช่น กาหนดให้ S1 = {1, 2, 3, 5, 8, 13} และ S2 = {2, 3, 5, 7, 11, 13} >>> S1 = {1, 2, 3, 5, 8, 13}; >>> S2 = {2, 3, 5, 7, 11, 13}; >>> S3 = {3, 5, 8} >>> 3 in S1 True >>> 7 in S1 False เครอ่ื งหมาย <, <=, >, >= ใชส้ าหรบั การเปรยี บเทยี บ 2 เซตใดๆ ถงึ ความเป็น superset และ subset เชน่ ถา้ S1 เป็น subset ของ S2 กต็ ่อเมอ่ื สมาชกิ ทุกตวั ใน S1 อยใู่ น S2 ใชต้ วั ดาเนินการ <=, S1 เป็น proper subset ของ S2 ใชต้ วั ดาเนินการ < เป็นตน้ ดงั ตวั อยา่ งต่อไปน้ี >>> S1 < S2 False S1 < S2 เป็นเทจ็ เพราะสมาชกิ ใน S1 และ S2 มคี ่าเท่ากนั >>> S1 >= S3 True S1 >= S3 เป็นจรงิ เพราะสมาชกิ ใน S1 มากกวา่ S3 ห น้ า 92

การสรา้ งเซตขนั้ สงู ผเู้ ขยี นโปรแกรมสามารถสรา้ งเซตไดจ้ ากตวั แปรหลายชนดิ เช่นเซตทม่ี คี ขู่ องสมาชกิ อยภู่ ายใน ดงั ตวั อยา่ ง >>> A = Set([('Yes', 'No'), ('Yes', 'Idontknow'), ('No', 'Yes'), ('No', 'Idontknow')]) >>> ('Yes','No') in A True จากโปรแกรมตวั อยา่ งขา้ งบน เซต A ถกู สรา้ งมาจากตวั แปรชนดิ ทพั เพลิ ('Yes', 'No'), ('Yes', 'Idontknow'), ('No', 'Yes') และ ('No', 'Idontknow') ทงั้ หมดถูกครอบดว้ ยลสิ ต์ […] อกี ครงั้ แลว้ จงึ ทา การแปลงจากลสิ ตไ์ ปเป็นตวั แปรชนดิ เซต สงั เกตเหน็ ว่าในบางครงั้ การสรา้ งตวั แปรเซตจากตวั แปรชนิด อ่นื ๆ จะใหค้ วามสะดวกกวา่ การกาหนดสมาชกิ ใหก้ บั ตวั แปรเซตตรงๆ แมว้ า่ เซตจะไมใ่ ชต่ วั แปรอนั ดบั (sequence) แต่ถา้ ตอ้ งการประมวลผลสมาชกิ แต่ละตวั ในเซต นิยมใช้ for (ซง่ึ จะกล่าวอยา่ งละเอยี ดในหวั ขอ้ เงอ่ื นไข และการควบคุมทศิ ทางโปรแกรม) ในการเขา้ ถงึ สมาชกิ ในเซต ดงั ตวั อยา่ งต่อไปน้ี even = set(range(2,10,2)); odd = set(range(1,10,2)); zero = set((0,'00')); for n in even|odd|zero: print (\"Member of set even|odd|zero :\",n) OUTPUT Member of set even|odd|zero : 0 Member of set even|odd|zero : 1 Member of set even|odd|zero : 2 Member of set even|odd|zero : 3 Member of set even|odd|zero : 4 Member of set even|odd|zero : 5 Member of set even|odd|zero : 6 Member of set even|odd|zero : 7 Member of set even|odd|zero : 8 Member of set even|odd|zero : 9 Member of set even|odd|zero : 00 สรปุ การใช้งานข้อมลู พื้นฐานและข้อมลู เชิงประกอบ จากตารางท่ี 4.3 แสดงการเปรยี บเทยี บการใชง้ านของตวั แปรชนิดพน้ื ฐานคอื สตรงิ กบั ขอ้ มลู เชงิ ประกอบคอื ลสิ ต์ ดกิ ชนั นารี ทพั เพลิ และเซต็ ดงั น้ี ตารางท่ี 4.3 แสดงสรปุ การใชง้ านขอ้ มลู พน้ื ฐานและขอ้ มลู เชงิ ประกอบ การดาเนิ นการ สตริง ลิสต์ ดิกชนั นารี ทพั เพิล เซต็ การสรา้ ง  {…} เชน่ (…) เชน่ {…} เช่น '…' หรอื \"…\" […] เชน่ Z = {1, 2,…, n} เชน่ L = [1, 2,.., n] ห น้ า 93

การเขา้ ถงึ สมาชกิ S = \"Hello L[i] เช่น D = {key1:1, T = (a, b,…, for z in Z: เชน่  World\" L[0], L[-1] key2:2,…, keyn:n} n) for z in Z: S[i] เช่น print(z) ตรวจสอบความ e in L เชน่ D[key] เชน่ T[i] เชน่ e in Z เชน่ เป็นสมาชกิ  S[0], S[-1] 1 in L D['key1'] T[0], T[-1] 1 in Z การลบสมาชกิ 1 Z.remove(e) Char in S เชน่ del L[i] เช่น key in D เชน่ e in T เชน่ เช่น ตวั  'H' in S del L[0] 'key1' in D 2 in T Z.remove(1) del D[key] เชน่ หรอื Z.pop() การแกไ้ ขสมาชกิ ลบไมไ่ ด้ แต่ใช้ L[i] = new del D['key1'] ลบไมไ่ ด้ แต่ให้  การสรา้ งใหม่ได้ เชน่ แปลงเป็นลสิ ต์ แกไ้ ขไมไ่ ด้ เชน่ S = S[:i-1] D[key] = new เช่น ก่อนแลว้ จงึ ลบ, เพม่ิ สมาชกิ ใหม่ L[0] = 5 D['key1'] = 5 การลบทพั เพลิ Z.add(e) เชน่  + S[i:] Z.add(5) L.append(e) D[newkey] = new ใช้ del T การลบสมาชกิ แกไ้ ขไมไ่ ด้ แต่ใช้ เชน่ เชน่ แกไ้ ขไม่ได้ แต่ ลบไม่ได้ แต่ถา้ หลายตวั การสรา้ งใหมไ่ ด้ ใหแ้ ปลงเป็น เคลยี รข์ อ้ มลู ทง้ิ เช่น S = S[:i-1] L.append(5) D['key5'] = 5 ลสิ ตก์ ่อนแลว้ จงึ ทงั้ หมดสามารถ แบบต่อเน่อื ง  + new + S[i:] แกไ้ ข แลว้ จงึ del L[i:k] เช่น ลบไมไ่ ด้ แต่ถา้ เคลยี ร์ แปลงกลบั เป็น ทาได้ คอื แกไ้ ขสมาชกิ เพมิ่ สมาชกิ ตรงๆ del L[2:4] ขอ้ มลู ทง้ิ ทงั้ หมด ทพั เพลิ อกี ครงั้ Z.clear() หลายตวั ไมไ่ ด้ ใช้ S = S สามารถทาได้ คอื เพม่ิ ไมไ่ ด้ แต่ แกไ้ ขไมไ่ ด้ + 'new' แทน L[i:k] = D.clear() ใหแ้ ปลงเป็น แบบต่อเน่อื ง  Lnews เช่น ลสิ ตก์ ่อนแลว้ จงึ Z.update(newZ) ลบไม่ได้ แต่ใช้ L[2:4] = [0, 0] แกไ้ ขไม่ได้ เชน่ การเพมิ่ สมาชกิ การสรา้ งใหมไ่ ด้ เพมิ่ มากกวา่ 1 ตวั เช่น S = S[:i] + L.extend(Lne D.update(newD) เช่น ลบไมไ่ ด้ แต่ให้ Z.update({1, 2}) ws) หรอื L + D.update({'key3':3}) แปลงเป็นลสิ ต์  S[k:] L + Lnews ก่อนแลว้ จงึ ลบ แกไ้ ขไมไ่ ด้ แต่ใช้ แกไ้ ขไมไ่ ด้ แต่ การสรา้ งใหม่ได้ ใหแ้ ปลงเป็น เช่น S = S[:i-1] ลสิ ตก์ ่อนแลว้ จงึ + news + S[i:] เพม่ิ ไมไ่ ด้ แต่ใช้ แกไ้ ข การสรา้ งใหมไ่ ด้ เพม่ิ ไมไ่ ด้ แต่ เช่น S = S + ใหแ้ ปลงเป็น ลสิ ตก์ ่อนแลว้ จงึ news เพมิ่  การสร้าง ห น้ า 94

ตวั แปรชนดิ สตรงิ  S = 'Hello World' หรอื S = \"Hello World\" ตวั แปรชนดิ ลสิ ต์  L = [1, 2, 3, 4, 5], L= ['Yes', 'No', 'OK'], L = [1, 0.5, 'True'] ตวั แปรชนดิ ดกิ ชนั นารี  D = {1:'One', 1:'Two', 1:'Three'}, D = {'key1':1, 'key2':2} ตวั แปรชนิดทพั เพลิ  T = (1, 2, 3, 4), T = (1, 0.5, 'True') ตวั แปรชนดิ เซต็  Z = {1, 2, 3, 4}, T = {1, 0.5, 'True'}  การเข้าถงึ สมาชิก สตรงิ  S = 'Hello World' แลว้ S[0]  'H', S[-1]  'd' ลสิ ต์  L = [1, 2, 3, 4, 5] แลว้ L[0]  1, S[-1]  5 ดกิ ชนั นารี  D = {'key1':1, 'key2':2} แลว้ L['key1']  1 ทพั เพลิ  T = (1, 2, 3, 4) แลว้ T[0]  1, S[-1]  4 เซต็  Z = {1, 2, 3, 4} แลว้ for z in Z: print(z)  พมิ พเ์ ลข 1 ถงึ 4  การตรวจสอบความเป็นสมาชิก สตรงิ  S = 'Hello World' แลว้ 'H' in S  True, 'X' in S  False ลสิ ต์  L = [1, 2, 3, 4, 5] แลว้ 1 in L  True, 9 in S  False ดกิ ชนั นารี  D = {'key1':1, 'key2':2} แลว้ 'key1' in D  True ทพั เพลิ  T = (1, 2, 3, 4) แลว้ 1 in T  True, 9 in T  False เซต็  Z = {1, 2, 3, 4} แลว้ 1 in Z  True, 9 in Z  False  การลบสมาชิก สตรงิ  S = 'Hello World' แลว้ S = S[:3-1] + S[6:]  'HeWorld' ลสิ ต์  L = [1, 2, 3, 4, 5] แลว้ del L[0]  [2, 3, 4, 5] ดกิ ชนั นารี  D = {'key1':1, 'key2':2} แลว้ del D['key1']  {'key2':2} ทพั เพลิ  ไมส่ นบั สนุนการลบสมาชกิ ตอ้ งแปลงเป็นลสิ ตก์ ่อนแลว้ จงึ ลบ เซต็  Z = {1, 2, 3, 4} แลว้ Z.remove(1)  {2, 3, 4} ห น้ า 95

 การแก้ไขหรือปรบั ปรงุ สมาชิก สตรงิ  S = 'Hello World' แลว้ S = S[:3-1] + 'XX' + S[6:]  'HeXXWorld' ลสิ ต์  L = [1, 2, 3, 4, 5] แลว้ L[0] = 0  [0, 2, 3, 4, 5] ดกิ ชนั นารี  D = {'key1':1, 'key2':2} แลว้ D['key1'] = 9  {'key1':9, 'key2':2} ทพั เพลิ  ไมส่ นบั สนุนการแกไ้ ขสมาชกิ ตอ้ งแปลงเป็นลสิ ตก์ ่อนแลว้ จงึ แกไ้ ข เซต็  ไมส่ นบั สนุนการแกไ้ ขสมาชกิ  การเพ่ิมสมาชิกใหม่ สตรงิ  S = 'Hello World' แลว้ S = 'X' + S + 'X'  'XHello WorldX' ลสิ ต์  L = [1, 2, 3, 4, 5] แลว้ L.append(6)  [1, 2, 3, 4, 5, 6] ดกิ ชนั นารี  D = {'key1':1, 'key2':2} แลว้ D['key3'] = 3  {'key1':1, 'key2':2, 'key3':3} ทพั เพลิ  ไมส่ นบั สนุนการเพม่ิ สมาชกิ ใหมต่ อ้ งแปลงเป็นลสิ ตก์ ่อนแลว้ จงึ เพมิ่ เซต็  Z = {1, 2, 3, 4} แลว้ Z.add(5)  {1, 2, 3, 4, 5}  การลบสมาชิกหลายตวั แบบต่อเนื่อง สตรงิ  S = 'Hello World' แลว้ S = S[:2] + S[7:]  'Heorld' ลสิ ต์  L = [1, 2, 3, 4, 5] แลว้ del L[2:4]  [1, 2, 5] ดกิ ชนั นารี  D = {'key1':1, 'key2':2} แลว้ D.clear()  { } ทพั เพลิ  ไมส่ นบั สนุนการลบสมาชกิ ใหมต่ อ้ งแปลงเป็นลสิ ตก์ ่อนแลว้ จงึ ลบ เซต็  Z = {1, 2, 3, 4} แลว้ Z.clear()  set()  การแก้ไขหรือปรบั ปรงุ สมาชิกหลายตวั แบบต่อเนื่อง สตรงิ  S = 'Hello World' แลว้ S = S[:3-1] + 'XX' + S[6:]  'HeXXWorld' ลสิ ต์  L = [1, 2, 3, 4, 5] แลว้ L[2:4] = [0, 0]  [1, 2, 0, 0, 5] ดกิ ชนั นารี  ไมส่ นบั สนุนการแกไ้ ข ทพั เพลิ  ไมส่ นบั สนุนการแกไ้ ขสมาชกิ ตอ้ งแปลงเป็นลสิ ตก์ ่อนแลว้ จงึ แกไ้ ข ห น้ า 96

เซต็  ไมส่ นบั สนุนการแกไ้ ข  การเพ่ิมสมาชิกหลายตวั แบบต่อเนื่อง สตรงิ  S = 'Hello World' แลว้ S = S + ' Python'  'Hello World Python' ลสิ ต์  L = [1, 2, 3, 4, 5] แลว้ L.extend([6, 7]) = [0, 0]  [1, 2, 3, 4, 5, 6, 7] ดกิ ชนั นารี  D = {'key1':1, 'key2':2} แลว้ D.update({'key3':3, 'key4':4})  {'key1': 1, 'key2': 2, 'key3': 3, 'key4': 4} ทพั เพลิ  ไมส่ นบั สนุนการเพมิ่ สมาชกิ ตอ้ งแปลงเป็นลสิ ตก์ ่อนแลว้ จงึ เพมิ่ เซต็  Z = {1, 2, 3, 4} แลว้ Z.update({5, 6})  {1, 2, 3, 4, 5, 6} จบบทท่ี 4 ห น้ า 97

บทท่ี 5 นิพจน์ ตวั ดำเนินกำร และตวั ถกู ดำเนินกำร (Expression, Operators and Operands) นิพจน์ (Expression) คอื การดาเนนิ การทป่ี ระกอบดว้ ยตวั ดาเนินการ (Operator) และตวั ถกู ดาเนินการ (Operand) ตวั ดาเนนิ การ (Operator) คอื สญั ลกั ษณ์ทใ่ี ชใ้ นการแทนการกระทาอย่างใดอย่างหน่งึ กบั ขอ้ มลู เช่น +, -, *, **, /, //, %, =, >, <, !=, ==, <> เป็นตน้ ตวั ถูกดาเนินการ (Operand) คอื ขอ้ มลู ทถ่ี ูกกระทาโดยตวั ดาเนนิ การ ซง่ึ ตวั ถูกดาเนนิ การอาจ อยใู่ นรปู ของตวั แปร (Variable) คา่ คงท่ี (Constant) ค่าทไ่ี ดร้ บั จากฟังก์ชนั (Return function) หรอื แมก้ ระทงั่ นพิ จน์ (Expression) เอง กเ็ ป็นตวั ถกู ดาเนินการได้ เช่น a+b, x++, a != b, x = (a + b) / 2 เป็นตน้ จากตวั อยา่ ง y = x2 + 2x + 1 y, x, 1 คอื ตวั ถกู ดาเนนิ การ (Operand) =, +, ยกกาลงั สอง คอื ตวั ดาเนนิ การ (Operator) y = x2 + 2x + 1 ทงั้ หมด คอื นพิ จน์ (Expression) ภาษาไพธอนสนบั สนนั ตวั ดาเนินการหลายแบบ คอื Arithmetic Operators, Comparison Operators, Assignment Operators, Logical Operators, Bitwise Operators, Membership Operators, Identity Operators 1. ตวั ดำเนินกำรทำงคณิตศำสตร์ (Arithmetic Operators) เพ่อื ใหเ้ ขา้ ใจถงึ การทางานของตวั ดาเนินการทางคณติ ศาสตร์ สมมตุ ใิ ห้ ตวั แปร a = 10, b = 5, c = 9.0, d = 2.0, e = -3.5 สาหรบั ตวั อยา่ งการดาเนนิ การทางคณติ ศาสตรแ์ สดงในตารางท่ี 4.1 ตำรำงท่ี 4.1 Arithmetic Operators ห น้ า 98

Operator ควำมหมำย ตวั อย่ำง (a = 10, b = 5, c = 9.0, d = 2.0, e = -3.5) + การบวก a + b = 15, a + c = 19.0 (Addition) - การลบ a – b = 5, b – a = -5, c – d = 7.0, d – c = -7.0 (Subtraction) * การคณู a * b = 50, b * d = 10.0, a * e = -35.0, e * e = 12.25 (Multiplication) / การหาร a / b = 2.0, b / a = 0.5, d / c = 2.99999, c / b = 1.8, e / d = - (Division) 1.75, e / e = 1.0 % การหารเอาเศษ 2 0 (Modulus) 5 10 10 5 10 a%b=0 0 หรอื b % a = 5 5 c % d = 1.0, c % e = -1.5, e % c = 5.5 ** เลขยกกาลงั a**b (ab) = 100000 หรอื b**a (ba) = 9,765,625 (Exponent) d**e = 0.0883, e**d = -12.25 // การหารเอาส่วน 2 0 (Floor division) 5 10 10 5 10 a // b = 2 0 หรอื b // a = 0 5 ถา้ 9 // 2 = 4, 9.0 // 2.0 = 4.0, 9.0 // 2 = 4.0 และ 9 // 2.0 = 4.0 ตวั อยา่ ง Arithmetic Operators a = 21 b = 10 c=0 c=a+b print (\"1: Value of c is \", c) c=a–b print (\"2: Value of c is \", c) c=a*b print (\"3: Value of c is \", c) c=a/b print (\"4: Value of c is \", c) c=a%b print (\"5: Value of c is \", c) a=2 b=3 c = a**b print (\"6: Value of c is \", c) a = 10 b=5 c = a//b print (\"7: Value of c is \", c) ห น้ า 99

OUTPUT 1: Value of c is 31 2: Value of c is 11 3: Value of c is 210 4: Value of c is 2.1 5: Value of c is 1 6: Value of c is 8 7: Value of c is 2 2. ตวั ดำเนินกำรทำงด้ำนกำรเปรยี บเทียบ (Comparison Operators) เป็นการเปรยี บเทยี บกนั ระหวา่ งขอ้ มลู หรอื ตวั ถกู ดาเนินการอยา่ งน้อย 2 จานวน โดยการ เปรยี บเทยี บนนั้ จะทาการเปรยี บเทยี บทลี ะ 2 จานวน ผลลพั ธท์ ไ่ี ดจ้ ะอยใู่ นรปู ตรรกะ (Boolean) คอื จรงิ (True) หรอื เทจ็ (False) ถา้ มกี ารเปรยี บเทยี บมากวา่ 2 จานวน จะทาการเปรยี บเทยี บจากดา้ นซา้ ยมอื ไปขวามอื หรอื ภายในวงเลบ็ ก่อน โดยมกี ารเชอ่ื มดว้ ยตรรกะ เช่น and (และ) or (หรอื ) ดงั ตวั อยา่ งใน ตารางท่ี 4.2 โดยสมมตุ วิ ่า ตวั แปร a = 10, b = 5, c = 9.0, d = 2.0, e = -3.5 ตำรำงท่ี 4.2 Comparison Operators Operator ควำมหมำย ตวั อย่ำง (a = 10, b = 5, c = 9.0, d = 2.0, e = -3.5) == เท่ากบั เป็นจรงิ กต็ ่อเมอ่ื ซา้ ยเทา่ กบั ขวา เชน่ a == b ใหผ้ ลลพั ธ์ (Equal) คอื เทจ็ x = 'str'; y = 'stR'; x == y ผลลพั ธค์ อื เทจ็ != ไมเ่ ท่ากบั เป็นจรงิ กต็ ่อเมอ่ื ซา้ ยไมเ่ ท่ากบั ขวา เช่น b != c ให้ (Not equal) ผลลพั ธค์ อื จรงิ > มากกวา่ (Greater than) เป็นจรงิ กต็ ่อเมอ่ื ซา้ ยมากกว่าขวา เชน่ c > d ใหผ้ ลลพั ธ์ คอื จรงิ < น้อยกว่า เป็นจรงิ กต็ ่อเมอ่ื ซา้ ยน้อยกวา่ ขวา เช่น d < e ใหผ้ ลลพั ธ์ (Less than) คอื เทจ็ >= มากกวา่ หรอื เท่ากบั เป็นจรงิ กต็ ่อเมอ่ื ซา้ ยมากกว่าหรอื เท่ากบั ขวา เชน่ a >= (Greater than or equal to) c ใหผ้ ลลพั ธค์ อื จรงิ , (3 >= 5) ใหผ้ ลลพั ธค์ อื เทจ็ <= น้อยกว่าหรอื เท่ากบั เป็นจรงิ กต็ ่อเมอ่ื ซา้ ยน้อยกวา่ หรอื เท่ากบั ขวา เชน่ b <= (Less than or equal to) c ใหผ้ ลลพั ธค์ อื จรงิ , (5.0 <= 5) ใหผ้ ลลพั ธค์ อื จรงิ Note: ภาษาไพธอนไมส่ นนั สนุนตวั ดาเนินการ ===, !==, <> เหมอื นในภาษา C/C++ ตวั อยา่ ง Comparison Operators a = 21 b = 10 ห น้ า 100

c=0 if ( a == b ): print (\"Line 1 - a is equal to b\") else: print (\"Line 1 - a is not equal to b\") if ( a != b ): print (\"Line 2 - a is not equal to b\") else: print (\"Line 2 - a is equal to b\") if ( a < b ): print (\"Line 3 - a is less than b\") else: print (\"Line 3 - a is not less than b\") if ( a > b ): print (\"Line 4 - a is greater than b\") else: print (\"Line 4 - a is not greater than b\") a = 5; b = 20; if ( a <= b ): print(\"Line 5 - a is either less than or equal to b\") else: print(\"Line 5 - a is neither less than nor equal to b\") if ( b >= a ): print(\"Line 6 - b is either greater than or equal to b\") else: print(\"Line 6 - b is neither greater than nor equal to b\") OUTPUT Line 1 - a is not equal to b Line 2 - a is not equal to b Line 3 - a is not less than b Line 4 - a is greater than b Line 5 - a is either less than or equal to b Line 6 - b is either greater than or equal to b 3. ตวั ดำเนินกำรกำหนดค่ำ (Assignment Operators) เป็นสญั ลกั ษณ์ทใ่ี ชส้ าหรบั กาหนดค่า หรอื เปลย่ี นแปลงคา่ ใหแ้ ก่ตวั แปร ซง่ึ ตวั แปร ทางดา้ นซา้ ยมอื จะถูกกาหนดค่าจากขอ้ มลู หรอื ตวั แปรจากดา้ นขวามอื โดยสมมตุ วิ า่ ตวั แปร a = 10, b = 5, c = 9.0, d = 2.0, e = -3.5 ตำรำงท่ี 4.3 Assignment Operators Operator ควำมหมำย ตวั อย่ำง (a = 10, b = 5, c = 9.0, d = 2.0, e = -3.5) ห น้ า 101

= กาหนดค่า กาหนดค่าทางดา้ ขวามอื (ขวามอื ของผอู้ ่าน) ใหก้ บั ตวั ซา้ ย=ขวา (Simple assignment แปรทางดา้ นซา้ ยมอื เช่น a = b + c (a มคี า่ เท่ากบั operator) 14.0), d = 4.0 (d มคี ่าเท่ากบั 4.0) += บวกก่อนกาหนดค่า นาค่าทางซา้ ยมอื บวกทางขวาแลว้ เกบ็ ไวใ้ นตวั แปรทาง (Add and assignment ซา้ ยมอื เช่น a += b (a = a + b) ซง่ึ a มคี า่ เทา่ กบั 15 operator) -= ลบก่อนกาหนดค่า นาค่าทางซา้ ยมอื ลบทางขวาแลว้ เกบ็ ไวใ้ นตวั แปรทาง (Subtract and assignment ซา้ ยมอื เชน่ a -= b (a = a - b) ซง่ึ a มคี ่าเท่ากบั 5 operator) *= คณู ก่อนกาหนดค่า นาค่าทางซา้ ยคณู ทางขวาแลว้ เกบ็ ไวใ้ นตวั แปรทาง (Multiply and assignment ซา้ ยมอื เชน่ a *= b (a = a * b) ซง่ึ a มคี ่าเท่ากบั 50 operator) /= หารก่อนกาหนดคา่ นาคา่ ทางซา้ ยหารทางขวาแลว้ เกบ็ ไวใ้ นตวั แปรทาง (Divide and assignment ซา้ ยมอื เชน่ a /= b (a = a / b) ซง่ึ a มคี ่าเท่ากบั 2.0 operator) %= หารเอาเศษก่อนกาหนดคา่ นาคา่ ซา้ ยหารแบบเอาเศษดว้ ยคา่ ทางขวามอื แลว้ เกบ็ (Modulus and assignment เศษทไ่ี ดไ้ วท้ างซา้ ย เชน่ a %= b (a = a % b) ซง่ึ a มี operator) ค่าเท่ากบั 0 **= ยกกาลงั ก่อนกาหนดค่า นาคา่ ซา้ ยยกกาลงั ดว้ ยค่าทางขวามอื แลว้ ค่าทไ่ี ดไ้ วท้ าง (Exponent and assignment ซา้ ยมอื เชน่ a **= b (a = a ** b) ซง่ึ a มคี า่ เทา่ กบั operator) 10,000 //= หารเอาส่วนก่อนกาหนดค่า นาค่าซา้ ยหารเอาสว่ นดว้ ยคา่ ทางขวามอื แลว้ ค่าทไ่ี ดไ้ ว้ (Floor dividion and assigns ทางซา้ ยมอื เชน่ a //= b (a = a // b) ซง่ึ a มคี ่าเท่ากบั 2 a value) ตวั อยา่ ง Assignment Operators a = 21 b = 10 c=0 c=a+b print (\"Line 1 - Value of c is \", c) c += a print (\"Line 2 - Value of c is \", c) c *= a print (\"Line 3 - Value of c is \", c) c /= a print (\"Line 4 - Value of c is \", c) ห น้ า 102

c =2 c %= a print (\"Line 5 - Value of c is \", c) c **= a print (\"Line 6 - Value of c is \", c) c //= a print (\"Line 7 - Value of c is \", c) OUTPUT Line 1 - Value of c is 31 Line 2 - Value of c is 52 Line 3 - Value of c is 1092 Line 4 - Value of c is 52.0 Line 5 - Value of c is 2 Line 6 - Value of c is 2097152 Line 7 - Value of c is 99864 4. ตวั ดำเนินกำรระดบั บิต (Bitwise Operators) ก่อนทาความเขา้ ใจเกย่ี วกบั ตวั ดาเนินการระดบั บติ จาเป็นตอ้ งเขา้ ใจเกย่ี วกบั ตารางความจรงิ (Truth table) ของตวั ดาเนนิ การ AND (และ), OR (หรอื ), NOT (ไม่), XOR ก่อน ในตารางท่ี 4.4 ตำรำงท่ี 4.4 Truth table ค่ำในตวั แปร ตวั ดำเนินกำร NOT A A B A AND B A OR B A XOR B 1 1 00 0 00 01 0 11 0 0 10 0 11 11 1 10 จากตารางท่ี 4.4 มขี อ้ สงั เกตว่า AND ผลลพั ธม์ คี ่าเท่ากบั จรงิ (1) กต็ ่อเมอ่ื A และ B ตอ้ งเป็นจรงิ ทงั้ คู่ OR ผลลพั ธม์ คี า่ เทา่ กบั เทจ็ (0) กต็ ่อเมอ่ื A และ B ตอ้ งเป็นเทจ็ ทงั้ คู่ XOR ผลลพั ธม์ คี า่ เท่ากบั จรงิ (1) กต็ ่อเมอ่ื ค่า A และ B เหมอื นกนั เช่น A, B = 0 หรอื A, B = 1 และ ผลลพั ธม์ คี า่ เทา่ กบั เทจ็ (0) กต็ ่อเมอ่ื คา่ A และ B ต่างกนั เช่น A = 0, B = 1 หรอื A = 1, B = 0 เป็นตน้ Tips: การหาคา่ AND, OR, XOR ใหไ้ ดร้ วดเรว็ คอื กรณี AND ถา้ ค่าใดคา่ หน่งึ เป็น 0 จะทา ใหผ้ ลลพั ธเ์ ป็นเทจ็ ทนั ที กรณี OR ถา้ คา่ ใดคา่ หน่งึ เป็น 1 จะทาใหผ้ ลลพั ธเ์ ป็นจรงิ ทนั ที และ XOR คอื เหมอื นกนั ได้ 0 ต่างกนั ได้ 1 ห น้ า 103

Note: ภาษาไพธอนถอื ว่าค่าต่างๆ เหลา่ น้เี ป็นเทจ็ (0) คอื False, 0, None, สตรงิ ทม่ี คี ่าว่าง \"\", ขอ้ มลู ชนดิ list ทม่ี คี ่าเป็น [ ], ตวั แปร tuples ทว่ี ่าง () ตวั ดาเนินการระดบั บติ คอื ตวั ดาเนินการทก่ี ระทากบั ตวั ถกู กระทาในระดบั บติ ต่อบติ คลา้ ย ภาษาในระดบั ต่า ซง่ึ ทาใหโ้ ปรแกรมสามารถทางานไดเ้ รว็ ขน้ึ ซง่ึ มี 6 ตวั ดงั ตารางท่ี 4.5 สมมตุ ใิ ห้ a = 60 และ b = 13 เพอ่ื แสดงใหเ้ หน็ การทางานของตวั ดาเนินการระดบั บติ จาเป็นตอ้ งแสดงใหอ้ ยใู่ น เลขฐานสอง คอื a (60 ฐานสบิ ) = 0011 1100 (ฐานสอง) และ b = 0000 1101 ตวั อยา่ งการใช้ Bitwise ตวั ดาเนินการชนิด and  a & b = 0000 1100 0011 11110001and 0000 0000 1100 ตวั ดาเนินการชนดิ or  a | b = 0011 1101 0011 1100 0000 1101or 0011 1101 ตวั ดาเนนิ การชนิด xor  a ^ b = 0011 0001 0011 1100 0000 1101xor 0011 0001 ตวั ดาเนนิ การชนิด not  ~a = 1100 0011 0011 1100 not 1100 0011 ตำรำงท่ี 4.5 Bitwise Operators Operator ควำมหมำย ตวั อย่ำง (a = 60 และ b = 13) & and ระดบั บติ เป็นจรงิ กต็ ่อเมอ่ื ซา้ ยและขวาเป็นจรงิ เช่น a & b หรอื a | (Binary AND) and b ผลลพั ธค์ อื 0000 1100 (เทา่ กบั 12 ฐานสบิ ) or ระดบั บติ เป็นจรงิ กต็ ่อเมอ่ื ซา้ ยหรอื ขวาเป็นจรงิ เชน่ a | b หรอื a (Binary OR) or b ผลลพั ธค์ อื 0011 1101 (เท่ากบั 60) ห น้ า 104

^ XOR ระดบั บติ เป็นจรงิ กต็ ่อเมอ่ื ค่าดา้ นซา้ ยหรอื ขวามคี ่าต่างกนั a ^ b (Binary XOR) ผลลพั ธค์ อื 0011 0001 (เทา่ กบั 49) ~ คอมพลเี มนต์ ทาการสลบั บติ ขอ้ มลู โดยใชห้ ลกั การของ 2’s เช่น (~a) (Binary Ones Complement) ผลลพั ธค์ อื -61 << เล่อื นบติ ขอ้ มลู ไปทางซา้ ย ทาการเล่อื นบติ ขอ้ มลู ไปทางซา้ ยมอื ครงั้ ละ n บติ เชน่ a (Binary Left Shift) << 1 จะเล่อื นบติ ไปทางซา้ ย 1 บติ ผลลพั ธค์ อื 0111 1000 (120) ถา้ ตอ้ งการเลอ่ื นทลี ะ 2 บติ ทาไดโ้ ดย a << 2 = 1111 0000 (240) 0011 1100 0111 1000 >> เลอ่ื นบติ ขอ้ มลู ไปทางขวา ทาการเล่อื นบติ ขอ้ มลู ไปทางขวามอื ครงั้ ละ n บติ เชน่ a (Binary Right Shift) >> 1 จะเลอ่ื นบติ ไปทางขวา 1 บติ ผลลพั ธค์ อื 0001 1110 (30) ถา้ ตอ้ งการเล่อื นทลี ะ 2 บติ ทาไดโ้ ดย a >> 2 = 0000 1111 (15) 0011 1100 0001 1110 Tips: เมอ่ื ทาการเล่อื นบติ ไปทางซา้ ย << คอื การคณู และเลอ่ื นบติ ไปทางขวา >> คอื การหาร ตวั อยา่ งการใช้ Bitwise a = 60 # 60 = 0011 1100 b = 13 # 13 = 0000 1101 c=0 c=a&b # 12 = 0000 1100 print (\"Line 1 - Value of c is \", c) c=a|b # 61 = 0011 1101 print (\"Line 2 - Value of c is \", c) c=a^b # 49 = 0011 0001 print (\"Line 3 - Value of c is \", c) c = ~a # -61 = 1100 0011 print (\"Line 4 - Value of c is \", c) c = a << 2 # 240 = 1111 0000 print (\"Line 5 - Value of c is \", c) c = a >> 2 # 15 = 0000 1111 print (\"Line 6 - Value of c is \", c) OUTPUT Line 1 - Value of c is 12 Line 2 - Value of c is 61 Line 3 - Value of c is 49 Line 4 - Value of c is -61 Line 5 - Value of c is 240 ห น้ า 105

Line 6 - Value of c is 15 5. ตวั ดำเนินกำรทำงตรรกศำสตร์ (Logical Operators) ตวั ดาเนินทางตรรกศาสตร์ คอื ตวั ดาเนินการทใ่ี ชใ้ นการเปรยี บเทยี บ และตดั สนิ ใจ โดยมี เงอ่ื นไขตงั้ แต่ 2 เงอ่ื นไขมาเปรยี บเทยี บกนั ผลทไ่ี ดจ้ ากการเปรยี บเทยี บจะไดผ้ ลเป็น 2 กรณี คอื จรงิ ซง่ึ ใหค้ า่ เป็น 1 และเทจ็ ซง่ึ ใหค้ ่าเป็น 0 ในภาษาไพธอนมี 3 ตวั คอื and (และ) or (หรอื ) not (ไม่) ดงั ใน ตารางท่ี 4.6 โดยกาหนดให้ a = 10, b = 20, c=0 ตำรำงท่ี 4.6 Logical Operators Operator ควำมหมำย ตวั อย่ำง (a = 10, b = 20, c=0) and และ (and) เงอ่ื นไขจะเป็นจรงิ เมอ่ื คา่ ขอ้ มลู ดา้ นซา้ ยและขวาเป็น or (Logical AND) จรงิ ทงั้ คู่ เช่น a and b = จรงิ , a and c = เทจ็ เงอ่ื นไขจะเป็นจรงิ เมอ่ื คา่ ขอ้ มลู ดา้ นซา้ ยหรอื ขวาเป็น not or (หรอื ) จรงิ เช่น a or b = จรงิ , c or c = เทจ็ (Logical OR) ทาการเปลย่ี นค่าเป็นตรงกนั ขา้ ม ถา้ ค่าเป็น 0 เมอ่ื ใชต้ วั ดาเนินการ NOT จะทาใหค้ ่าทไ่ี ดเ้ ป็น 1 เชน่ not (a ไม่ and b) ผลลพั ธเ์ ป็น False, not 0 = True, not 1 = (Logical NOT) False, not False = True, not True = False ตวั อยา่ งการใช้ Logic Operations a = 10 b = 20 c=0 if (a and b): print(\"Line 1 - a and b are true\") else: print(\"Line 1 - Either a is not true or b is not true\") if (a or b): print(\"Line 2 - Either a is true or b is true or both are true\") else: print(\"Line 2 - Neither a is true nor b is true\") a=0 if (a and b): print(\"Line 3 - a and b are true\") else: print(\"Line 3 - Either a is not true or b is not true\") if (a or b): print(\"Line 4 - Either a is true or b is true or both are true\") else: ห น้ า 106

print(\"Line 4 - Neither a is true nor b is true\") if not(a and b): print(\"Line 5 - a and b are true\") else: print(\"Line 5 - Either a is not true or b is not true\") OUTPUT Line 1 - a and b are true Line 2 - Either a is true or b is true or both are true Line 3 - Either a is not true or b is not true Line 4 - Either a is true or b is true or both are true Line 5 - a and b are true ตวั อย่ำงกำรหำผลลพั ธท์ ำงตรรก กาหนดให้ A = 1, B = 2, C = 3 ถา้ (A != B) and ((A > C) or (C > B)) ผลลพั ธเ์ ป็นจรงิ หรอื เทจ็ แสดงไดด้ งั น้ี (A != B) and ((A > C) or (C > B)) True False True and or True True จากรปู ผลลพั ธท์ ไ่ี ดม้ คี ่าเป็นจรงิ 6. ตวั ดำเนินงำนกำรเป็นสมำชิก (Membership Operators) ไพธอนสรา้ งตวั ดาเนินการสมาชกิ เพม่ิ ขน้ึ 2 ตวั คอื in และ not in เพอ่ื ใชก้ ารทดสอบว่าอยใู่ น เซตของขอ้ มลู หรอื ไม่ ตวั อยา่ งขอ้ มลู ทต่ี รวจสอบ เชน่ ขอ้ มลู สายสตรงิ (strings) ลสิ ต์ (lists) ทบั เบล้ิ (tuples) แสดงในตารางท่ี 4.7 และกาหนดให้ list = [1, 2, 3, 4, 5 ], a = 2, b = 7 ตำรำงที่ 4.7 Membership operators Operator ควำมหมำย ตวั อย่ำง (list = [1, 2, 3, 4, 5 ], a = 2, b = 7) in อยใู่ น เป็นจรงิ เมอ่ื สามารถคน้ หาขอ้ มลู พบ แต่ถา้ ไมพ่ บจะให้ (in) ผลลพั ธเ์ ป็นเทจ็ เช่น a in list = จรงิ (True), 9 in list = เทจ็ (False), b in list = เทจ็ not in ไมอ่ ยใู่ น เป็นจรงิ เมอ่ื ไมส่ ามารถคน้ หาขอ้ มลู พบ แต่ถา้ พบจะให้ (not in) ผลลพั ธเ์ ป็นจรงิ เช่น a not in list = จรงิ (True), 9 not in list = เทจ็ (False) ตวั อยา่ งการใช้ Membership Operators ห น้ า 107

a = 10 b = 20 list = [1, 2, 3, 4, 5] if (a in list): print(\"Line 1 - a is available in the given list\") else: print(\"Line 1 - a is not available in the given list\") if (b not in list): print(\"Line 2 - b is not available in the given list\") else: print(\"Line 2 - b is available in the given list\") a=2 if (a in list): print(\"Line 3 - a is available in the given list\") else: print(\"Line 3 - a is not available in the given list\") Line 1 - a is not available in the given list Line 2 - b is not available in the given list OUTPUT Line 3 - a is available in the given list 7. ตวั ดำเนินกำรเอกลกั ษณ์ (Identity Operators) ตวั ดาเนินการเอกลกั ษณ์ใชส้ าหรบั เปรยี บเทยี บอ๊อปเจก็ ต์ 2 อ๊อปเจก็ ตใ์ ดๆ ทเ่ี กบ็ ใน หน่วยความจา มอี ยู่ 2 ตวั คอื is และ is not ซง่ึ คาสงั่ ดงั กล่าวนามาทดแทนคาสงั่ equal เพราะไพธอน มองว่าคาสงั่ equal ไมส่ อ่ื ความหมาย ดงั แสดงในตารางท่ี 4.8 ตำรำงท่ี 4.8 Identity operators Operator ควำมหมำย ตวั อย่ำง is เป็น, อย,ู่ คอื เป็นจรงิ เมอ่ื อ๊อปเจก็ ตท์ งั้ สองขา้ งเทา่ กนั หรอื เหมอื นกนั ทกุ ประการ เช่น 10 is 10 = True, 10 is 20 = False is not ไมเ่ ป็น, ไมใ่ ช่ เป็นจรงิ เมอ่ื อ๊อปเจก็ ตท์ งั้ สองขา้ งไมเ่ ทา่ กนั หรอื ไมเ่ หมอื นกนั ทุก ประการ เช่น 10 is not 10 = False, 10 is not 20 = True ตวั อยา่ ง Identity Operators a = 20 b = 20 if (a is b): print(\"Line 1 - a and b have same identity\") else: print(\"Line 1 - a and b do not have same identity\") if (id(a) == id(b)): print(\"Line 2 - a and b have same identity\") ห น้ า 108

else: print(\"Line 2 - a and b do not have same identity\") b = 30 if (a is b): print(\"Line 3 - a and b have same identity\") else: print(\"Line 3 - a and b do not have same identity\") if ( a is not b ): print(\"Line 4 - a and b do not have same identity\") else: print(\"Line 4 - a and b have same identity\") OUTPUT Line 1 - a and b have same identity Line 2 - a and b have same identity Line 3 - a and b do not have same identity Line 4 - a and b do not have same identity 8. ลำดบั ควำมสำคญั ของตวั ดำเนินกำร (Operators Precedence) Operators Precedence คอื การเรยี งลาดบั การดาเนินการทางเครอ่ื งหมายทางคณติ ศาสตร์ ว่า จะใหค้ วามสาคญั กบั เครอ่ื งหมายใดก่อนหรอื หลงั โดยจะเรยี งลาดบั ความสาคญั ดงั แสดงในตาราง 4.9 โดยลาดบั ทม่ี นี ยั สาคญั สงู สุดจะอยดู่ า้ นบนของตาราง ต่าสดุ อยดู่ า้ นลา่ ง (ทา้ ย) ตาราง เชน่ (…) มี นยั สาคญั สงู สดุ และ not หรอื or มนี ยั สาคญั ต่าสุด ตวั อยา่ งเช่น x = 7 + 3 * 2 ค่าทถ่ี ูกตอ้ งคอื x ตอ้ ง เท่ากบั 13 ไมใ่ ช่ 20 เน่อื งจาก * มลี าดบั ความสาคญั มากกว่า + ดงั นนั้ จะตอ้ งทาการคณู ระหว่าง 3 และ 2 ใหเ้ สรจ็ ก่อน หลงั จากนนั้ จงึ บวกดว้ ย 7 จงึ เป็นคาตอบทถ่ี กู ตอ้ ง (ถา้ นา 7 + 3 ก่อนจากนนั้ จงึ คณู ดว้ ย 2 จะเป็นคาตอบทผ่ี ดิ ) ถา้ ไมแ่ น่ใจกบั ลาดบั ของการประมวลผล ใหใ้ ชเ้ ครอ่ื งหมาย (…) ช่วย เช่น x = 7 + (3 * 2) เป็นตน้ ตำรำงที่ 4.9 Operators Precedence Operator คำอธิบำย วงเลบ็ มนี ยั สาคญั สงู สดุ ตอ้ งถูกกระทาก่อนเสมอ (…) ยกกาลงั ** คอมพลเี มนต์ การบวกก่อน และการลบก่อน เช่น a += b ~, +, - การคณู หาร มอด และการหารเอาสว่ น *, /, %, // การบวก และการลบ +, - การเลอ่ื นขวา (shift right) และเลอ่ื นทางซา้ ย (shift left) >>, << การ and ระดบั บติ & XOR และ OR ^, | น้อยกวา่ หรอื เท่ากบั น้อยกว่า มากกว่า และมากกวา่ หรอื เท่ากบั <=, <, >, >= ห น้ า 109

==, != เทา่ กบั และไมเ่ ท่ากบั =, %=, /=, //=, -=, การกาหนดค่า หารเอาเศษ หารเอาสว่ น ลบก่อนกาหนดคา่ บวกก่อน กาหนดค่า คณู ก่อนกาหนดค่า ยกกาลงั ก่อนกาหนดค่า +=, *=, **= ตวั ดาเนนิ การเอกลกั ษณ์ is, is not ตวั ดาเนินการสมาชกิ In, not in ไม่ (not), หรอื (or), และ (and) not, or, and Tips: จากสมการ x = 7 + 3 * 2 ถา้ ผเู้ ขยี นโปรแกรมมนั่ ใจอยา่ งแน่นอนวา่ ตอ้ งทาการบวก 7 และ 3 ก่อน แลว้ นาผลลพั ธท์ ไ่ี ดไ้ ปคณู กบั 2 ใหใ้ ช้ (…) ครอบนิพจน์ทต่ี อ้ งการใหก้ ระทาก่อน เชน่ x = (7 + 3) * 2 ผลลพั ธท์ ไ่ี ด้ คอื 20 Note: เมอ่ื ตวั ดาเนินการมนี ัยสาคญั เท่ากนั เชน่ * กบั / ไพธอนจะประมวลผลจากซา้ ยไปขวา เสมอ เชน่ 5 * 6 / 4  (5 * 6) / 4 ผลลพั ธท์ ไ่ี ดค้ อื 7.5 ตวั อยา่ ง Operators Precedence a = 20 b = 10 c = 15 d=5 e=0 e = (a + b) * c / d # (30 * 15)/5 print (\"Value of (a + b) * c / d is \", e) e = ((a + b) * c) / d # (30 * 15 )/5 print (\"Value of ((a + b) * c) / d is \", e) e = (a + b) * (c / d); # (30) * (15/5) print (\"Value of (a + b) * (c / d) is \", e) e = a + (b * c) / d; # 20 + (150/5) print (\"Value of a + (b * c) / d is \", e) e = a + b ** d - c; # 100000 + 20 - 15 print (\"Value of a + b ** d - c is \", e) OUTPUT Value of (a + b) * c / d is 90.0 Value of ((a + b) * c) / d is 90.0 Value of (a + b) * (c / d) is 90.0 Value of a + (b * c) / d is 50.0 Value of a + b ** d - c is 100005 จบบทที่ 5 ห น้ า 110

บทท่ี 6 เง่ือนไข การตดั สินใจ การควบคมุ ทิศทาง และการทาซา้ (Conditions, Decisions, Control flows and Loop) เมอ่ื กลา่ วถงึ ปัญหาไมว่ า่ จะเป็นปัญหาเกย่ี วกบั มนุษยห์ รอื คอมพวิ เตอรก์ ต็ าม สง่ิ ทห่ี ลกี เลย่ี ง ไมไ่ ดก้ ค็ อื จะตอ้ งพบเจอกบั เงอ่ื นไข (Conditions) และตอ้ งทาการตดั สนิ ใจ (Decisions) อยเู่ สมอๆ ยกตวั อยา่ งเชน่ เมอ่ื ตอ้ งการเดนิ ทางไปทแ่ี ห่งหน่งึ ระหว่างการเดนิ ทางพบทางแยกซา้ ย (สมมตใิ หเ้ ป็น ตวั แปร A) และขวา (ตวั แปร B) ผอู้ ่านจะเลอื กไปทางไหนด?ี คาตอบนนั้ จะขน้ึ อยกู่ บั ว่าเงอ่ื นไขทางใด ดกี ว่ากนั สมมตติ งั้ เงอ่ื นไขไวว้ า่ พจิ ารณาจากระยะทาง ดงั นนั้ เงอ่ื นไขทใ่ี ชต้ ดั สนิ ใจ คอื เมอ่ื เสน้ ทางซา้ ย (A) น้อยว่า เสน้ ทางขวา (B) แลว้ เลอื กไปทางซา้ ย ถา้ ไมเ่ ช่นนัน้ เลอื กไปทางขวา เมอ่ื ทาการแปลงคาพดู ทก่ี ล่าวมาน้เี ป็น Pseudo code ไดด้ งั น้ี IF A < B THEN Go to left way ELSE Go to right way สาหรบั การควบคุมทศิ ทาง (Control flows) คอื คาสงั่ หรอื กฎเกณฑท์ ใ่ี ชส้ าหรบั ควบคมุ ทศิ ทางการ ทางานเพอ่ื ใหบ้ รรลุเป้าหมาย (ในตวั อยา่ งคอื สงั่ ใหไ้ ปทางซา้ ยหรอื ขวา) แต่การจะบรรลุเป้าหมายใหไ้ ด้ นนั้ อาจจะทาไมส่ าเรจ็ ในครงั้ เดยี ว จาเป็นตอ้ งทาซา้ หลายๆ ครงั้ (Loop) สงั เกตเหน็ วา่ เงอ่ื นไข การตดั สนิ ใจ การควบคุมทศิ ทางและการทาซ้า เป็นสงิ่ ทอ่ี ยใู่ กลต้ วั เราและ พบเจอในชวี ติ ประจาวนั เสมอๆ ไมว่ ่าจะอยทู่ ใ่ี ดกต็ าม การเขยี นโปรแกรมกเ็ ช่นเดยี วกนั พยายามทจ่ี ะ จาลองปัญหาต่างๆ ในชวี ติ ประจาวนั มาประมวลผลกบั คอมพวิ เตอร์ เพราะคอมพวิ เตอรส์ ามารถทางานท่ี มคี วามซบั ซอ้ นไดเ้ รว็ กว่ามนุษยม์ าก ห น้ า 111

ในภาษาไพธอนแบง่ ลกั ษณะการควบคุมการทางานของโปรแกรมออกเป็น 2 ประเภทหลกั ๆ คอื การควบคุมทศิ ทางแบบเลอื กทาและควบคุมทศิ ทางแบบวนรอบหรอื ทาซา้ 1. การควบคมุ ทิศทางแบบเลือกทา (Decisions, Choice, Selection) การควบคมุ ทศิ ทางแบบเลอื กทาคอื การเขยี นโปรแกรมใหม้ กี ารตดั สนิ ใจ สามารถเลอื กไดว้ ่าจะ ทา หรอื ไม่ทาตามคาสงั่ ขน้ึ อยกู่ บั เงอ่ื นไขทก่ี าหนดขน้ึ มา โดยคาสงั่ สาหรบั การควบคมุ ทศิ ทางแบบเลอื ก ทาในภาษาไพธอนมเี พยี งคาสงั่ เดยี วคอื if โดยแบ่งออกเป็น 3 ชนดิ คอื if, if...else และ nested if ดงั ต่อไปน้ี Note: ภาษาไพธอนไมส่ นันสนุนการควบคมุ ทศิ ทางแบบ switch…case การควบคมุ ทิศทางแบบ if คาสงั่ if ใชใ้ นกรณที ม่ี ที างเลอื กใหท้ างานอยเู่ พยี งทางเลอื กเดยี ว โดยถา้ ตรวจสอบเงอ่ื นไขแลว้ เป็นจรงิ จงึ จะทางานตามคาสงั่ รปู แบบการเรยี กใชค้ าสงั่ if แสดงไดด้ งั น้ี if condition: statement(s) condition คอื เงอ่ื นไขทก่ี าหนดขน้ึ เพอ่ื ใชต้ ดั สนิ วา่ จะทาหรอื ไมท่ าตามคาสงั่ โดยเงอ่ื นไขจะ เขยี นไวภ้ ายในเครอ่ื งหมาย ( ) หรอื ไมก่ ไ็ ด้ ซง่ึ เงอ่ื นไขอาจจะอยใู่ นรปู ของนิพจน์ การคานวณ เปรยี บเทยี บ หรอื เป็นค่าของตวั แปรกไ็ ดแ้ ละตามดว้ ยเครอ่ื งหมาย : statement(s) คอื คาสงั่ หรอื ชุดของคาสงั่ ทจ่ี ะใหท้ างาน เมอ่ื ผลการตรวจสอบเงอ่ื นไขเป็นจรงิ ใน ภาษาไพธอนไมจ่ าเป็นตอ้ งเขยี นคาสงั่ (statement) ไวภ้ ายใน { } เหมอื นภาษาซหี รอื จาวา แต่ไพธอนใช้ การยอ่ หน้าเพ่อื แสดงขอบเขตของคาสงั่ หรอื ชดุ คาสงั่ แทน เช่น if condition: statement 1 statement 2 … statement n คาสงั่ แบบมเี งอ่ื นไข if เป็นคาสงั่ แบบเลอื กทา โดยการเปรยี บเทยี บเงอ่ื นไขนพิ จน์ทาง ตรรกศาสตร์ ผลลพั ธท์ ไ่ี ดจ้ ะมคี า่ จรงิ กบั เทจ็ เท่านนั้ ถา้ เงอ่ื นไขเป็นจรงิ แลว้ โปรแกรมจะเลอื กทาคาสงั่ ทอ่ี ยหู่ ลงั เครอ่ื งหมาย : ทนั ที แต่ถา้ เป็นเทจ็ จะไมม่ กี ารประมวลผลใดๆ เกดิ ขน้ึ เมอ่ื เปรยี บเทยี บกบั แผนผงั จาลองการทางานจะมลี กั ษณะดงั ภาพท่ี 6.1 และตวั อยา่ งโปรแกรมท่ี 6.1 ห น้ า 112

Caution! หลงั คาสงั่ if, else, for, while และ function อยา่ ลมื เครอ่ื งหมาย : เป็นอนั ขาด Start if condition is True condition if condition statement(s) is False End รปู ที่ 6.1 แสดงแผนภาพจาลองการทางานของคาสงั่ if Note: ในภาษาไพธอนถอื วา่ ค่าทไ่ี มใ่ ช่ศูนย์ (0) และคา่ ทไ่ี มใ่ ช่ null เป็นคา่ จรงิ และถา้ ขอ้ มลู เป็นศูนย์ หรอื null จะอนุมานวา่ เป็นเทจ็ ทนั ที ตวั อยา่ งโปรแกรมท่ี 6.1 Program Example 6.1: if 1 # If command testing 2 var1 = 100; 3 if var1: #This condition is True 4 print (\"1 - Got a true expression value\") 5 print (var1) 6 var2 = 0; 7 if var2: #This condition is False 8 print (\"2 - Got a true expression value\") 9 print (var2) 10 print(\"Good bye!\") 1 - Got a true expression value 100 OUTPUT Good bye! จากตวั อยา่ งโปรแกรมท่ี 6.1 เรมิ่ ตน้ บรรทดั ท่ี 2 เป็นกาหนดคา่ เรมิ่ ตน้ ใหก้ บั ตวั แปร var1 = 100 บรรทดั ท่ี 3 ทาการตรวจสอบดว้ ยคาสงั่ if ว่า var1 เป็นจรงิ หรอื ไม่ (ไพธอนตคี วามหมายวา่ null และ 0 เท่านัน้ ทเ่ี ป็นเทจ็ ) ผลจากการเปรยี บเทยี บปรากฎว่าเป็นจรงิ ดงั นนั้ โปรแกรมจงึ เล่อื นไปทาคาสงั่ หลงั if ในบรรทดั ท่ี 4 และ 5 โดยพมิ พข์ อ้ ความ \"1 - Got a true expression value\" และ 100 (ค่าทเ่ี กบ็ อยใู่ น ตวั แปร var1) ต่อจากนนั้ โปรแกรมจงึ เล่อื นมาทางานต่อไปในบรรทดั ท่ี 6 โดยกาหนดตวั แปร var2 มคี ่า เทา่ กบั 0 ในบรรทดั ท่ี 7 ทาการตรวจสอบเงอ่ื นไขวา่ var2 เป็นจรงิ หรอื ไม่ ผลทไ่ี ดค้ อื เป็นเทจ็ จงึ ทาให้ โปรแกรมไมเ่ ขา้ ไปประมวลผลคาสงั่ หลงั if (ชดุ ของคาสงั่ หลงั if มสี องคาสงั่ คอื print โดยสงั เกตจากการ ห น้ า 113

ยอ่ หน้าวา่ ทงั้ สองคาสงั่ ยอ่ หน้าตรงกนั ) แต่จะขา้ มไปทางานบรรทดั ท่ี 10 โดยสงั่ พมิ พข์ อ้ ความว่า \"Good bye!\" แทน พรอ้ มกบั จบการทางานของโปรแกรม โจทยต์ วั อย่างและผงั งาน จงเขยี นโปรแกรมคดิ สว่ นลดราคาสนิ คา้ และภาษมี ลู คา่ เพมิ่ โดยรบั ช่อื และราคาสนิ คา้ จาก แป้นพมิ พ์ ถา้ ราคาสนิ คา้ เกนิ 500 บาท ทางรา้ นจะลดราคาให้ 3% จากนนั้ จงึ คานวณหาภาษมี ลู ค่าเพมิ่ ในอตั รา 7% ผลลพั ธท์ ต่ี อ้ งการคอื พมิ พช์ ่อื สนิ คา้ พรอ้ มกบั ราคาสนิ คา้ ทค่ี ดิ ภาษมี ลู ค่าเพม่ิ แลว้ ตวั อยา่ งอนิ พตุ : Enter goods name : FAN ตวั อยา่ งเอาตพ์ ตุ : Enter price of FAN (Baht) : 350 The price of FAN (inc VAT 7%) is : 374.5 ผงั งานของโปรแกรมคดิ สว่ นลดราคาสนิ คา้ เขยี นไดด้ งั รปู ท่ี 6.2 Start Read(Name , Price) False Price>=500 True Temp = Price*0.03 Price = Price-Temp VAT = Price*0.07 Price = Price+VAT Print Name, Price End รปู ท่ี 6.2 แสดงผงั งานการคานวณการลดราคาและภาษมี ลู ค่าเพมิ่ ตวั อยา่ งโปรแกรมท่ี 6.2 การคานวณการลดราคาและภาษมี ลู คา่ เพม่ิ Program Example 6.2: Discount price and VAT ห น้ า 114

1 #Calculating discount price and VAT 2 name = input(\"Enter goods name :\") 3 price = float(input(\"Enter price of %s :\" %name)) 4 if price >= 500: 5 temp = price * 0.03 6 price = price – temp 7 VAT = price * 0.07 8 price = price + VAT 9 print(\"The price of %s (inc VAT 7%%) is %.2f %s\"%(name, price, \"Baht.\")) Enter goods name :FAN Enter price of FAN :550.75 OUTPUT The price of FAN (inc VAT 7%) is 571.62 Baht. จากตวั อยา่ งโปรแกรมท่ี 6.2 ในบรรทดั ท่ี 2 เรมิ่ ตน้ รบั ขอ้ มลู คอื ชอ่ื ของสนิ คา้ ทต่ี อ้ งการคดิ ราคา โดย เกบ็ ไวใ้ นตวั แปร name ขนั้ ตอนต่อไปบรรทดั ท่ี 3 โปรแกรมจะรอรบั การป้อนขอ้ มลู ราคาสนิ คา้ (เป็นเลข จานวนจรงิ ) ราคาสนิ คา้ จะถูกแปลงค่าเป็น float และเกบ็ ไวใ้ นตวั แปร price บรรทดั ท่ี 4 โปรแกรมจะ เปรยี บเทยี บค่าว่าราคาสนิ คา้ มากกว่า 500 หรอื ไม่ ถา้ มากกว่าจะประมวลคาสงั่ หลงั if ในบรรทดั ท่ี 5 และ 6 เพอ่ื คานวณส่วนลดของสนิ คา้ ให้ 3% เมอ่ื คานวณส่วนลดเสรจ็ แลว้ โปรแกรมจะคานวณ ภาษมี ลู ค่าเพม่ิ ต่อในบรรทดั ท่ี 7 และพมิ พผ์ ลลพั ธค์ อื ราคาสนิ คา้ ทไ่ี ดร้ บั สว่ นลด 3% รวมกบั ภาษมี ลู ค่าเพม่ิ แลว้ ออกทางจอภาพในบรรทดั ท่ี 9 การควบคมุ ทิศทางแบบ if…else คาสงั่ if-else จะใชใ้ นกรณที ม่ี ที างเลอื กใหท้ างาน 2 ทางเลอื กขน้ึ ไป โดยการทางานของคาสงั่ if- else จะเรมิ่ จากการตรวจสอบเงอ่ื นไข ถา้ ผลออกมาเป็นจรงิ จะทางานตามคาสงั่ ทอ่ี ยหู่ ลงั if แต่ถา้ ผล ของการตรวจสอบเงอ่ื นไขเป็นเทจ็ ใหท้ างานตามคาสงั่ ทอ่ี ยหู่ ลงั else แทน รปู แบบคาสงั่ if-else แสดง ไดด้ งั น้ี if condition: statement(s) else: statement(s) แผนผงั จาลองการทางานจะมลี กั ษณะดงั ภาพท่ี 6.3 และตวั อยา่ งโปรแกรมท่ี 6.3 ห น้ า 115

Start if condition if condition is False is True condition else code if code End รปู ที่ 6.3 แสดงแผนภาพจาลองการทางานของคาสงั่ if…else ตวั อยา่ งโปรแกรมท่ี 6.3 Program Example 6.3: if…else 1 var1 = 100 2 if var1: #This condition is True 3 print (\"1 - Got a true expression value\") 4 print (var1) 5 else: 6 print (\"1 - Got a false expression value\") 7 print (var1) 8 var2 = 0 9 if var2: #This condition is False 10 print (\"2 - Got a true expression value\") 11 print (var2) 12 else: 13 print (\"2 - Got a false expression value\") 14 print (var2) 15 print (\"Good bye!\") 1 - Got a true expression value 100 OUTPUT 2 - Got a false expression value 0 Good bye! จากตวั อยา่ งโปรแกรมท่ี 6.3 บรรทดั ท่ี 1 กาหนดค่าใหต้ วั แปร var1 เท่ากบั 100 เมอ่ื ทดสอบเงอ่ื นไข ดว้ ยคาสงั่ if ในบรรทดั ท่ี 2 ใหผ้ ลลพั ธเ์ ป็นจรงิ เพราะ var1 ไมเ่ ทา่ กบั 0 หรอื null ดงั นนั้ โปรแกรมจะ พมิ พข์ อ้ ความว่า \"1 - Got a true expression value\" (บรรทดั ท่ี 3) และพมิ พค์ ่าของ Var1 เท่ากบั 100 (บรรทดั ท่ี 4) ออกทางจอภาพ จากนนั้ โปรแกรมจะเล่อื นมาทาคาสงั่ ในบรรทดั ท่ี 8 คอื กาหนดค่าตวั แปร var2 เท่ากบั 0 และเล่อื นมาเปรยี บเทยี บในเงอ่ื นไขดว้ ยคาสงั่ if อกี ครงั้ ในบรรทดั ท่ี 9 ผลปรากฎวา่ เงอ่ื นไขเป็นเทจ็ เพราะ var2 เป็นเทจ็ (var2 = 0) ส่งผลใหโ้ ปรแกรมขา้ มไปทางานบรรทดั ท่ี 13 และ 14 หลงั คาสงั่ else โดยพมิ พข์ อ้ ความ \"2 - Got a false expression value\" และ var2 เท่ากบั 0 ออกทาง ห น้ า 116

จอภาพ ในบรรทดั สุดทา้ ยของโปรแกรมจะสงั่ พมิ พ์ Good bye เสมอ เพราะคาสงั่ ดงั กล่าวไมไ่ ดอ้ ยู่ภายใน ขอบเขตของคาสงั่ if…else (สงั เกตไดจ้ ากการยอ่ หน้าของโปรแกรม) โจทยต์ วั อย่างและผงั งาน จงเขยี นโปรแกรมตรวจสอบว่าตวั เลขจานวนเตม็ ใดๆ เป็นเลขคู่หรอื เลขค่ี ตวั อยา่ งอนิ พุต: Enter Integer number : 35 ตวั อยา่ งเอาตพ์ ตุ : 35 is Odd ผงั งานของโปรแกรมตรวจสอบเลขจานวนค่หู รอื ค่ี ดงั รปู ท่ี 6.4 Start Read(Num) False Num%2 = 0 True Print Odd Print Even End รปู ท่ี 6.4 ผงั งานของโปรแกรมตรวจสอบเลขจานวนคค่ี ู่ ตวั อยา่ งโปรแกรมท่ี 6.4 โปรแกรมตรวจสอบเลขจานวนคค่ี ู่ Program Example 6.4: Odd or Even 1 # Testing Odd or Even 2 Num = int(input(\"Enter Integer Number :\")) 3 if Num % 2 != 0: 4 print(Num,\" is Odd.\") 5 else: 6 print(Num,\" is Even.\") 7 print(\"Good bye!\") Enter Integer Number :35 35 is Odd. OUTPUT Good bye! Enter Integer Number :22 22 is Even. Good bye! จากโปรแกรมท่ี 6.4 บรรทดั ท่ี 2 โปรแกรมรบั ขอ้ มลู เป็นตวั เลขจานวนเตม็ บวกจากแป้นพมิ พม์ าเกบ็ ไวใ้ น ห น้ า 117

ตวั แปร Num ขนั้ ตอนต่อไปบรรทดั ท่ี 3 ทาการหารเอาเศษ (mod) ค่า Num ดว้ ย 2 ถา้ ผลทไ่ี ดเ้ ป็น 0 แสดงวา่ เป็นเลขคู่ จะทาคาสงั่ หลงั else ในบรรทดั ท่ี 6 โดยพมิ พข์ อ้ ความวา่ \"X is Even.\" โดยท่ี x คอื ตวั เลขจานวนเตม็ ใดๆ แต่ถา้ ผลทไ่ี ดไ้ มเ่ ท่ากบั 0 แสดงวา่ เป็นเลขค่ี โปรแกรมทาคาสงั่ หลงั if ในบรรทดั ท่ี 4 โดยพมิ พข์ อ้ ความ \"X is Odd.\" สดุ ทา้ ยโปรแกรมจะสงั่ พมิ พ์ \"Good bye!\" ในบรรทดั ท่ี 7 ทุกครงั้ เสมอก่อนจบโปรแกรม การควบคมุ ทิศทางแบบ if…elif โครงสรา้ งการทางานแบบ if…elif มรี ปู แบบคาสงั่ ดงั น้ี if condition 1: statement(s) elif condition 2: statement(s) … elif condition n: statement(s) else: statement(s) คาสงั่ รปู แบบ if..elif น้ี เป็นคาสงั่ เปรยี บเทยี บเงอ่ื นไขซอ้ นเงอ่ื นไข โดยเรม่ิ ตน้ เปรยี บเทยี บ เงอ่ื นไขท่ี 1 (condition 1) ถา้ เป็นเทจ็ จะเล่อื นไปเปรยี บเทยี บกบั เงอ่ื นไขท่ี 2 (condition 2) ถา้ ผลลพั ธ์ การเปรยี บเทยี บกบั เงอ่ื นไขท่ี 2 เป็นเทจ็ จงึ เล่อื นไปเปรยี บเทยี บเงอ่ื นไขท่ี 3 (condition 3) ต่อไปเรอ่ื ยๆ จนกวา่ จะหมดคาสงั่ การเปรยี บเทยี บ (condition n) แต่ถา้ ผลการเปรยี บเทยี บเงอ่ื นไขใดๆ แลว้ ผลลพั ธ์ เป็นจรงิ จะประมวลผลคาสงั่ หรอื กลมุ่ ของคาสงั่ หลงั เครอ่ื งหมาย : ของเงอ่ื นไขนนั้ ๆ เมอ่ื เสรจ็ สน้ิ การ ประมวลผลคาสงั่ แลว้ ถอื วา่ สน้ิ สดุ การเปรยี บเทยี บเงอ่ื นไขในกลุม่ นนั้ และจบการทางาน แผนผงั จาลอง การทางานจะมลี กั ษณะดงั ภาพท่ี 6.5 และตวั อยา่ งโปรแกรมท่ี 6.5 ห น้ า 118

Start if code of True Condition 1 False condition 1 if code of True False condition 2 Condition 2 if code of True False condition 3 Condition 3 if code of True Condition False Default else condition n n code End รปู ที่ 6.5 แสดงแผนภาพจาลองการทางานของคาสงั่ if…elif ตวั อยา่ งโปรแกรมท่ี 6.5 Program Example 6.5: if…elif 1 var = 100 2 if var == 200: 3 print (\"1 - Got a true expression value\") 4 print (var) 5 elif var == 150: 6 print (\"2 - Got a true expression value\") 7 print (var) 8 elif var == 100: 9 print (\"3 - Got a true expression value\") 10 print (var) 11 else: 12 print (\"4 - Got a false expression value\") 13 print (var) 14 print (\"Good bye!\") 3 - Got a true expression value 100 OUTPUT Good bye! จากตวั อยา่ งโปรแกรมท่ี 6.5 บรรทดั ท่ี 1 กาหนดคา่ ใหต้ วั แปร var เท่ากบั 100 ต่อจากนนั้ โปรแกรม เล่อื นมาทางานบรรทดั ท่ี 2 เพอ่ื เปรยี บเทยี บเงอ่ื นไขวา่ var เทา่ กบั 200 จรงิ หรอื ไม่ ผลลพั ธท์ ไ่ี ดเ้ ป็นเทจ็ จงึ เล่อื นมาเปรยี บเทยี บในบรรทดั ท่ี 5 ผลทไ่ี ดม้ คี ่าเป็นเทจ็ (ตวั แปร var มคี ่าไมเ่ ท่า 150) โปรแกรมจงึ เล่อื นมาเปรยี บเทยี บเงอ่ื นไขต่อในบรรทดั ท่ี 8 ซง่ึ var มคี ่าเท่ากบั 100 เป็นจรงิ โปรแกรมจงึ ทาคาสงั่ ห น้ า 119

หลงั : ในบรรทดั ท่ี 9 และ 10 โดยการพมิ พข์ อ้ ความวา่ \"3 - Got a true expression value\" และ 100 ออกทางจอภาพ ต่อจากนนั้ โปรแกรมจะกระโดดขา้ มไปพมิ พข์ อ้ ความว่า \"Good bye!\" ในบรรทดั ท่ี 14 แลว้ จบการทางาน โจทยต์ วั อย่างและผงั งาน จงเขยี นโปรแกรมคานวณเกรดของนกั เรยี น โดยรบั คะแนนจากแป้นพมิ พ์ โดยมเี งอ่ื นไขการตดั เกรดดงั น้ี ช่วงคะแนน เกรดท่ีได้ 80 - 100 A 75 - 79 B+ 70 - 74 B 65 - 69 C+ 60 - 64 C 55 - 59 D+ 50 - 54 D 0 - 49 F ตวั อยา่ งอนิ พุต: Enter your score : 73 ตวั อยา่ งเอาตพ์ ุต: Your grade is B ผงั งานของโปรแกรมคานวณเกรด ดงั รปู ท่ี 6.6 ห น้ า 120

Start Print A True Score >= 80 False True False Print B+ Score >= 75 True False Print B Score >= 70 True False Print C+ Score >= 65 True False Print C Score >= 60 True False Print D+ Score >= 55 True False Print D Score >= 50 Print F End รปู ที่ 6.6 แสดง flowchart การทางานของโปรแกรมคานวณเกรด ตวั อยา่ งโปรแกรมท่ี 6.6 โปรแกรมคานวณเกรด Program Example 6.6: Grade evaluation 1 Score = float(input(\"Enter your score :\")) 2 Msg = \"Your grade is \"; 3 if Score >= 80: 4 print(Msg + \"A\") 5 elif Score >= 75: 6 print(Msg + \"B+\") 7 elif Score >= 70: 8 print(Msg + \"B\") 9 elif Score >= 65: 10 print(Msg + \"C+\") 11 elif Score >= 60: 12 print(Msg + \"C\") 13 elif Score >= 55: 14 print(Msg + \"D+\") 15 elif Score >= 50: 16 print(Msg + \"D\") 17 else: 18 print(Msg + \"F\") 19 print(\"Good bye!\") ห น้ า 121

Enter your score :40 Your grade is F OUTPUT Good bye! Enter your score :75.55 Your grade is B+ Good bye! Enter your score :82 Your grade is A Good bye! โปรแกรมตวั อยา่ งท่ี 6.6 เรม่ิ ตน้ อ่านค่าขอ้ มลู จานวนจรงิ จากแป้นพมิ พใ์ นบรรทดั ท่ี 1 แลว้ เกบ็ ไว้ ในตวั แปรช่อื Score ต่อจากนนั้ บรรทดั ท่ี 2 โปรแกรมประกาศตวั แปรชนิดสตรงิ ชอ่ื Msg มขี อ้ ความคอื \"Your grade is \" สมมตวิ า่ ผใู้ ชง้ านป้อนขอ้ มลู เขา้ มาคอื 75.5 โปรแกรมจะทาการเปรยี บเทยี บกบั เงอ่ื นไขแรกในบรรทดั ท่ี 3 ผลลพั ธท์ ไ่ี ดจ้ ะเป็นเทจ็ (75.5 >= 80) ทาใหโ้ ปรแกรมเล่อื นมาทางานใน บรรทดั ท่ี 5 เพอ่ื เปรยี บเทยี บคา่ ใน Score กบั เงอ่ื นไขท่ี 2 (Score >= 75) ซง่ึ ใหผ้ ลลพั ธเ์ ป็นจรงิ โปรแกรมจะประมวลผลคาสงั่ หลงั elif ในบรรทดั ท่ี 6 โดยพมิ พข์ อ้ ความว่า \"Your grade is B+\" เมอ่ื พมิ พข์ อ้ ความดงั กลา่ วเสรจ็ เรยี บรอ้ ยแลว้ โปรแกรมจะกระโดดไปทางานบรรทดั สดุ ทา้ ย (บรรทดั ท่ี 19) เพอ่ื พมิ พข์ อ้ ความ Good bye! และจบโปรแกรม การควบคมุ ทิศทางแบบ nested if โครงสรา้ งการทางานแบบ nested if มรี ปู แบบคาสงั่ ดงั น้ี if condition (1): if condition (1.1): if condition (1.1.1): statement(s) elif (1.1.1) condition (1.1.2): statement(s) else (1.1.1): statement(s) else (1.1): statement(s) else (1): statement(s) การทางานของ nested if นนั้ จะมลี กั ษณะเงอ่ื นไงซอ้ นเงอ่ื นไขไปเรอ่ื ยๆ ขน้ึ อยกู่ บั ความซบั ซอ้ น ของโจทยป์ ัญหา จากโครงสรา้ งการทางานของ nested if ขา้ งบน เรมิ่ ตน้ จากการเปรยี บเทยี บเงอ่ื นไข แรก condition (1): ถา้ เป็นเทจ็ จะทาคาสงั่ หลงั else (1): แต่ถา้ เป็นจรงิ โปรแกรมจะทาคาสงั่ หลงั ห น้ า 122

เครอ่ื งหมาย : โดยหลงั เครอ่ื งหมาย : มเี งอ่ื นไขท่ี 2 condition (1.1) ทต่ี อ้ งตรวจสอบอกี ครงั้ ถา้ ผลจาก การเปรยี บเทยี บแลว้ ปรากฏว่าเป็นเทจ็ โปรแกรมจะทาคาสงั่ หลงั else (1.1): แต่ถา้ ผลการเปรยี บเทยี บ เป็นจรงิ จะเปรยี บเทยี บกบั คาสงั่ if ในครงั้ ท่ี 3 condition (1.1.1) แต่ถา้ ผลการเปรยี บเทยี บในครงั้ ท่ี 3 น้ี ผลลพั ธเ์ ป็นเทจ็ จะทาการเปรยี บเทยี บอกี เป็นครงั้ ท่ี 4 กบั เงอ่ื นไข condition (1.1.2): ถา้ ผลการ เปรยี บเทยี บในครงั้ ท่ี 4 น้เี ป็นเทจ็ จะประมวลผลคาสงั่ หลงั else (1.1.1): แต่ถา้ เป็นจรงิ จะทาการ ประมวลผลคาสงั่ หลงั condition (1.1.2): เป็นตน้ สาหรบั แผนผงั จาลองการทางานจะมลี กั ษณะดงั ภาพท่ี 6.7 และตวั อยา่ งโปรแกรมท่ี 6.7 Start False Condition 1 True False False True True Condition 3 Condition 2 Statement(s) Statement(s) Statement(s) End รปู ที่ 6.7 แสดงแผนภาพจาลองการทางานของคาสงั่ nested if ตวั อยา่ งโปรแกรมท่ี 6.7 Program Example 6.7: nested if 1 var = 100 2 if var < 200: 3 print(\"Expression value is less than 200\") 4 if var == 150: 5 print(\"Which is 150\") 6 elif var == 100: 7 print(\"Which is 100\") 8 elif var == 50: 9 print(\"Which is 50\") 10 elif var < 50: 11 print(\"Expression value is less than 50\") 12 else: 13 print (\"Could not find true expression\") 14 print(\"Good bye!\") ห น้ า 123

Expression value is less than 200 Which is 100 OUTPUT Good bye! จากโปรแกรมท่ี 6.7 บรรทดั ท่ี 1 กาหนดค่าเรมิ่ ตน้ ใหต้ วั แปร var เทา่ กบั 100 จากนนั้ บรรทดั ท่ี 2 ทา การเปรยี บเทยี บเงอ่ื นไข (var < 200) ผลปรากฎวา่ เป็นจรงิ ทาใหโ้ ปรแกรมพมิ พข์ อ้ ความว่า \"Expression value is less than 200\" (บรรทดั ท่ี 3) ออกทางจอภาพ ลาดบั ถดั ไปในบรรทดั ท่ี 4 โปรแกรมทาการเปรยี บเทยี บเงอ่ื นไข if var == 150 ผลลพั ธค์ อื เป็นเทจ็ โปรแกรมจงึ กระโดดขา้ ม บรรทดั ท่ี 5 ไปทาการเปรยี บเทยี บเงอ่ื นไข elif ต่อในบรรทดั ท่ี 6 ผลจากการเปรยี บเทยี บมคี ่าเป็นจรงิ (var == 100) ดงั นนั้ ในบรรทดั ท่ี 7 โปรแกรมจงึ สงั่ พมิ พข์ อ้ ความ \"Which is 100\" หลงั จากพมิ พข์ อ้ ความ เสรจ็ โปรแกรมจะกระโดดไปทาคาสงั่ บรรทดั ท่ี 14 เพ่อื พมิ พข์ อ้ ความ \"Good bye!\" แลว้ จบการทางาน โจทยต์ วั อยา่ งและผงั งาน จงเขยี นโปรแกรมตรวจสอบเลขจานวนเตม็ หรอื จรงิ ทน่ี ้อยทส่ี ดุ 3 ค่า โดยรบั ขอ้ มลู จากแป้นพมิ พ์ ตวั อยา่ งอนิ พตุ : Enter the 1’st number : 73 Enter the 2’nd number : 35.7 Enter the 3’rd number : 53.35 ตวั อยา่ งเอาตพ์ ุต: Minimum number is 35.7 สาหรบั แผนผงั จาลองการทางานจะมลี กั ษณะดงั ภาพท่ี 6.8 และตวั อยา่ งโปรแกรมท่ี 6.8 ห น้ า 124

Start Read(Num1 , Num2, Num3) False Num1 < Num2 True False Num2 < Num3 True False Num1 < Num3 True Min_num = Num3 Min_num = Num2 Min_num = Num3 Min_num = Num1 Print Min_num End รปู ท่ี 6.8 แสดงแผนภาพจาลองโปรแกรมตรวจสอบตวั เลขทน่ี ้อยทส่ี ุด 3 คา่ ตวั อยา่ งโปรแกรมท่ี 6.8 โปรแกรมตรวจสอบตวั เลขทน่ี ้อยทส่ี ดุ 3 ค่า Program Example 6.8: comparing 3 minimum numbers 1 # Comparing the minimum of 3 numbers 2 num1 = float(input(\"Enter 1'st number :\")); 3 num2 = float(input(\"Enter 2'nd number :\")); 4 num3 = float(input(\"Enter 3'rd number :\")); 5 if num1 < num2: 6 if num1 < num3: 7 min_num = num1 8 else: 9 min_num = num3 10 elif num2 < num3: 11 min_num = num2 12 else: 13 min_num = num3 14 print(\"Minimum number is \",min_num) Enter 1'st number :73 Enter 2'nd number :35.7 OUTPUT Enter 3'rd number :53.35 Minimum number is 35.7 จากโปรแกรมตวั อยา่ งท่ี 6.8 เรมิ่ ตน้ บรรทดั ท่ี 2, 3 และ 4 ผใู้ ชง้ านป้อนขอ้ มลู จากแป้นพมิ พ์ 3 คา่ (สมมตวิ ่าคา่ ทป่ี ้อนเป็น 73, 35.7 และ 53.35 ตามลาดบั ) เกบ็ ไวใ้ นตวั แปรชอ่ื num1, num2 และ num3 ขนั้ ตอนต่อไปบรรทดั ท่ี 5 โปรแกรมทาการเปรยี บเทยี บเงอ่ื นไขดว้ ย if วา่ num1 < num2 หรอื ไม่ ผลลพั ธท์ ไ่ี ดเ้ ป็นเทจ็ (73 < 35.7) ส่งผลใหโ้ ปรแกรมเล่อื นไปประมวลผลคาสงั่ ในบรรทดั ท่ี 10 ซง่ึ เป็นการ ห น้ า 125

เปรยี บเทยี บดว้ ยคาสงั่ elif num2 < num3 ผลลพั ธท์ ไ่ี ดเ้ ป็นจรงิ เพราะ (35.7 < 53.35) โปรแกรมจะ ประมวลผลคาสงั่ หลงั elif ในบรรทดั ท่ี 11 โดยกาหนดค่า min_num (ซง่ึ เป็นตวั แปรทเ่ี กบ็ ขอ้ มลู ตวั ทน่ี ้อย ทส่ี ุดไว)้ ดว้ ยคา่ ในตวั แปร num2 ต่อจากนนั้ โปรแกรมจะประมวลผลคาสงั่ ในบรรทดั ท่ี 14 โดยพมิ พ์ ขอ้ ความวา่ \"Minimum number is\" พรอ้ มกบั ค่าขอ้ มลู ในตวั แปร min_num มาแสดงผล และจบ โปรแกรม 2. การควบคมุ ทิศทางแบบวนรอบ หรือทาซา้ (Loop, Iteration) การแกป้ ัญหาต่างๆ ในชวี ติ ประจาวนั มกั จะพบเจอกบั ปัญหาทต่ี อ้ งใชค้ วามพยายามในการ แกป้ ัญหาดงั กล่าววนซา้ หลายๆ ครงั้ เพอ่ื ทจ่ี ะบรรลเุ ป้าหมาย เช่น ถา้ ตอ้ งการสอบใหไ้ ดค้ ะแนนดี จาเป็นตอ้ งอ่านหนงั สอื ในบททจ่ี ะออกสอบหลายๆ รอบ ยงิ่ อ่านมากยงิ่ มโี อกาสทจ่ี ะไดค้ ะแนนสอบมาก ตามไปดว้ ย หรอื นกั กฬี าทต่ี อ้ งการไดเ้ หรยี ญทองในการแขง่ ขนั จาเป็นตอ้ งฝึกซ้าแบบเดมิ ใหเ้ กดิ ความ ชานาญ ยง่ิ ชานาญมากกย็ ง่ิ มโี อกาสประสบความสาเรจ็ มากตามไปดว้ ย เชน่ เดยี วกบั การแก้ปัญหาทาง คอมพวิ เตอร์ บางปัญหานนั้ จาเป็นตอ้ งประมวลผลซ้าไปซา้ มาหลายๆ รอบ จนกว่าจะไดค้ าตอบ เชน่ การหาผลรวมของจานวนเตม็ ตงั้ แต่ 1 – n, การหาค่า factorial, การหาค่า prime number และการ คานวณเลขลาดบั อนุกรม เป็นตน้ ปัญหาเหล่าน้จี าเป็นตอ้ งอาศยั เทคนิคการทาซ้าทงั้ สน้ิ ภาษาไพธอน เตรยี มคาสงั่ ในการทาซ้าไว้ 2 คาสงั่ คอื while และ for loop โดยใน 2 คาสงั่ น้ี สามารถจาแนกเป็นวธิ กี าร ทางานได้ 3 รปู แบบ while loop, for loop และ nested loop ซง่ึ มรี ายละเอยี ดดงั ต่อไปน้ี คาสงั่ While loop While เป็นคาสงั่ วนซ้าทม่ี กี ารตรวจสอบเงอ่ื นไข (condition) ก่อนเขา้ ทางานเสมอ เมอ่ื เงอ่ื นไขท่ี ทาการตรวจสอบเป็นจรงิ จงึ จะประมวลผลคาสงั่ หลงั while แต่ถา้ เงอ่ื นไขเป็นเทจ็ จะยตุ กิ ารทางานทนั ที สาหรบั งานทน่ี ิยมใช้ while ในการแก้ปัญหาคอื ปัญหาทไ่ี มท่ ราบจานวนรอบการทางานทแ่ี น่นอนหรอื ปัญหาทไ่ี มส่ ามารถทราบไดร้ ว่ งหน้าว่าจะตอ้ งใชเ้ วลาในการประมวลผลนานเท่าใด ส่วนใหญ่มกั จะหยดุ การทางานของ while ดว้ ยเงอ่ื นไขบางประการ เชน่ กดแป้นพมิ พท์ บ่ี ง่ บอกวา่ ตอ้ งการออกจากโปรแกรม เช่น ESC, q, -1, 0 เป็นตน้ หรอื ตรวจสอบคา่ ในตวั แปรตวั ใดตวั หน่งึ ในโปรแกรมเป็นเทจ็ เป็นตน้ โครงสรา้ งการทางาน while loop มรี ปู แบบคาสงั่ ดงั น้ี while condition: statement(s) แผนผงั จาลองการทางานจะมลี กั ษณะดงั ภาพท่ี 6.9 และตวั อยา่ งโปรแกรมท่ี 6.9 ห น้ า 126

While condition True False Conditional code รปู ที่ 6.9 แสดงแผนภาพจาลองการทางานของคาสงั่ while loop ตวั อยา่ งโปรแกรมท่ี 6.9 Program Example 6.9: while 1 # While loop testing 2 count = 0 3 while (count < 9): 4 print ('The count is:', count) 5 count = count + 1 6 print (\"Good bye!\") The count is: 0 The count is: 1 OUTPUT The count is: 2 The count is: 3 The count is: 4 The count is: 5 The count is: 6 The count is: 7 The count is: 8 Good bye! จากตวั อยา่ งโปรแกรมท่ี 6.9 เรมิ่ ตน้ บรรทดั ท่ี 2 เป็นการกาหนดค่าใหต้ วั แปร count มคี ่าเท่ากบั 0 เพอ่ื ใชส้ าหรบั นบั ค่า ขนั้ ตอนต่อไปบรรทดั ท่ี 3 โปรแกรมจะเปรยี บเทยี บเงอ่ื นไขใน while ว่า count มคี า่ น้อยกวา่ 9 หรอื ไม่ ถา้ เงอ่ื นไขเป็นเทจ็ โปรแกรมจะขา้ มไปทางานในบรรทดั ท่ี 6 โดยพมิ พข์ อ้ ความว่า \"Good bye!\" ออกจอภาพ แต่ถา้ เงอ่ื นไขเป็นจรงิ (count < 9) โปรแกรมจะทางานหลงั while ในบรรทดั ท่ี 4 โดยพมิ พข์ อ้ ความว่า 'The count is:' พรอ้ มกบั ค่าในตวั แปร count ต่อจากนนั้ ในบรรทดั ท่ี 5 จะทาการ เพมิ่ ค่าใหต้ วั แปร count อกี 1 ต่อจากนนั้ โปรแกรมจะวนกลบั ไปตรวจสอบเงอ่ื นไขของ while ในบรรทดั ท่ี 3 ใหม่ เป็นรอบท่ี 2 และทาการประมวลผลคาสงั่ ตามลาดบั ในบรรทดั ท่ี 3  4  5 ไปเรอ่ื ยๆ จนกว่าเงอ่ื นไขท่ี while จะเป็นเทจ็ (count >= 9) เมอ่ื เงอ่ื นไขใน while เป็นเทจ็ โปรแกรมจะมาทางานใน บรรทดั ท่ี 6 โดยพมิ พข์ อ้ ความวา่ \"Good bye!\" ก่อนจบโปรแกรมเสมอ ห น้ า 127

การวนซา้ แบบไมร่ ้จู บ (The Infinite Loop) บอ่ ยครงั้ ทพ่ี บปัญหาในการใชง้ าน while คอื เงอ่ื นไขทต่ี รวจสอบไมเ่ ป็นเทจ็ ซง่ึ สาเหตุมาจากหลาย กรณี แต่ส่วนใหญ่มาจากการหลงลมื ทาใหต้ วั แปรทใ่ี ชต้ รวจสอบเงอ่ื นไขเป็นเทจ็ เช่น ในกรณตี วั อยา่ ง โปรแกรมท่ี 6.9 ถา้ นกั เขยี นโปรแกรมลมื เพมิ่ ค่าใหก้ บั ตวั แปร count จะทาใหโ้ ปรแกรมเขา้ ส่สู ถานะท่ี เรยี กวา่ Infinite loop คอื โปรแกรมทางานไปเรอ่ื ยๆ ไมส่ ามารถหยุดได้ แต่กม็ โี ปรแกรมบางประเภทท่ี ตอ้ งการการทางานในลกั ษณะ Infinite loop อยเู่ หมอื นกนั เช่น โปรแกรมประเภท Client-Server ทฝ่ี ัง่ ผู้ ใหบ้ รกิ าร (Server) จะรอใหบ้ รกิ ารตลอดเวลาไมม่ วี นั หยดุ พกั หรอื ปิดโปรแกรมเลย สาหรบั คาสงั่ ตวั อยา่ ง ทใ่ี ชใ้ นกรณีทต่ี อ้ งการใหโ้ ปรแกรมทางานในลกั ษณะ infinite loop ดงั โปรแกรมท่ี 6.10 ตวั อยา่ งโปรแกรมท่ี 6.10 Program Example 6.10: infinite loop 1 # Infinite loop program 2 # When would you like to exit this program, push CTRL + C 3 var = 1 4 while var == 1 : # This constructs an infinite loop 5 num = int(input(\"Enter a number :\")) 6 print(\"You entered: \", num) 7 print(\"Good bye!\") Enter a number :394 You entered: 394 OUTPUT Enter a number :3994 You entered: 3994 Enter a number :  Here user enter CTRL + C Traceback (most recent call last): File \"C:\\Python34\\exam6_10.py\", line 5, in <module> num = int(input(\"Enter a number :\")) File \"C:\\Python34\\lib\\idlelib\\PyShell.py\", line 1381, in readline line = self._line_buffer or self.shell.readline() KeyboardInterrupt จากตวั อยา่ งโปรแกรม 6.10 เรม่ิ ตน้ บรรทดั ท่ี 3 กาหนดค่าใหต้ วั แปร var = 1 เพอ่ื ใชส้ าหรบั เปรยี บเทยี บเงอ่ื นไขก่อนเขา้ ทางานใน while loop (การกาหนดเง่ือนไขเพื่อใช้เปรียบเทียบก่อนเข้า ทางานใน while loop เป็นขนั้ ตอนที่สาคญั มากและต้องทาเสมอ) บรรทดั ท่ี 4 ทาการตรวจสอบ เงอ่ื นไขก่อนเขา้ ทางานใน while ผลการตรวจสอบปรากฎว่า เป็นจรงิ เสมอ เพราะวา่ คา่ ในตวั แปร var มี ค่าเทา่ กบั 1 โปรแกรมจงึ เล่อื นไปทาคาสงั่ ในบรรทดั ท่ี 5 หลงั คาสงั่ while คอื คาสงั่ อา่ นขอ้ มลู จานวนเตม็ มาจากแป้นพมิ พเ์ กบ็ ไวใ้ นตวั แปร num จากนนั้ บรรทดั ท่ี 6 จะพมิ พค์ า่ ทอ่ี ยใู่ นตวั แปร num ออกมาทาง จอภาพ แลว้ โปรแกรมจะกลบั ไปทางานในบรรทดั ท่ี 4 อกี ครงั้ ทงั้ น้เี พราะเงอ่ื นไขใน while ยงั เป็นจรงิ อยู่ การทางานจะทาซ้าคาสงั่ บรรทดั ท่ี 4  5  6 ไปเรอ่ื ยๆ จนกวา่ เงอ่ื นไขใน while จะเป็นเทจ็ แต่ สาหรบั ในกรณีน้จี ะเป็นจรงิ ตลอดไป แบบไมม่ วี นั จบ (Infinite loop) และคาสงั่ ในบรรทดั ท่ี 7 จะไมถ่ กู ห น้ า 128

ประมวลผลเลย ถา้ ผเู้ ขยี นโปรแกรมตอ้ งการออกจากโปรแกรมน้ี ใหก้ ดป่มุ CTRL + C เท่านัน้ เพ่อื เป็น การ Terminate โปรแกรมและโปรแกรมจะแสดงขอ้ ความผดิ พลาดออกมาดงั ตวั อยา่ งขา้ งบน การใช้คาสงั่ else รว่ มกบั while และ for ไพธอนจะอนุญาตใหผ้ เู้ ขยี นโปรแกรมสามารถใช้ else ร่วมกบั คาสงั่ while และ for ได้ (ซง่ึ แนวคดิ ดงั กล่าวไมม่ ใี นภาษา C/C++ หรอื Java) โดยถา้ ใชค้ าสงั่ else กบั for แลว้ คาสงั่ else จะทางาน เมอ่ื การประมวลผลคาสงั่ ใน for loop เสรจ็ เรยี บรอ้ ยหมดแลว้ และเมอ่ื ใชง้ าน else กบั while โดย else จะทางานกต็ ่อเมอ่ื เงอ่ื นไขใน while loop เป็นเทจ็ ตวั อยา่ งการใช้ else รว่ มกบั while ดงั โปรแกรมท่ี 6.11 ตวั อยา่ งโปรแกรมท่ี 6.11 Program Example 6.11: while with else 1 # Testing else statement with while loop 2 count = 0 3 while count < 5: 4 print(count, \" is less than 5 (While Loop)\") 5 count = count + 1 6 else: 7 print(count,\" is not less than 5(Else after exit while loop)\") 8 print(\"Good bye!\") 0 is less than 5 (While Loop) 1 is less than 5 (While Loop) OUTPUT 2 is less than 5 (While Loop) 3 is less than 5 (While Loop) 4 is less than 5 (While Loop) 5 is not less than 5 (Else after exit while loop) Good bye! จากตวั อยา่ งโปรแกรมท่ี 6.11 บรรทดั ท่ี 2 กาหนดคา่ เรม่ิ ตน้ ใหต้ วั แปร count เท่ากบั 0 เพ่อื ใช้ สาหรบั ทาการเปรยี บเทยี บก่อนเขา้ ทางานใน while loop ผลลพั ธจ์ ากการเปรยี บเทยี บ (บรรทดั ท่ี 3) มี คา่ เป็นจรงิ เพราะ count < 5 โปรแกรมจะเขา้ ไปประมวลผลในบรรทดั ท่ี 4 โดยพมิ พข์ อ้ ความว่า \"X is less than 5 (While Loop)\" โดย X คอื ค่าทอ่ี ยใู่ นตวั แปร count ในบรรทดั ท่ี 5 โปรแกรมทาการเพม่ิ คา่ conunt อกี 1 จากนนั้ โปรแกรมจะวนกลบั มาตรวจสอบเงอ่ื นไขใน while อกี (เพราะเงอ่ื นไขยงั ไมเ่ ป็น เทจ็ ) ซง่ึ โปรแกรมจะทาคาสงั่ ซา้ ในบรรทดั ท่ี 3  4  5 เชน่ น้ไี ปเรอ่ื ยๆ จนกว่า count >= 5 จงึ ทาให้ โปรแกรมยตุ กิ ารทางานใน while loop ลง และมาประมวลผลคาสงั่ ในบรรทดั ท่ี 6 โดยพมิ พข์ อ้ ความว่า \"5 is not less than 5 (Else after exit while loop)\" และตามดว้ ยขอ้ ความ \"Good bye!\" ในบรรทดั ท่ี 8 ดงั แสดงใน OUTPUT ของโปรแกรมดา้ นบน ห น้ า 129

สาหรบั ในกรณที ต่ี อ้ งการประมวลผลคาสงั่ ท่มี เี พยี งแคค่ าสงั่ เดยี วเทา่ นนั้ ต่อจากคาสงั่ while (จะมี ลกั ษณะการทางานคลา้ ยกบั if ทป่ี ราศจาก else) คอื ให้วาง 1 คาสงั่ ท่ีต้องการประมวลผลอย่ใู น บรรทดั เดียวกนั กบั while ดงั ตวั อยา่ งต่อไปน้ี flag = True # Single statement only while flag != False: flag = False print(\"Good bye!\") เมอ่ื รนั โปรแกรมผลลพั ธท์ ไ่ี ดค้ อื Good bye! โจทยต์ วั อยา่ งและผงั งาน จงเขยี นโปรแกรมคานวณหาค่าเฉลย่ี n จานวน โดยโปรแกรมจะวนรบั ค่าขอ้ มลู จากแป้นพมิ พไ์ ป เรอ่ื ยๆ พรอ้ มคานวณหาคา่ เฉลย่ี ไปพรอ้ มๆ กนั กบั การรบั ขอ้ มลู จนกว่าผใู้ ชจ้ ะพมิ พ์ 0 หรอื 0.0 โปรแกรมจงึ หยดุ ทางาน ตวั อยา่ งอนิ พุต/เอาตพ์ ตุ : Enter a number : 10.5 Average of number is : 10.5 Enter a number : 5 Average of number is : 7.75 Enter a number : 0 Good bye! สาหรบั แผนผงั จาลองการทางานจะมลี กั ษณะดงั ภาพท่ี 6.10 และตวั อยา่ งโปรแกรมท่ี 6.12 ห น้ า 130

Start Count = 1 Sum = 0.0 Read(Num) Num = float(Num) False Num != 0 True or 0.0 Sum = Sum + Num Avg = Sum / Count Count = Count + 1 Print Good bye! Print Avg End Read(Num) Num = float(Num) รปู ที่ 6.10 แสดงแผนภาพจาลองโปรแกรมคานวณหาคา่ เฉลย่ี n จานวน ตวั อยา่ งโปรแกรมท่ี 6.12 โปรแกรมคานวณหาค่าเฉลย่ี n จานวน Program Example 6.12: The average of n numbers 1 # Calcuting the average for N numbers 2 Count = 1 3 Sum = 0.0 4 print(\"To exit this program, please type 0 or 0.0 :\") 5 Num = float(input(\"Enter a number :\")) 6 while Num != 0 or Num != 0.0: 7 Sum += Num 8 Avg = Sum / Count 9 Count += 1 10 print (\"Average of number is : \", Avg) 11 Num = float(input(\"Enter a number :\")) 12 print(\"Good bye!\") OUTPUT To exit this program, please type 0 or 0.0 : Enter a number : 10.5 Average of number is : 10.5 Enter a number : 5 Average of number is : 7.75 Enter a number : 0 Good bye! ห น้ า 131