Để thành thạo lập trình Python, việc hiểu rõ về các toán tử số học là vô cùng quan trọng. Bài viết này mình sẽ đi sâu vào từng toán tử, với từng định nghĩa rõ ràng, ví dụ cụ thể, giúp bạn xây dựng kiến thức vững chắc để có thể sử dụng các toán tử này trong các dự án của mình.
Toán tử số học trong Python là gì?
Các toán tử số học trong Python là những ký hiệu đặc biệt dùng để thực hiện các phép toán quen thuộc trên số như cộng, trừ, nhân, chia, và các phép toán khác. Toán tử số học thuộc loại toán tử hai ngôi, nghĩa là chúng cần hai toán hạng để hoạt động. Python hỗ trợ đầy đủ các phép toán số học hỗn hợp. Điều này có nghĩa là hai toán hạng có thể thuộc hai kiểu số khác nhau. Trong trường hợp như vậy, Python sẽ tự động thực hiện chuyển đổi kiểu dữ liệu trước khi thực hiện phép toán.
Các loại toán tử số học trong Python
Bảng dưới đây liệt kê các toán tử số học có trong Python:
Toán tử | Mô tả | Ví dụ |
+ | Cộng | a + b = 30 |
- | Trừ | a – b = -10 |
* | Nhân | a * b = 200 |
/ | Chia | b / a = 2 |
% | Chia lấy dư | b % a = 0 |
** | Số mũ | a**b =10**20 |
// | Chia lấy nguyên | 9//2 = 4 |
Toán tử cộng trong Python
Toán tử cộng được biểu diễn bằng ký hiệu +
. Đây là một toán tử số học cơ bản. Toán tử cộng thực hiện phép cộng hai toán hạng số ở hai bên của ký hiệu và trả về kết quả của phép cộng.
Ví dụ 1: Phép cộng giữa 2 số nguyên
Trong ví dụ sau, hai biến số nguyên đóng vai trò là các toán hạng cho toán tử +
.
a = 25
b = 12
print ("Phép cộng hai số nguyên")
print ("a =", a, "b =", b, "tổng =", a + b)
Khi thực thi, đoạn code này sẽ cho ra kết quả:
Phép cộng hai số nguyên
a = 25 b = 12 tổng = 37
Ví dụ 2: Phép cộng giữa số nguyên và số thực
Phép cộng giữa số nguyên và số thực cho kết quả là số thực.
a = 30
b = 7.5
print ("Phép cộng số nguyên và số thực")
print ("a =", a, "b =", b, "tổng =", a + b)
Khi chạy code, kết quả sẽ là:
Phép cộng số nguyên và số thực
a = 30 b = 7.5 tổng = 37.5
Ví dụ 3: Phép cộng giữa số phức và số thực
Kết quả của phép cộng giữa số thực và số phức sẽ là một số phức.
a = 15 + 8j
b = 6.2
print ("Phép cộng số phức và số thực")
print ("a =", a, "b =", b, "tổng =", a + b)
Kết quả đầu ra của đoạn code này:
Phép cộng số phức và số thực
a= (15+8j) b= 6.2 tổng= (21.2+8j)
Toán tử trừ trong Python
Toán tử trừ được biểu diễn bằng ký hiệu -
. Toán tử này thực hiện phép trừ toán hạng thứ hai từ toán hạng thứ nhất. Nếu toán hạng thứ hai lớn hơn toán hạng thứ nhất, kết quả sẽ là một số âm.
Ví dụ 1: Phép trừ giữa 2 số nguyên
Chúng ta cùng xem ví dụ về phép trừ giữa hai số nguyên:
a = 25
b = 10
print("Phép trừ hai số nguyên:")
print("a =", a, "b =", b, "a - b =", a - b)
print("a =", a, "b =", b, "b - a =", b - a)
Kết quả khi chạy đoạn code này:
Phép trừ hai số nguyên:
a = 25 b = 10 a – b = 15
a = 25 b = 10 b – a = -15
Ví dụ 2: Phép trừ giữa số nguyên và số thực
Phép trừ giữa một số nguyên và một số thực (số thập phân) cũng tương tự:
a = 15
b = 25.5
print("Phép trừ giữa số nguyên và số thực:")
print("a =", a, "b =", b, "a - b =", a - b)
print("a =", a, "b =", b, "b - a =", b - a)
Đoạn code này sẽ in ra:
Phép trừ giữa số nguyên và số thực:
a = 15 b = 25.5 a – b = -10.5
a = 15 b = 25.5 b – a = 10.5
Ví dụ 3: Phép trừ giữa số phức và số thực
Trong trường hợp trừ giữa một số phức và một số thực, phần thực của số phức sẽ tham gia vào phép trừ:
a = 12 + 4j
b = 15.5
print("Phép trừ giữa số phức và số thực:")
print("a =", a, "b =", b, "a - b =", a - b)
print("a =", a, "b =", b, "b - a =", b - a)
Kết quả sẽ là:
Phép trừ giữa số phức và số thực:
a = (12+4j) b = 15.5 a – b = (-3.5+4j)
a = (12+4j) b = 15.5 b – a = (3.5-4j)
Toán tử nhân trong Python
Trong Python (cũng như nhiều ngôn ngữ khác), ký hiệu *
(dấu hoa thị) được định nghĩa là toán tử nhân. Toán tử này trả về tích của hai toán hạng nằm hai bên của nó. Nếu một trong hai toán hạng là số âm, kết quả phép nhân cũng sẽ là số âm. Trường hợp cả hai toán hạng đều âm, kết quả sẽ là số dương. Việc thay đổi thứ tự của các toán hạng không làm thay đổi kết quả phép nhân.
Ví dụ 1: Phép nhân giữa 2 số nguyên
Chúng ta cùng xem ví dụ sau để hiểu rõ hơn cách toán tử nhân hoạt động trên các số nguyên:
a = 10
b = 20
print("Phép nhân hai số nguyên:")
print("a =", a, "b =", b, "a * b =", a * b)
Đoạn code trên sẽ cho ra kết quả:
Phép nhân hai số nguyên:
a = 10 b = 20 a * b = 200
Ví dụ 2: Phép nhân giữa số nguyên và số thực
Trong phép nhân, toán hạng là số thực có thể ở dạng ký hiệu thập phân thông thường hoặc ở dạng ký hiệu khoa học.
Ví dụ sau minh họa cách toán tử nhân hoạt động với số nguyên và số thực:
a = 10
b = 20.5
print("Phép nhân số nguyên và số thực:")
print("a =", a, "b =", b, "a * b =", a * b)
a = -5.55
b = 6.75E-3
print("Phép nhân hai số thực:")
print("a =", a, "b =", b, "a * b =", a * b)
Đoạn code trên sẽ cho ra kết quả:
Phép nhân số nguyên và số thực:
a = 10 b = 20.5 a * b = 205.0
Phép nhân hai số thực:
a = -5.55 b = 0.00675 a * b = -0.0374625
Ví dụ 3: Phép nhân giữa số thực và số phức
Đối với phép nhân liên quan đến một toán hạng là số phức, toán hạng còn lại sẽ được nhân với cả phần thực và phần ảo của số phức đó.
Ví dụ về cách nhân số phức với một số thực:
a = 10 + 5j
b = 20.5
print("Phép nhân số phức và số thực:")
print("a =", a, "b =", b, "a * b =", a * b)
Kết quả khi chạy đoạn code trên là:
Phép nhân số phức và số thực:
a = (10+5j) b = 20.5 a * b = (205+102.5j)
Toán tử chia trong Python
Ký hiệu /
thường được gọi là dấu gạch chéo. Toán tử chia được sử dụng để chia số bị chia (toán hạng bên trái) cho số chia (toán hạng bên phải). Kết quả sẽ là số âm nếu một trong hai toán hạng là số âm. Vì máy tính không thể lưu trữ vô cực, nên Python sẽ thông báo lỗi ZeroDivisionError
nếu số chia bằng 0
.
Một điểm quan trọng cần nhớ là kết quả của phép chia trong Python luôn là số thực (float), ngay cả khi cả hai toán hạng đều là số nguyên.
Ví dụ 1: Phép chia giữa 2 số nguyên
Hãy cùng xem một vài ví dụ về cách toán tử chia hoạt động với các kiểu dữ liệu khác nhau:
a = 15
b = 3
print ("Phép chia hai số nguyên:")
print ("a =", a, ", b =", b, ", a / b =", a / b)
print ("a =", a, ", b =", b, ", b / a =", b / a)
Đoạn code trên sẽ tạo ra kết quả như sau:
Phép chia hai số nguyên:
a = 15 , b = 3 , a / b = 5.0
a = 15 , b = 3 , b / a = 0.2
Ví dụ 2: Phép chia giữa số nguyên và số thực
Trong phép chia, toán hạng là số thực có thể được viết dưới dạng số thập phân chuẩn, hoặc dưới dạng ký hiệu khoa học.
a = 10
b = -5.5
print ("Phép chia số nguyên và số thực:")
print ("a =", a, ", b =", b, ", a / b =", a / b)
a = -7.5
b = 1.5e2 #tương ứng 1.5 * 10^2 = 150
print ("Phép chia giữa hai số thực:")
print ("a =", a, ", b =", b, ", a / b =", a / b)
Đoạn code trên sẽ tạo ra kết quả như sau:
Phép chia số nguyên và số thực:
a = 10 , b = -5.5 , a / b = -1.8181818181818181
Phép chia giữa hai số thực:
a = -7.5 , b = 150.0 , a / b = -0.05
Ví dụ 3: Phép chia giữa số thực và số phức
Khi một trong các toán hạng là số phức, phép chia sẽ được thực hiện giữa toán hạng kia và cả phần thực lẫn phần ảo của số phức.
a = 3 + 6j # Số phức
b = 1.5 # Số thực
print ("Phép chia giữa số phức và số thực:")
print ("a =", a, ", b =", b, ", a / b =", a / b)
print ("a =", a, ", b =", b, ", b / a =", b / a)
Kết quả đầu ra của đoạn code này là:
Phép chia giữa số phức và số thực:
a = (3+6j) , b = 1.5 , a / b = (2+4j)
a = (3+6j) , b = 1.5 , b / a = (0.1-0.2j)
Nếu số bị chia là 0
, kết quả của phép chia sẽ luôn là 0
(trừ trường hợp số chia bằng 0
). Tuy nhiên nếu số chia là 0
, Python sẽ báo lỗi ZeroDivisionError
với thông báo “Division by zero
“.
a = 0
b = 4
print ("a =", a, ", b =", b, ", a / b =", a / b)
print ("a =", a, ", b =", b, ", b / a =", b / a) #Đây là trường hợp sẽ lỗi
Đoạn code trên khi chạy sẽ có kết quả:
a = 0 , b = 4 , a / b = 0.0
Traceback (most recent call last):
File “<stdin>”, line 4, in <module>
ZeroDivisionError: float division by zero
Toán tử chia lấy dư trong Python
Python sử dụng ký hiệu %
, còn được biết đến với tên gọi là dấu phần trăm, để biểu diễn toán tử chia lấy dư (hoặc modulo). Toán tử này trả về phần dư sau khi thực hiện phép chia số bị chia (numerator) cho số chia (denominator). Kết quả của toán tử chia lấy dư là phần còn lại sau khi thực hiện phép chia nguyên. Ví dụ, khi chia 10
cho 3
, ta được thương số là 3
và số dư là 1
. Vì vậy, biểu thức 10 % 3
(thường đọc là “10 mod 3
“) sẽ cho kết quả là 1
.
Ví dụ 1: Phép chia lấy dư giữa 2 số nguyên
Nếu cả hai toán hạng đều là số nguyên, kết quả của phép chia lấy dư sẽ là một số nguyên.
- Nếu số bị chia chia hết cho số chia, số dư sẽ là
0
. - Nếu số bị chia nhỏ hơn số chia, số dư sẽ bằng chính số bị chia.
- Nếu số chia bằng
0
, Python sẽ báo lỗiZeroDivisionError
vì không thể thực hiện phép chia cho0
.
Xem qua ví dụ sau:
a = 10
b = 2
print ("a =", a, "b =", b, "a%b =", a % b) # 10 chia 2 dư 0
a = 10
b = 4
print ("a =", a, "b =", b, "a%b =", a % b) # 10 chia 4 dư 2
print ("a =", a, "b =", b, "b%a =", b % a) # 4 chia 10 dư 4 (số bị chia < số chia)
a = 0
b = 10
print ("a =", a, "b =", b, "a%b =", a % b) # 0 chia 10 dư 0
try:
print ("a=", a, "b=", b, "b%a=",b%a) # 10 chia 0 sẽ gây lỗi
except ZeroDivisionError:
print("Lỗi: Không thể chia cho 0")
Kết quả khi chạy code trên:
a = 10 b = 2 a%b = 0
a = 10 b = 4 a%b = 2
a = 10 b = 4 b%a = 4
a = 0 b = 10 a%b = 0
Lỗi: Không thể chia cho 0
Ví dụ 2: Phép chia lấy dư giữa 2 số thực
Nếu một trong hai toán hạng là số thực (float), kết quả của phép chia lấy dư sẽ luôn là một số thực.
a = 10
b = 2.5
print ("a =", a, "b =", b, "a%b =", a % b) # 10 chia 2.5 dư 0.0
a = 10
b = 1.5
print ("a =", a, "b =", b, "a%b =", a % b) # 10 chia 1.5 dư 1.0
a = 7.7
b = 2.5
print ("a =", a, "b =", b, "a%b =", a % b) # 7.7 chia 2.5 dư 0.200000...
a = 12.4
b = 3
print ("a =", a, "b =", b, "a%b =", a % b) # 12.4 chia 3 dư 0.400000...
Kết quả khi chạy đoạn code trên:
a = 10 b = 2.5 a%b = 0.0
a = 10 b = 1.5 a%b = 1.0
a = 7.7 b = 2.5 a%b = 0.20000000000000018
a = 12.4 b = 3 a%b = 0.40000000000000036
Lưu ý: Python không hỗ trợ sử dụng số phức làm toán hạng trong phép chia lấy dư. Nếu bạn cố gắng làm điều đó, chương trình sẽ báo lỗi TypeError.
Toán tử lũy thừa trong Python
Trong Python, toán tử lũy thừa được biểu diễn bằng hai dấu sao **
. Ví dụ, a**b
được hiểu là “a lũy thừa b
“, hoặc “a mũ b
“.
Đặc điểm của toán tử lũy thừa:
- Nếu số mũ là
0
, kết quả luôn là1
. - Nếu cả hai toán hạng (cơ số và số mũ) đều là số nguyên, kết quả cũng là một số nguyên.
- Nếu một trong hai toán hạng là số thực, kết quả sẽ là số thực.
- Tương tự, nếu một trong hai toán hạng là số phức, kết quả trả về cũng là một số phức.
- Nếu cơ số là
0
, kết quả sẽ là0
.
Ví dụ về toán tử lũy thừa trong Python
Thay vì dùng biến a
và b
chung chung, chúng ta hãy xem xét một vài phép tính lũy thừa cụ thể:
co_so = 5
so_mu = 2
print (f"{co_so} mũ {so_mu} bằng: {co_so**so_mu}") # 5 mũ 2 = 25
co_so = 3
so_mu = 1.5
print (f"{co_so} mũ {so_mu} bằng: {co_so**so_mu}") # 3 mũ 1.5 ~ 5.196
co_so = 2.5
so_mu = 3
print (f"{co_so} mũ {so_mu} bằng: {co_so**so_mu}") # 2.5 mũ 3 = 15.625
co_so = 2+1j #Số phức
so_mu = 2
print (f"{co_so} mũ {so_mu} bằng: {co_so**so_mu}") # (2+1j) mũ 2 = 3+4j
co_so = 7
so_mu = 0
print (f"{co_so} mũ {so_mu} bằng: {co_so**so_mu}") # 7 mũ 0 = 1
Toán tử chia lấy phần dư trong Python
Toán tử chia lấy phần nguyên (hay còn gọi là phép chia sàn) trong Python được ký hiệu bằng hai dấu gạch chéo //
. Không giống như toán tử chia lấy số dư (%
), toán tử chia lấy phần nguyên sẽ trả về thương của phép chia (loại bỏ phần thập phân).
Đặc điểm của toán tử chia lấy phần nguyên:
- Nếu một trong hai toán hạng là số âm, kết quả sẽ được làm tròn về phía số âm vô cùng. Ví dụ,
-9.8 // 2
sẽ cho kết quả là-5
(vì kết quả của-9.8/2
là-4.9
, khi chia lấy phần nguyên, ta làm tròn xuống đến số nguyên gần nhất là-5
). - Nếu cả hai toán hạng đều là số dương, toán tử sẽ trả về một số nguyên với phần thập phân đã được loại bỏ. Ví dụ,
9.8 // 2
sẽ cho kết quả là4
(vì kết quả của9.8/2
là4.9
và ta loại bỏ phần thập phân).
Ví dụ về toán tử chia lấy phần dư trong Python
Đoạn code dưới đây sẽ giúp bạn hiểu rõ hơn về chia lấy phần dư trong Python:
a = 9
b = 2
print("a =", a, "b =", b, "a//b =", a // b) # 9 chia nguyên cho 2
a = 9
b = -2
print("a =", a, "b =", b, "a//b =", a // b) # 9 chia nguyên cho -2
a = 10
b = 1.5
print("a =", a, "b =", b, "a//b =", a // b) # 10 chia nguyên cho 1.5
a = -10
b = 1.5
print("a =", a, "b =", b, "a//b =", a // b) # -10 chia nguyên cho 1.5
Khi chạy đoạn code này, kết quả in ra như sau:
a= 9 b= 2 a//b= 4
a= 9 b= -2 a//b= -5
a= 10 b= 1.5 a//b= 6.0
a= -10 b= 1.5 a//b= -7.0
Thứ tự ưu tiên của các toán tử số học
Trong Python, khi một biểu thức có nhiều toán tử số học, Python sẽ thực hiện các phép toán theo một thứ tự ưu tiên nhất định. Điều này có nghĩa là một số toán tử sẽ được thực hiện trước các toán tử khác. Bên cạnh đó, tính kết hợp (associativity) cũng đóng vai trò quan trọng trong việc xác định thứ tự thực hiện của các toán tử cùng mức ưu tiên.
Chúng ta có thể hình dung thứ tự ưu tiên này như cách chúng ta thường làm với phép toán ở trường học. Phép nhân và phép chia luôn được thực hiện trước phép cộng và phép trừ.
Dưới đây là bảng mô tả thứ tự ưu tiên và tính kết hợp của các toán tử số học trong Python:
Toán tử | Mô tả | Tính kết hợp |
** | Toán tử lũy thừa | Tính kết hợp từ phải sang trái |
%, *, /, // | Modulus, Nhân, Chia, và Chia lấy phần nguyên | Tính kết hợp từ trái sang phải |
+, – | Cộng và Trừ | Tính kết hợp từ trái sang phải |
Toán tử số học và số phức
Khi cả hai toán hạng đều là các đối tượng số phức, các toán tử số học có một chút khác biệt so với số thực.
Phép cộng và phép trừ số phức
Phép cộng và phép trừ số phức thực chất là phép cộng/trừ tương ứng của các thành phần thực và ảo. Để hiểu rõ hơn, hãy xem xét đoạn code Python sau:
a = 2.5 + 3.4j # Số phức a với phần thực là 2.5 và phần ảo là 3.4
b = -3 + 1.0j # Số phức b với phần thực là -3 và phần ảo là 1.0
print("Phép cộng số phức - a =", a, "b =", b, "a+b =", a + b)
print("Phép trừ số phức - a =", a, "b =", b, "a-b =", a - b)
Khi chạy đoạn code này, ta sẽ nhận được kết quả:
Phép cộng số phức – a = (2.5+3.4j) b = (-3+1j) a+b = (-0.5+4.4j)
Phép trừ số phức – a = (2.5+3.4j) b = (-3+1j) a-b = (5.5+2.4j)
Phép nhân số phức trong Python
Phép nhân số phức tương tự như phép nhân hai biểu thức nhị thức trong đại số. Nếu “a + bj
” và “x + yj
” là hai số phức, thì phép nhân của chúng được tính theo công thức sau:
(a + bj) * (x + yj) = ax + ayj + xbj + byj² = (ax - by) + (ay + xb)j
Trong đó:
a, b, x, y
là các số thựcj
là đơn vị ảo(j² = -1
)
Xét hai số phức a = 6 + 4j
và b = 3 + 2j
. Khi nhân hai số này, chúng ta thực hiện như sau:
a * b = (6 + 4j) * (3 + 2j)
= 6*3 + 6*2j + 4j*3 + 4j*2j
= 18 + 12j + 12j + 8j²
= 18 + 24j - 8 (vì j² = -1)
= (18 - 8) + 24j
= 10 + 24j
Vậy, a * b = 10 + 24j.
Để kiểm tra kết quả, chúng ta có thể sử dụng Python như sau:
a = 6 + 4j
b = 3 + 2j
print ("Phép nhân số phức - a =", a, "b =", b, "a * b =", a * b)
Khi chạy đoạn code trên, kết quả sẽ là:
Phép nhân số phức – a = (6+4j) b = (3+2j) a * b = (10+24j)
Phép chia số phức trong Python
Để chia hai số phức cho nhau, chúng ta cần nhân cả tử số và mẫu số với số phức liên hợp của mẫu số. Đây là phương pháp phổ biến để đơn giản biểu thức chia số phức.
Giả sử ta có hai số phức:
a = 6 + 4j
b = 3 + 2j
Thực hiện phép chia a/b
:
c = a/b
c = (6 + 4j) / (3 + 2j)
c = (6 + 4j) * (3 - 2j) / (3 + 2j) * (3 - 2j)
c = (18 - 12j + 12j - 8j²) / (9 - 6j + 6j - 4j²)
c = (18 - 12j + 12j + 8) / (9 - 6j + 6j + 4) (Do j² = -1)
c = (18 + 8) / (9 + 4)
c = 26/13
c = 2 + 0j
Để kiểm chứng, bạn có thể chạy đoạn code Python sau:
a = 6 + 4j
b = 3 + 2j
print("Phép chia số phức - a =", a, "b =", b, "a/b =", a / b)
Đoạn code trên sẽ in ra kết quả phép chia, giúp bạn đối chiếu với phép tính bằng tay.
Lưu ý: Lớp số phức trong Python không hỗ trợ toán tử lấy phần dư (%)
và toán tử chia lấy phần nguyên (//
).
Lời kết
Chúng ta vừa cùng nhau khám phá chi tiết các toán tử số học trong Python, từ cộng, trừ, nhân, chia cho đến chia lấy dư, lũy thừa và thứ tự ưu tiên của chúng. Hy vọng qua bài viết này, bạn đã nắm vững cách sử dụng các toán tử này, cũng như hiểu rõ về cách chúng hoạt động với số phức, từ đó áp dụng linh hoạt vào các dự án lập trình của mình.