Python – Numbers, Type Conversion and Mathematics

og:image

Python – Numbers, Type Conversion and Mathematics

ข้อมูลประเภท number

การประกาศข้อมูลในรูปแบบของตัวเลขนั้น สามารถรองรับการใช้ของมูลตัวเลขที่เป็นชนิดต่างๆ ดังนี้

  • จำนวนเต็ม(integer): int
  • เลขทศนิยม(floating point): float
  • จำนวนเชิงซ้อน(complex): complex

หากจะทำการระบุตัวแปรให้เป็นมีชนิดข้อมูลตัวเลขประเภทนี้ จะต้องระบุตัวแปรให้อยู่ในคลาสที่เหมาะสมกับข้อมูลนั้นๆ(int, float หรือ complex)

สำหรับเลขจำนวนเต็มและเลขทศนิยมนั้นจะแตกต่างกันตรงเลขระบุทศนิยม ตัวอย่างเช่น 5 เป็นจำนวนเต็ม และ 5.0 เป็นเลขทศนิยม

สำหรับจำนวนเชิงซ้อนนั้นจะเขียนให้อยู่ในรูป x + yj ซึ่งส่วนของ x จะเป็นจำนวนจริง(real) และ y จะเป็นจำนวนจินตภาพ(imaginary)

หากต้องการทราบชนิดของข้อมูล เราสามารถใชัฟังก์ชัน “type()” เพื่อจะตรวจสอบว่าตัวแปรหรือค่าใดๆ นั้นมาจากคลาสใด และสามารถใช้ฟังก์ชัน “isinstance()” เพื่อทำการตรวจสอบว่าข้อมูลหรือตัวแปรดังกล่าวตรงกับคลาสที่ระบุหรือไม่
ตัวอย่างการใช้งาน

# สร้างตัวแปรสำหรับเก็บข้อมูลปริมาณของสินค้า โดยทำการเก็บข้อมูลเป็นจำนวนเต็ม และทำการตรวจสอบชนิดของข้อมูลที่ตัวแปรดังกล่าวเก็บไว้
amount = 50
print(type(amount))
# โปรแกรมทำการปรินต์ค่า
# <class 'int'>

# สร้างตัวแปรสำหรับเก็บข้อมูลปริมาณของสินค้า โดยทำการเก็บข้อมูลเป็นตัวเลขทศนิยม และทำการตรวจสอบชนิดของข้อมูลที่ตัวแปรดังกล่าวเก็บไว้
price= 50.0
print(type(price))
# โปรแกรมทำการปรินต์ค่า
# <class 'float'>

# สร้างตัวแปรสำหรับเก็บข้อมูล โดยทำการเก็บข้อมูลเป็นจำนวนเชิงซ้อน และทำการตรวจสอบชนิดของข้อมูลที่ตัวแปรดังกล่าวว่าตรงกับชนิดข้อมูลประเภทจำนวนเชิงซ้อนจริงหรือไม่
data = 1 + 2j
data = data + 3
print(data)
print( isinstance(data, complex) ) 
# โปรแกรมทำการปรินต์ค่า
# 4+2j
# True

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

สำหรับการเก็บข้อมูลที่เป็นข้อมูลตัวเลขจำนวนเต็ม(integer) ข้อมูลที่เก็บจะเป็นตัวเลขซึ่งมีความยาวเท่าไรก็ได้ แต่ถ้าหากจำนวนนั้นเป็นจำนวนทศนิยม(float) จะมีความแม่นยำได้มากสุดเพียงแค่ทศนิยม 15 ตำแหน่ง เท่านั้น

ข้อมูลจำนวนที่เราใช้งานกันส่วนใหญ่ในชีวิตประจำวันนั้นจะเป็นเลขฐาน 10 แต่สำหรับการเขียนโปรแกรมที่ใช้ในการคำนวณ ก็อาจจะมีโอกาสในการใช้งานกับข้อมูลตัวเลขในระบบอื่น เช่น

  • เลขฐาน 2 (binary)
  • เลขฐาน 8 (base 8)
  • เลขฐาน 16 (base 16)

