Kiểu dữ liệu number trong Python - Python căn bản
Trong bài này mình sẽ giới thiệu kiểu dữ liệu Number trong Python, tìm hiểu về các loại number khác nhau được sử dụng trong Python, cách chuyển đổi từ loại dữ liệu này sang loại dữ liệu khác và các hoạt động toán học được hỗ trợ trong Python. Nói đến Number thì chắc ai cũng biết đây là kiểu số. ...
Trong bài này mình sẽ giới thiệu kiểu dữ liệu Number trong Python, tìm hiểu về các loại number khác nhau được sử dụng trong Python, cách chuyển đổi từ loại dữ liệu này sang loại dữ liệu khác và các hoạt động toán học được hỗ trợ trong Python.
Nói đến Number thì chắc ai cũng biết đây là kiểu số. Tuy nhiên, chúng ta có rất nhiều loại số khác nhau như số nguyên (int), số thực (float), số phức (complex number). Vì vậy bạn phải nắm vững cách chuyển đổi giữa chúng.
1. Number trong Python là gì?
Number là một nhóm dữ liệu thường dùng trong Python, nó dùng để lưu trữ hầu hết các kiểu về số như số thực, số phức, số nguyên.
Python hỗ trợ số nguyên, số thực và số phức. Chúng được định nghĩa trong các lớp int
, float
và lớp complex
của Python.
Integer và float được phân biệt bằng dấu chấm động (.
). Nếu một số có dấu chấm động là kiểu float
, ngược lại là kiểu int
.
Ví dụ: Số 5 thuộc kiểu int
, trong khi 5.0 thuộc kiểu float
.
Số phức được viết dưới dạng x + yj
, trong đó x là phần thực và y là phần ảo.
Chúng ta có thể sử dụng hàm type()
để biết một biến đang thuộc lớp nào, và hàm isinstance()
để kiểm tra xem nó có thuộc về một lớp cụ thể nào đó không.
# Output: <class 'int'> print(type(a)) # Output: <class 'float'> print(type(5.0)) # Output: (8+3j) c = 5 + 3j print(c + 3) # Output: True print(isinstance(c, complex))
Trong khi số nguyên có thể có độ dài bất kỳ, số dấu phẩy động chỉ chính xác tối đa 15 vị trí thập phân (vị trí thứ 16 không chính xác).
Các số chúng ta xử dụng hàng ngày là hệ thống số thập phân (cơ sở 10). Nhưng các lập trình viên máy tính (nói chung là lập trình viên nhúng) cần phải làm việc với các hệ thống số nhị phân (cơ sở 2), hệ thập lục phân (cơ sở 16) và số bát phân (cơ sở 8).
Trong Python, chúng ta có thể biểu diễn các số này bằng cách đặt một tiền tố thích hợp trước số đó. Bảng sau liệt kê các tiền tố này.
Dưới đây là một vài ví dụ cách sử dụng các tiền tố prefix:
# Output: 107 print(0b1101011) # Output: 253 (251 + 2) print(0xFB + 0b10) # Output: 13 print(0o15)
Khi bạn chạy chương trình này thì sẽ cho kết quả như sau:
107 253 13
Chúng ta có thể chuyển đổi một từ cơ số này sang cơ số khác. Điều này còn được gọi là chuyển đổi cơ số.
Ví dụ: Các phép toán như phép cộng, phép trừ số nguyên sẽ tự động chuyển đổi cơ số sang kiểu float
nếu một trong các toán hạng là float
.
>>> 1 + 2.0 3.0
Như ví dụ trên bạn thấy 1 là kiểu số nguyên, 2.0 là kiểu số động và khi thực hiện phép toán thì kết quả sẽ mang kiểu số động.
Bạn cũng có thể sử dụng các hàm dựng sẵn như int ()
, float ()
và comlex ()
để chuyển đổi các kiểu dữ liệu một cách rõ ràng. Các hàm này thậm chí có thể chuyển đổi từ các chuỗi sang số và số sang chuỗi.
>>> int(2.3) 2 >>> int(-2.8) -2 >>> float(5) 5.0 >>> complex('3+5j') (3+5j)
2. Số thập phân trong Python
Lớp built-in trong Python có thể thực hiện một vài phép toán khiến chúng ta ngạc nhiên. Chúng ta đều biết rằng tổng của 1.1 và 2.2 là 3.3, tuy nhiên khi sử dụng toán tử so sánh bằng (==) thì điều đó là không đúng trong Python.
>>> (1.1 + 2.2) == 3.3 False
Chúng ta đang sai ở đâu?
Nó chỉ ra rằng các số dấu phẩy động được triển khai trong phần cứng máy tính dưới dạng phân số nhị phân, vì máy tính chỉ hiểu nhị phân (0 và 1). Vì lý do này, hầu hết các phân số thập phân mà chúng ta biết không thể được lưu trữ chính xác trong máy tính.
Hãy lấy một ví dụ. Chúng ta không thể biểu thị phân số 1/3 dưới dạng số thập phân. Điều này sẽ cung cấp cho 0.33333333 ... dài vô hạn và chúng ta chỉ có thể ước chừng nó.
Hóa ra phân số thập phân 0,1 sẽ dẫn đến phân số nhị phân dài vô hạn 0,000110011001100110011 ... và máy tính của chúng ta chỉ lưu trữ một số hữu hạn của nó.
Điều này sẽ chỉ xấp xỉ 0,1 nhưng không bao giờ bằng nhau. Do đó, đó là giới hạn của phần cứng máy tính của chúng tôi và không phải là lỗi trong Python.
>>> 1.1 + 2.2 3.3000000000000003
Để khắc phục vấn đề này, chúng ta có thể sử dụng mô-đun decimal.
import decimal # Output: 0.1 print(0.1) # Output: Decimal('0.1000000000000000055511151231257827021181583404541015625') print(decimal.Decimal(0.1))
Mô-đun này được sử dụng khi chúng ta muốn thực hiện các phép tính thập phân như đã học ở trường. Chúng ta biết 25,50 kg chính xác hơn 25,5 kg vì nó có hai chữ số thập phân đáng kể so với một.
from decimal import Decimal as D # Output: Decimal('3.3') print(D('1.1') + D('2.2')) # Output: Decimal('3.000') print(D('1.2') * D('2.50'))
Chúng ta có thể hỏi tại sao không thực hiện Decimal mỗi lần, thay vì float? Lý do chính là hiệu quả, float luôn luôn nhanh hơn.
3. Khi nào sử dụng Decimal thay vì float
Chúng ta thường sử dụng Decimal trong các trường hợp sau.
- Khi đang làm cho các ứng dụng tài chính cần đại diện thập phân chính xác.
- Khi muốn kiểm soát mức độ chính xác cần thiết.
- Khi muốn thực hiện khái niệm về số thập phân có ý nghĩa.
- Khi muốn các hoạt động được thực hiện như chúng ta đã làm ở trường
4. Phân số
Python cung cấp các hoạt động liên quan đến số phân số thông qua mô-đun Fraction của nó. Chúng ta có thể tạo các đối tượng Fraction theo nhiều cách khác nhau.
import fractions # Output: 3/2 print(fractions.Fraction(1.5)) # Output: 5 print(fractions.Fraction(5)) # Output: 1/3 print(fractions.Fraction(1,3))
Trong khi tạo phân số từ kiểu float chúng ta có thể nhận được một số kết quả bất thường. Điều này là do biểu diễn số dấu phẩy động nhị phân không hoàn hảo như đã thảo luận trong phần trước.
May mắn thay, phân số cho phép chúng ta khởi tạo bằng chuỗi, đây là các tùy chọn ưa thích khi sử dụng số thập phân.
import fractions # As float # Output: 2476979795053773/2251799813685248 print(fractions.Fraction(1.1)) # As string # Output: 11/10 print(fractions.Fraction('1.1'))
Kiểu dữ liệu này hỗ trợ tất cả các toán tử cơ bản. Dưới đây là một vài ví dụ.
from fractions import Fraction as F # Output: 2/3 print(F(1,3) + F(1,3)) # Output: 6/5 print(1 / F(5,6)) # Output: False print(F(-3,10) > 0) # Output: True print(F(-3,10) < 0)
5. Các hàm toán học
Python cung cấp các mô-đun như math và random để thực hiện các phép toán khác nhau như lượng giác, logarit, xác suất và thống kê, v.v.
import math # Output: 3.141592653589793 print(math.pi) # Output: -1.0 print(math.cos(math.pi)) # Output: 22026.465794806718 print(math.exp(10)) # Output: 3.0 print(math.log10(1000)) # Output: 1.1752011936438014 print(math.sinh(1)) # Output: 720 print(math.factorial(6))
import random # Output: 16 print(random.randrange(10,20)) x = ['a', 'b', 'c', 'd', 'e'] # Get random choice print(random.choice(x)) # Shuffle x random.shuffle(x) # Print the shuffled x print(x) # Print random element print(random.random())
6. Lời kết
Như vậy là mình đã giới thiệu xong toàn bộ kiến thức cơ bản về xử lý number trong Python, có rất nhiều hàm bổ trợ cho number và mình sẽ trình bày nó ở một bài khác. Chúc bạn học tốt1