Bài tập

Kiểu dữ liệu số trong Python

Huy Erick

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...

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ới j^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. 1 + 3j
  2. Gán biến c có giá trị 2+1j. Xuất ra phần thực và phần ảo của biến c.
  3. 4 +j (sẽ có lỗi vì kiểu dữ liệu nhập vào không đúng).
  4. Tạo số phức có phần thực là 3, phần ảo là 1.
  5. Tạo số phức chỉ có phần thực là 2.
  6. 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ố:

  1. Kiểu dữ liệu số nguyên thuộc lớp nào?
  2. Sự khác nhau giữa hai biến ab dưới đây là gì?
a = 0 b = 0.0
  1. 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.

1