ในการกำหนดว่าข้อมูลดังกล่าวเป็นตัวเลขฐานได้ เราสามารถเติม prefix ให้เลขฐานดังกล่าวที่เราต้องการระบุ

ระบบตัวเลข prefix
เลขฐาน 2(binary) ‘0b’ หรือ ‘0B’
เลขฐาน 8(octal) ‘0o’ หรือ ‘0O’
เลขฐาน 16(hexadecimal) ‘0x’ หรือ ‘0X’

ตัวอย่างการใช้งาน

# การเติม prefix ให้กับข้อมูลในรูปแบบเลขฐาน 2 (prefix=0b, data=1101)
base2_data = 0b1101
print("ผลของ 0b1101: {}".format(base2_data))
# โปรแกรมทำการปรินต์ค่า
# 13 

# การเติม prefix ให้กับข้อมูลในรูปแบบเลขฐาน 8 (prefix=0o, data=15)
base8_data = 0o15
print("ผลของ 0o15: {}".format(base8_data))
# โปรแกรมทำการปรินต์ค่า
# 13 


# การเติม prefix ให้กับข้อมูลในรูปแบบเลขฐาน 16 (prefix=0x, data=FB)
base16_data = 0xFB
print("ผลของ 0xFB: {}".format(base16_data))
# โปรแกรมทำการปรินต์ค่า
# 251 
การแปลงชนิดข้อมูล

เราสามารถแปลงข้อมูลจากชนิดหนึ่งเป็นอีกชนิดได้ ตัวดำเนินการอย่าง +, – นั้นสามารถจะทำการแปลงข้อมูลจากตัวเลขจำนวนเต็มให้เป็นตัวเลขทศนิยมได้โดยอัตโนมัติในระหว่างทำเนินการ หากมีจำนวนใดจำนวนหนึ่งที่จะต้องดำเนินการนั้นเป็นตัวเลขทศนิยม
ตัวอย่างการใช้งาน

# ใน python console ทำการประมวลผลการลบของข้อมูลตัวเลข  
>>> 5-3.0
2.0

จากตัวอย่าง ใช้เครื่องหมายดำเนินการ “-” เพื่อดำเนินการระหว่างตัวเลข 5 และ 3.0 เนื่องจากชนิดของข้อมูลทั้งสองเป็นตัวเลขจำนวนเต็ม(5) และทศนิยม(3.0) เพื่อจะทำการดำเนินการทางคณิตศาสตร์ด้วยกัน จึงต้องทำการแปลงชนิดของข้อมูลทั้งสองให้เป็นข้อมูลชนิดเดียวกันคือตัวเลขทศนิยม ดังนั้นผลลบจึงกลายเป็นเลขทศนิยมอัตโนมัติ (2.0)

เรายังสามารถใช้ฟังก์ชันเฉพาะของ python ในการแปลงข้อมูลตัวเลข เช่นฟังก์ชัน int(), float(), complex() เพื่อทำการแปลงค่าไปมาระหว่างกัน ฟังก์ชันเหล่านี้สามารถจะทำการแปลงค่าจากข้อมูลที่เป็น string ได้ด้วย
ตัวอย่างการใช้งาน

# ใน python console ทำการแปลงข้อมูลโดยใช้ฟังก์ชัน
>>> int(5.7)
5
>>> int(-6.2)
-6
>>> float(5)
5.0
>>> complex('1+2j')
(1+2j)
>>> int("11")
11

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

Decimal

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

ตัวอย่างการใช้งาน

>>> 0.1 +0.2 == 0.3
False

