Trong cuộc sống hàng ngày, chúng ta luôn gặp phải các con số. Số xuất hiện ở khắp mọi nơi trong cuộc sống của chúng ta.
Tháng này có 30 hay 31 ngày? Mai đi chợ bó rau muốn 3000 đồng hay là 3500 đồng? Bài thi hôm bữa được 9,1 điểm hay là 1,9? Cái bánh này mình ăn ½ hay là ¾. Có thể thấy, số không còn là điều gì xa lạ với chúng ta. Và tất nhiên điều này cũng áp dụng với ngôn ngữ lập trình Python.
Trong Python, chúng ta có rất nhiều kiểu dữ liệu số. Một số kiểu dữ liệu cơ bản bao gồm số nguyên (integers), số thực (floating-point), phân số (fraction), số phức (complex). Và trong bài viết này, chúng ta sẽ cùng tìm hiểu về những kiểu dữ liệu số này.
Số nguyên
Số nguyên bao gồm các số nguyên dương (1, 2, 3, ...) và các số nguyên âm (-1, -2, -3) và số 0. Kiểu dữ liệu số nguyên trong Python không có gì khác biệt.
Ví dụ: Gán giá trị cho một biến a
là 4 và xuất ra kiểu dữ liệu của a
.
a = 4 # gán giá trị của biến a là số 4, là một số nguyên print(a) # 4 print(type(a)) # - số nguyên thuộc lớp 'int' trong Python
Một điểm đáng chú ý là từ Python 3.X trở đi, kiểu dữ liệu số nguyên là vô hạn. Điều này cho phép bạn tính toán với những số cực kì lớn, điều mà đa số các ngôn ngữ lập trình khác không thể làm được.
Số thực
Số thực bao gồm các số nguyên và số thập phân như 1, 1.4, -123, 69.96,...
Ví dụ: Gán giá trị của biến f
là 1.23 và xuất ra kiểu dữ liệu của f
.
f = 1.23 # gán giá trị của biến f là số 1.23, là một số thực print(f) # 1.23 print(type(f)) # - số thực trong Python thuộc lớp 'float'
Lưu ý: Thường khi chúng ta viết số thực, phần nguyên và phần thập phân được tách nhau bởi dấu phẩy (,). Thế nhưng trong Python, dấu phẩy (,) này được thay thế bằng dấu chấm (.)
Số thực trong Python có độ chính xác xấp xỉ 15 chữ số phần thập phân. Nếu bạn muốn có kết quả được chính xác cao hơn, bạn nên sử dụng thư viện Decimal
.
from decimal import Decimal # Lấy tối đa 30 chữ số phần nguyên và phần thập phân getcontext().prec = 30 # Tính toán với Decimal decimal_num = Decimal(10) / Decimal(3) print(decimal_num) # Decimal('3.333333333333333333333333333333') # Kiểu dữ liệu của số Decimal print(type(decimal_num)) #
Tuy Decimal
có độ chính xác cao hơn so với float
, nhưng nó lại khá phức tạp hơn. Hãy cân nhắc giữa sự tiện lợi và độ chính xác để chọn kiểu dữ liệu phù hợp.
Phân số
Phân số gồm hai phần là tử số và mẫu số.
Để tạo phân số trong Python, ta sử dụng hàm Fraction
với cú pháp sau:
Fraction(, )
Ví dụ: Nhập phân số 1/4, 3/9, 3/4
from fractions import Fraction print(Fraction(1, 4)) # phân số với tử số là 1, mẫu số là 4 print(Fraction(3, 9)) # phân số sẽ được tối giản nếu có thể print(type(Fraction(3, 4))) # các phân số thuộc lớp Fraction
Tất nhiên, việc tạo một phân số với mẫu số bằng 0 sẽ gây lỗi.
from fractions import Fraction print(Fraction(1, 0)) # Lỗi: ZeroDivisionError: Fraction(1, 0) print(Fraction(1.55, 0)) # Lỗi: TypeError: both arguments should be Rational instances
Số phức
Số phức gồm hai thành phần: phần thực và phần ảo.
Trong đó:
- Phần thực và phần ảo là số thực.
j
là đơn vị ảo trong toán học vớij^2 = -1
.
Để tạo một số phức, bạn có thể sử dụng hàm complex
với cú pháp sau:
complex(, )
Để gán giá trị số phức cho một biến, sử dụng cú pháp:
= + j
Để xuất ra từng phần của một biến số phức, sử dụng cú pháp:
.real # Phần thực .imag # Phần ảo
Ví dụ: Nhập một số phức sau
- 1 + 3j
- Gán biến
c
có giá trị 2+1j. Xuất ra phần thực và phần ảo của biếnc
. - 4 +j (sẽ có lỗi vì kiểu dữ liệu nhập vào không đúng).
- Tạo số phức có phần thực là 3, phần ảo là 1.
- Tạo số phức chỉ có phần thực là 2.
- Xuất ra kiểu dữ liệu của số 3+1j.
a = 3j + 1 # phần thực là 1, phần ảo là 3 (1 + 3j) b = 2 + 1j # gán giá trị cho biến b là một số phức với phần thực là 2 và phần ảo là 1 c = 4 + 1j # Lỗi: NameError: name 'j' is not defined print(b.real) # lấy phần thực của số phức 2 + 1j print(b.imag) # lấy phần ảo của số phức 2 + 1j print(complex(3, 1)) # dùng hàm complex để tạo một số phức với phần thực là 3, phần ảo là 1 print(type(3 + 1j)) # các số phức thuộc lớp complex
Các toán tử cơ bản với kiểu dữ liệu số trong Python
Trong Python, chúng ta có các toán tử cơ bản để thực hiện các phép tính với các số.
Một số toán tử cơ bản bao gồm: cộng (+), trừ (-), nhân (*), chia (/), chia nguyên (//), chia dư (%), mũ (**).
a = 8 b = 3 print(a + b) # cộng print(a - b) # trừ print(a * b) # nhân print(a / b) # chia print(a // b) # chia nguyên print(a % b) # chia dư print(a ** b) # mũ
Tránh nhầm lẫn khi thực hiện các phép tính với số thực (float)
Khi thực hiện các phép tính với số thực, có thể gây nhầm lẫn vì sai số đôi khi xuất hiện.
Ví dụ:
print(0.1 + 0.2) # 0.30000000000000004 print(0.20 - 0.15) # 0.05000000000000002 print(0.05 * 0.2) # 0.010000000000000002
Điều này xảy ra do cách máy tính lưu trữ số thập phân dưới dạng dãy nhị phân. Số không thể được chuyển một cách chính xác hoàn toàn và dẫn đến sai số.
Mức độ ưu tiên của các toán tử
Khi thực hiện các phép tính, các toán tử được thực hiện từ trái sang phải của biểu thức và có mức độ ưu tiên thực hiện khác nhau. Cần chú ý để hiểu rõ cách thức thực hiện các phép tính.
So sánh giữa số với số trong Python
Có các toán tử như >
, <
, ==
, !=
, >=
, <=
để so sánh giữa các số. Ký hiệu của chúng có khác so với tiếng Anh.
print(3 > 1) # 3 > 1 là đúng => True print(69 < 10) # 69 < 10 là sai => False print(241 == 141 + 100) # 241 = 141 + 100 là đúng => True print((5 * 0) != 0) # 5 x 0 ≠ 0 là sai => False
Thư viện math trong Python
Thư viện math trong Python cung cấp rất nhiều hàm tính toán liên quan đến toán học.
Để sử dụng một thư viện, ta sử dụng lệnh import
.
Để sử dụng một hàm trong thư viện, ta sử dụng cú pháp
.
Dưới đây là một số hàm thường được sử dụng trong việc tính toán cơ bản:
trunc(x)
: Làm tròn số x xuống số nguyên gần nhất.fabs(x)
: Trả về giá trị tuyệt đối của số x.sqrt(x)
: Trả về căn bậc hai của số x.gcd(x, y)
: Trả về ước chung lớn nhất của hai số x và y.lcm(x, y)
: Trả về bội chung nhỏ nhất của hai số x và y.ceil(x)
: Làm tròn số x lên số nguyên gần nhất.
Ví dụ:
import math print(math.trunc(3.9)) # 3 print(math.fabs(-3)) # 3.0 print(math.sqrt(16)) # 4.0 print(math.gcd(6, 4)) # 2 print(math.lcm(4, 5)) # 20 print(math.ceil(9.4)) # 10
Câu hỏi củng cố:
- Kiểu dữ liệu số nguyên thuộc lớp nào?
- Sự khác nhau giữa hai biến
a
vàb
dưới đây là gì?
a = 0 b = 0.0
- Tại sao lại có sự khác nhau khi sử dụng hàm
trunc
trong thư viện math so với toán tử//
?
import math print(math.trunc(15 / -4)) # -3 print(15 // -4) # -4
Mức độ ưu tiên của các toán tử cũng được thực hiện từ trên xuống dưới.
Kết luận:
Trong bài viết này, chúng ta đã tìm hiểu về các kiểu dữ liệu số trong Python. Kiểu dữ liệu số rất quan trọng và chúng ta tiếp tục tìm hiểu về kiểu dữ liệu chuỗi trong Python trong bài viết tiếp theo.