จากใน
บทที่ ๓ ได้เรียนรู้เรื่องข้อมูลชนิดต่างๆกันไปแล้ว ในที่นี้จะมาพูดถึงลงลึกเรื่องของข้อมูลที่เป็นตัวเลข โดยพูดถึงคุณสมบัติที่สำคัญของมัน นั่นก็คือการคำนวณ
ข้อมูลที่เป็นตัวเลขสามารถนำมาคำนวณเพื่อให้ได้ค่าใหม่ได้ การเขียนตัวเลขหรือตัวแปรในลักษณะที่มีการกระทำอะไรต่างๆกันเช่นบวกลบคูณหารนั้นเรียกว่า
นิพจน์ ดังที่อาจจะได้เห็นกันไปแล้วในบางตัวอย่างในบทที่ผ่านๆมา ในบทนี้จะมาแนะนำเกี่ยวกับการเขียนนิพจน์โดยละเอียดขึ้น
นิพจน์แบบต่างๆ นิพจน์ที่ใช้บ่อยๆได้แก่
x+y |
x บวก y |
x-y |
x ลบ y |
x*y |
x คูณ y |
x/y |
x หาร y |
x//y |
x หาร y โดยปัดเศษทิ้ง |
x%y |
x หาร y เอาเศษ |
x**y |
x ยกกำลัง y |
นิพจน์บางชนิดอาจเขียนในรูปแบบฟังก์ชัน
pow(x,y) |
x ยกกำลัง y (เหมือน x**y ) |
abs(x) |
ค่าสัมบูรณ์ของ x |
จะเห็นว่าลักษณะการเขียนนิพจน์ในภาษาโปรแกรมไม่เหมือนกับที่เขียนในคณิตศาสตร์เสียทีเดียว นั่นเพราะข้อจำกัดเรื่องสัญลักษณ์ เช่นการคูณต้องใช้ดอกจัน
*
แทนที่จะเป็นเครื่องหมายคูณ
สำหรับการคำนวณในระดับที่สูงขึ้นไปจะใช้ฟังก์ชันจากมอดูล
math
ซึ่งจะกล่าวถึงใน
บทที่ ๑๖ การหารโดยทั่วไปจะได้ผลเป็นเลขทศนิยมซึ่งมีจำนวนนัยสำคัญจำกัด จะไม่ออกมาเป็นเลขเศษส่วน แต่ก็มีวิธีทำให้แสดงผลออกมาเป็นเลขเศษส่วนได้โดยใช้มอดูล fractions ซึ่งจะไม่พูดถึงในที่นี้
สิ่งที่นำมาคำนวณอาจไม่ใช่ตัวเลขล้วนๆ แต่เป็นตัวแปรที่เก็บข้อมูลชนิดตัวเลข เช่น
a = 129.3
b = a**2
c = b+a*19
นอกจากนี้ยังมีรูปแบบการเขียนโดยเฉพาะสำหรับการนำตัวแปรที่มีอยู่เดิมมาปรับแก้ค่า โดยเขียนตัวดำเนินการตามด้วยเครื่องหมายเท่ากับ
x += a |
เทียบเท่ากับ |
x = x+a |
x -= a |
x = x-a |
x *= a |
x = x*a |
x /= a |
x = x/a |
x **= a |
x = x**a |
และอื่นๆในทำนองเดียวกัน
ลำดับความสำคัญของการคำนวณ เวลาที่มีนิพจน์ยาวๆซึ่งประกอบด้วยสัญลักษณ์ในการคำนวณหลายตัว การคำนวณจะเกิดขึ้นต่อเนื่องหลายครั้งซ้อนกันไปเรื่อยๆ โดยเริ่มไล่จากซ้ายไปขวา เช่น
a = 1+2+3+4
ค่าของ a ก็จะเริ่มคำนวณโดยเริ่มจาก 1+2 แล้วก็ค่อยบวก 3 บวก 4
แต่ก็ไม่เป็นเช่นนั้นเสมอไป เพราะสัญลักษณ์การคำนวณแต่ละชนิดมีความสำคัญไม่เท่ากัน มีลำดับความสำคัญอยู่ เรียงตามนี้
- ยกกำลัง
- คูณ หาร หารปัดเศษ หารเอาเศษ
- บวก ลบ
แต่หากมีวงเล็บก็จะพิจารณาในวงเล็บก่อน
ส่วนสัญลักษณ์เดียวกันหรือมีความสำคัญในระดับเท่ากันนั้นจะเริ่มทำจากซ้ายไปขวา ยกเว้นยกกำลังจะทำจากขวาไปซ้าย
ตัวอย่าง
7+13*0 # ได้ 7
3+5**2 # ได้ 28
2**3**4 ได้ # ได้ 2417851639229258349412352
(12876+27349-95893)*0 # ได้ 0
3*10%7 # ได้ 2
3*(10%7) # ได้ 7
ชนิดของข้อมูลตัวเลขที่คำนวณได้ โดยปกตินำข้อมูลชนิดไหนมาคำนวณผลที่ออกมาก็จะได้เป็นชนิดนั้น เช่นจำนวนเต็มบวกจำนวนเต็มได้จำนวนเต็ม
แต่ในไพธอน 3 ข้อมูลที่เป็นจำนวนเต็มหารจำนวนเต็มจะได้เป็นจำนวนจริง ซึ่งมีทศนิยมได้ ที่ต้องแปลงชนิดข้อมูลก็เพื่อให้เก็บค่าทศนิยมที่เกิดขึ้นจากการหารได้ นั่นเอง เช่น
3/7 # ได้ 0.42857142857142855
***ในไพธอน 2 จำนวนเต็มหารจำนวนเต็มก็ได้จำนวนเต็ม ดังนั้นเศษจะหายไปหมด ทำให้ไม่สะดวก ต้องคอยมาแปลงข้อมูลก่อน
>>> รายละเอียด ข้อมูลที่เป็นต่างชนิดกันก็สามารถนำมาคำนวณได้ เพียงแต่ผลลัพธ์ที่ได้นั้นจะกลายเป็นข้อมูลชนิดใดชนิดหนึ่งเท่านั้น
โดยทั่วไปหาเก็บจำนวนเต็มกับจำนวนจริงมากระทำกันผลที่ได้จะออกมาเป็นจำนวนจริง เช่น
1930.389+348 # ได้ 2278.389
3.3e-9+1 # ได้ 1.0000000033
ถ้าจำนวนจริงหรือจำนวนเต็มทำกับจำนวนเชิงซ้อนก็จะได้จำนวนเชิงซ้อน
(123+44j)/20 #ได้ (6.15+2.2j)
หากจำนวนจริงหรือจำนวนเต็มที่ติดลบยกกำลังเศษส่วนก็จะได้จำนวนเชิงซ้อนเช่นกัน
เช่น
(-2)**1.1
ได้
(-2.0386342710747223-0.6623924280875919j)
***ในไพธอน 2 จะไม่สามารถทำแบบนี้ได้
>>> รายละเอียด ข้อมูลชนิดบูลก็สามารถนำมาคำนวณกับตัวเลขได้ โดย
True
แทนค่า
1
และ
False
แทนค่า
0
True - True # ได้ 0
False*100 # ได้ 0
True + 1.5 # ได้ 2.5
การคำนวณกับสายอักขระ ไม่เพียงแต่ตัวเลขจะมีการคำนวณเท่านั้น สายอักขระเองก็สามารถมีการคำนวณได้เช่นกัน แต่ความหมายในการคำนวณของสายอักขระนั้นจะต่างกันออกไปจากการคำนวณตัวเลขสักหน่อย โดยทำได้ค่อนข้างจำกัด
โดยการนำสายอักขระมาบวกกันจะเป็นการนำ สายอักขระมาต่อกัน และการนำสายอักขระมาคูณจำนวนเต็มก็จะเป็นการคัดลอกสายอักขระตามจำนวนเท่ากับที่คูณ
'ฮ่า'*7 # ได้ 'ฮ่าฮ่าฮ่าฮ่าฮ่าฮ่าฮ่า'
'ฮ่า'+'ๆ'*30 # ได้ 'ฮ่าๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆๆ'
แต่ถ้านำสายอักขระมาคูณด้วยจำนวนจริงก็จะขัดข้อง หรือหากนำสายอักขระมาคูณหรือลบหรือหารกันเองก็ขัดข้องเช่นกัน
'ฮ่าๆ'*3.3 # ได้ TypeError: can't multiply sequence by non-int of type 'float'
'ฮ่าๆๆ'-'ๆ' # ได้ TypeError: unsupported operand type(s) for -: 'str' and 'str'
ดังนั้นสายอักขระจึงทำได้แค่บวกกันเอง หรือคูณกับจำนวนเต็มเท่านั้น
ระวังว่าสายอักขระที่เป็นตัวเลขหากนำมาบวกกันก็จะเป็นการเขียนตัวเลขต่อกัน ไม่ใช่การบวกตัวเลข
'555'+'555' # ได้ '555555' ไม่ใช่ '1110'
อ้างอิง