จากตัวอย่าง เราได้ทำการบวกตัวเลขทศนิยม 0.1 กับ 0.2 แล้วทำการเปรียบเทียบว่าผลบวกของ 2 จำนวนนั้นมีค่าเป็น 0.3 หรือไม่ ถ้าเราลองทำการบวกตัวเลขดังกล่าวดูในใจผลที่ได้ก็ควรจะเท่ากับ 0.3 และควรจะคืนค่าเป็นจริง แต่เมื่อลองทำการเขียนโปรแกรมแล้วตรวจสอบค่า โปรแกรมจะทำการคืนผลการเปรียบเทียบจำนวนดังกล่าวว่าไม่เท่ากัน ที่เป็นเช่นนี้ เนื่องจากตัวเลขดังกล่าวนั้นเป็นข้อมูลที่อยู่ในระบบเลขฐาน 10 แต่เมื่อต้องการประมวลผลเพื่อส่งไปให้คอมพิวเตอร์คำนวณ ซึ่งคอมพิวเตอร์เองจะสามารถเข้าใจเพียงแค่เลข 0 และ 1 ดังนั้นตัวแปลภาษาจะต้องแปลงข้อมูลดังกล่าวให้อยู่ในระบบเลขฐาน 2 ด้วยวิธีดังกล่าวจึงทำให้ในบางกรณีที่ระบุข้อมูลในรูปทศนิยม เมื่อแปลผลเป็นภาษาคอมพิวเตอร์เข้าใจทำให้ค่าดังกล่าวอาจจะมีความคลาดเคลื่อนไปบ้าง

ตัวอย่างเช่น ข้อมูลของเศษส่วน 1/3 นั้นเราไม่สามารถจัดเก็บข้อมูลที่ถูกต้องให้อยู่ในรูปแบบเลขฐาน 10 ได้ในคอมพิวเตอร์ เนื่องจากผลของรูปเศษส่วนดังกล่าวคือ 0.333333……. ซึ่งเป็นทศนิยมไม่รู้จบ ค่าที่ได้จึงเป็นค่าจากการประมาณของข้อมูลดังกล่าว ด้วยเหตุผลนี้ เมื่อทำการเก็บข้อมูลเป็นเลขทศนิยมในบางกรณี ค่าที่คอมพิวเตอร์เก็บข้อมูลอาจจะมีความคลาดเคลื่อนจากข้อมูลที่ระบุไปบ้างเล็กน้อย

ดังนั้นเมื่อเก็บค่าข้อมูล 0.1 คอมพิวเตอร์จะแปรผลจากระบบเลขฐาน 10 ดังกล่าวให้อยู่ในรูประบบเลขฐาน 2 ซึ่งทำให้เกิดข้อมูล 0.000110011001100110011… วนไปแบบที่ไม่รู้จบ แต่โปรแกรมคอมพิวเตอร์เอง จะสามารถเก็บข้อมูลได้เพียงแค่เลขทศนิยมจำนวนหนึ่งเท่านั้น ดังนั้นค่า 0.1 ที่ถูกเก็บไว้จึงเป็นเพียงค่าประมาณ ไม่ตรงตามข้อมูลที่ระบุไว้ ดังนั้นจึงทำให้ กรณีที่ 0.1 + 0.2 == 0.3 มีค่าเป็นเท็จก็เนื่องจากข้อจำกัดของการเก็บข้อมูลในคอมพิวเตอร์เอง ไม่ใช่ความผิดพลาดของภาษา
ตัวอย่างการใช้งาน

>>> 0.1 +0.2
0.30000000000000004

เพื่อที่จะแก้ไขปัญหาดังกล่าว เราสามารถใช้โมดูล decimal ในการทำงานกับข้อมูลดังกล่าว โดยปกติแล้วตัวเลขทศนิยม(floating point)สามารถจะเก็บข้อมูลเลขทศนิยมสูงสุดได้ 15 ตำแหน่ง หากใช้โมดูล decimal เราสามารถจะระบุตำแหน่งของตัวเลขทศนิยมให้ตรงตามข้อมูลที่ต้องการได้
ตัวอย่างการใช้งาน

import decimal

print(0.1)
# โปรแกรมทำการปรินต์ค่า
# 0.1

print(decimal.Decimal(0.1))
# โปรแกรมทำการปรินต์ค่า
# 0.1000000000000000055511151231257827021181583404541015625

print(decimal.Decimal('0.1'))
# โปรแกรมทำการปรินต์ค่า
# 0.1

โดยเราสามารถใช้งานโมดูล decimal เมื่อเราต้องการคำนวณตัวเลขซึ่งมีจำนวนตำแหน่งของทศนิยมได้จำนวนมากกว่า, สามารถจะกำหนดจำนวนตำแหน่งได้ตามต้องการและยังช่วยเก็บข้อมูลเลขทศนิยมเพื่อทำให้การคำนวณแม่นยำขึ้นอีกด้วย เนื่องจากข้อมูล 25.50 นั้นมีความแม่นยำกว่า 25.5 เนื่องจากจำนวนเลขนัยสำคัญที่เพิ่มขึ้นมา 1 ตำแหน่ง ก็จะช่วยระบุความแม่นยำเพิ่มขึ้น
ตัวอย่างการใช้งาน

from decimal import Decimal as D

print(D('0.1') + D('0.2'))
# โปรแกรมทำการปรินต์ค่า
# 0.3

print(D('0.2') * D('1.50'))
# โปรแกรมทำการปรินต์ค่า
# 0.300

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

ความเหมาะสมระหว่างการเลือกใช้ Decimal แทนจะใช้ float
การเลือกใช้ Decimal

  • เมื่อต้องการพัฒนาแอพลเคชันด้านการเงินซึ่งต้องการความแม่นของตัวเลขยำสูง
  • เมื่อต้องการควบคุมระดับของความแม่นยำ(precision)ของตัวเลข
  • เมื่อต้องการคำนวณตัวเลขที่ต้องระบุความแม่นยำของเลขทศนิยมให้อยู่ในระดับที่กำหนด
Fraction

สามารถจะใช้ฟังก์ชันเพื่อแปลงข้อมูลตัวเลขให้อยู่ในรูปของเศษส่วน โดยใช้โมดูล fraction
โดยตัวเลขในรูปของเศษส่วนนั้นจะประกอบด้วยตัวเลขที่เป็นตัวตั้ง(numerator) และตัวหาร(denominator) โดยตัวเลขทั้งคู่ต่างเป็นเลขจำนวนเต็ม(integer)
ตัวอย่างการใช้งาน

# นำเข้าโมดูล fraction เพื่อใช้แปลงข้อมูลตัวเลขให้อยู่ในรูปแบบของเศษส่วน
import fractions

print( fractions.Fraction(3.5) )
# โปรแกรมทำการปรินต์ค่า
# 7/2

print( fractions.Fraction(2) )
# โปรแกรมทำการปรินต์ค่า
# 2

print( fractions.Fraction(2, 5))
# โปรแกรมทำการปรินต์ค่า
# 2/5

จากตัวอย่างเป็นการใช้งานฟังก์ชัน Fraction ซึ่งเป็นฟังก์ชันหนึ่งในโมดูล fraction เพื่อทำการแปลงข้อมูลตัวเลขให้อยู่ในรูปแบบของเศษส่วน เช่นทำการแปลงข้อมูลตัวเลข 3.5 ให้เป็นข้อมูลเศษส่วนในรูป 7/2

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

การใช้งานฟังก์ชัน Fraction นั้นสามารถแปลงข้อมูลจากข้อมูลตัวเลขในรูปแบบของ string ได้ด้วย
ตัวอย่างการใช้งาน

# นำเข้าโมดูล fraction เพื่อใช้แปลงข้อมูลตัวเลขให้อยู่ในรูปแบบของเศษส่วน
import fractions

print( fractions.Fraction(1.1) )
# โปรแกรมทำการปรินต์ค่า
# 2476979795053773/2251799813685248

print( fractions.Fraction('1.1') )
# โปรแกรมทำการปรินต์ค่า
# 11/10

เราสามารถใช้ข้อมูลจากฟังก์ชัน Fraction ร่วมกับเครื่องหมายดำเนินการทางคณิตศาสตร์พื้นฐานได้อีกด้วย
ตัวอย่างการใช้งาน

# นำเข้าโมดูล fraction เพื่อใช้แปลงข้อมูลตัวเลขให้อยู่ในรูปแบบของเศษส่วน และตั้งชื่อของฟังก์ชันโดยย่อว่า F() เพื่อความสะดวกในการเรียกใช้งาน
from fractions import Fraction as F

# ทำการบวกข้อมูลซึ่งเป็นตัวเลขที่ได้จากฟังก์ชัน Fraction: 2/5 + 2/5
result1 = F(2, 5) + F(2, 5)
print("Result1: ", result1)
# โปรแกรมทำการปรินต์ค่า
# Result1: 4/5

# ทำการหารข้อมูลซึ่งเป็นตัวเลขที่ได้จากฟังก์ชัน Fraction: 1 / 2/5
result2 = 1/ F(2, 5)
print("Result2: ", result2)
# โปรแกรมทำการปรินต์ค่า
# Result2: 5/2

# ทำการเปรียบเทียบข้อมูลซึ่งเป็นตัวเลขที่ได้จากฟังก์ชัน Fraction: 2/5 > 1/5
result3 = F(2, 5) > F(1, 5)
print("Result3: ", result3 )
# โปรแกรมทำการปรินต์ค่า
# Result3: True

Mathematics
ใน python มีโมดูลเพื่อใช้สำหรับดำเนินการทางคณิตศาสตร์พื้นฐานต่างๆ เช่น โมดูล “math”, โมดูล “random” ซึ่งจะมีฟังก์ชันสำหรับดำเนินการทางคณิตศาสตร์เช่น ตรีโกณมีติ, ลอการิทึม, ความน่าจะเป็น, สถิติ เป็นต้น
ตัวอย่างการใช้งานโมดูล math

# ทำการนำเข้าโมโุล math เพื่อใช้ดำเนินการทางคณิตศาสตร์
import math

# เรียกใช้ข้อมูล pi
print("Pi :", math.pi)
# โปรแกรมทำการปรินต์ค่า
# Pi : 3.141592653589793

print("Sin(45): ", math.sin(45))
# โปรแกรมทำการปรินต์ค่า
# Sin(45) : 0.8509035245341184

print("e^2: ", math.exp(2))
# โปรแกรมทำการปรินต์ค่า
# e^2: 7.38905609893065

print("log10(100): ", math.log10(100))
# โปรแกรมทำการปรินต์ค่า
# log10(100): 2.0

print("factorial(6): ", math.factorial(6))
# โปรแกรมทำการปรินต์ค่า
# factorial(6): 720

ตัวอย่างการใช้งานโมดูล random

# ทำการนำเข้าโมดูล random เพื่อใช้สุ่มข้อมูลตัวเลข
import random

# ใช้ฟังก์ชัน randrange() เพื่อทำการสุ่มข้อมูลตัวเลขจากช่วงข้อมูลที่ระบุ
print("Random in range(0, 5): " random.randrange(0, 5) )
# โปรแกรมทำการปรินต์ค่า
# Random in range(0, 5): 1

# กำหนดตัวแปรเก็บลิสต์ของรายชื่อนักเรียน
students = ["David", "Peter", "Susan", "Nicola", "Mary"]
print("Students: ", students)
# โปรแกรมทำการปรินต์ค่า
# Students: ["David", "Peter", "Susan", "Nicola", "Mary"]

# ใชัฟังก์ชัน choice() จากโมดูล random เพื่อทำการสุ่มข้อมูลจากลิสต์ของข้อมูลที่กำหนด
print("Random student: ", random.choice(students) )
# โปรแกรมทำการปรินต์ค่า
# Random student: Nicola

# ใช้ฟังก์ชัน shuffle() จากโมดูล random เพื่อทำการสลับลำดับข้อมูลจากลิสต์ข้อมูล
random.shuffle( students )
print("Shuffle students: ", students )
# โปรแกรมทำการปรินต์ค่า
# Shuffle students: ['Nicola', 'Mary', 'David', 'Peter', 'Susan'] 

# ใช้ฟังก์ชัน random() จากโมดูล random เพื่อทำการสุ่มข้อมูลตัวเลขหนึ่งตัว
print("Random: ", random.random())
# โปรแกรมทำการปรินต์ค่า
# Random: ", 0.4827494418231246 

ที่มาของข้อมูล https://www.programiz.com/python-programming/numbers