Cũng giống như trong toán học, các ngôn ngữ lập trình như Python có các toán tử. Bạn có thể coi chúng như những hàm cực kỳ đơn giản nằm ở nền tảng của khoa học máy tính. Đây là các phép toán đơn giản nhất mà một chương trình máy tính có thể rút gọn về. Chúng là kiến thức thiết yếu cho bất kỳ ai muốn trở thành Nhà khoa học dữ liệu hoặc Kỹ sư phần mềm.
Nếu bạn muốn tìm hiểu thêm về những điều cơ bản của Ngôn ngữ lập trình Python, hãy xem khóa học miễn phí Intro to Python for Data Science của chúng tôi.
Toán tử số học
Bạn có lẽ đã quen thuộc với chúng, vì chúng xuất phát từ toán học cơ bản.
Các toán tử số học gồm có cộng (+), trừ (-), nhân (*), chia (/), lũy thừa (**), chia lấy phần nguyên (//) và chia lấy dư (%). Bốn toán tử đầu khá đơn giản; lần lượt là cộng, trừ, nhân và chia, và có lẽ bạn đã quen với chúng.
# Additionprint(5+2)# Subtractionprint(5-2)# Multiplicationprint(5*2)# Divisionprint(5/2)Được hỗ trợ bởi
Ba toán tử còn lại phức tạp hơn một chút. Toán tử lũy thừa có nghĩa là "mũ". Ví dụ, 2 ** 3 nghĩa là 2 được nhân với chính nó 3 lần, nên 2 ** 3 tương đương 2 * 2 * 2, bằng 8.
Chia lấy phần nguyên giống như phép chia thông thường, ngoại trừ việc kết quả luôn được làm tròn xuống. Trong ví dụ dưới đây, 5 chia cho 2 được 2.5. Nhưng vì là chia lấy phần nguyên, 2.5 được làm tròn xuống còn 2.
Cuối cùng, phép chia lấy dư là phần dư sau phép chia. Với 5%2, số 2 chỉ "lọt" được hai lần vào 5, nên phần dư là 1.
# Exponentprint(5**2)# This is the same as 5 * 5# Floor Divisionprint(5//2)# Modulusprint(5%2)Được hỗ trợ bởi
Nếu bạn đã có chút kinh nghiệm lập trình, chắc chắn bạn đã từng dùng toán tử gán. Chúng gán một giá trị nhất định cho biến. Toán tử được dùng nhiều nhất là =. Để dùng, chỉ cần gõ tên biến bạn muốn gán giá trị mới, tiếp theo là =, rồi đến giá trị cần gán. Ví dụ, nếu bạn muốn gán giá trị 100 cho biến balance, bạn có thể làm như sau:
Nếu bạn muốn tăng giá trị của balance thêm 10, bạn có thể dùng balance += 10. Câu lệnh này tương đương balance = balance + 10, nhưng ngắn gọn hơn nhiều.
Các toán tử gán khác hoạt động theo đúng cách tương tự. Bao gồm:
*=
/=
**=
//=
%=
Toán tử so sánh
Bạn có thể dùng các toán tử so sánh để, đúng như tên gọi, so sánh giá trị của các biến. Chúng luôn trả về một giá trị boolean, hoặc True hoặc False. Có sáu toán tử:
a =3
b =5print(a == b)# Equalprint(a != b)# Not equalprint(a > b)# Greater thanprint(a < b)# Less thanprint(a >= b)# Greater than or equal toprint(a <= b)# Less than or equal toĐược hỗ trợ bởi
== và != cũng có thể dùng để so sánh chuỗi thay vì số. Các toán tử còn lại không tương thích với chuỗi, vì thật ra không thể nói một chuỗi "lớn hơn" chuỗi khác.
Có thể bạn đã quen với chúng! Trong logic, chúng được gọi là các liên kết logic. Chúng cũng được dùng rộng rãi trong ngôn ngữ tự nhiên. Đó là: and, or và not.
and chỉ trả về True nếu cả hai toán hạng (hai đối tượng boolean bạn đang so sánh) đều True. Ví dụ:
print(TrueandTrue)print(TrueandFalse)print(FalseandFalse)Được hỗ trợ bởi
Hãy nhớ rằng trước đó, bạn đã thấy + có thể dùng để cộng các số, nhưng cũng có thể dùng để nối, hay kết hợp các chuỗi. Vậy nên + hoạt động khác nhau tùy vào kiểu đối tượng bạn dùng. Nhưng không phải lúc nào cũng vậy. Đôi khi, toán tử bạn đang dùng đơn giản là không hỗ trợ kiểu đối tượng bạn muốn áp dụng.
Đây là một ví dụ. Giả sử bạn có hai đối tượng Dog, ozzy và filou. Chúng thuộc lớp Dog bên dưới. Bạn có thể coi lớp như một bản thiết kế cho việc đối tượng phải trông như thế nào và hành xử ra sao. Trong trường hợp này, các đối tượng Dog có tên, tuổi và chiều cao. Sau khi lớp được định nghĩa, bạn có thể khởi tạo các đối tượng. Một trong số đó là Ozzy, 3 tuổi và cao 30 cm. Còn lại là Filou, 5 tuổi và cao 65 cm.
Ví dụ này sử dụng khái niệm Lập trình hướng đối tượng. Nếu bạn muốn tìm hiểu thêm, hãy đọc hướng dẫn của chúng tôi về Lập trình hướng đối tượng trong Python
Giả sử bạn muốn so sánh hai chú chó bằng toán tử lớn hơn: >. Điều này sẽ không hoạt động. Bạn sẽ nhận được lỗi '>' not supported between instances of 'Dog' and 'Dog'. Điều đó có nghĩa là > không biết cách so sánh các đối tượng của lớp Dog.
classDog:def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height
ozzy = Dog("Ozzy",3,30)
filou = Dog("Filou",5,65)print(filou > ozzy)Được hỗ trợ bởi
---------------------------------------------------------------------------
TypeError Traceback(most recent call last)<ipython-input-96-428069ab24cc>in<module>()9 filou =Dog("Filou",5,65)10--->11print(filou > ozzy)TypeError:'>' not supported between instances of'Dog' and 'Dog'Được hỗ trợ bởi
May mắn là với nạp chồng toán tử, bạn có thể định nghĩa hành vi của toán tử khi được gọi trên các đối tượng Dog. Trong trường hợp này, cần định nghĩa một phương thức tên __gt__, nghĩa là "greater than" (lớn hơn), nhận vào hai đối số. Vì chúng ta muốn so sánh những chú chó theo chiều cao, phương thức sẽ trả về self.height > other.height.
classDog:def__init__(self, name, age, height):
self.name = name
self.age = age
self.height = height
def__gt__(self,other):return self.height > other.height
ozzy = Dog("Ozzy",3,30)
filou = Dog("Filou",5,65)print(filou > ozzy)print(ozzy > filou)Được hỗ trợ bởi
Làm sao bạn biết cái nào sẽ được thực thi trước? Bạn nên đọc một dòng mã có nhiều ký hiệu như thế nào? Nó được thực thi từ trái sang phải hay có một thứ tự cụ thể nào đó?
Đây là lúc độ ưu tiên phát huy tác dụng. Toán tử trong Python được thực thi theo một thứ tự rất cụ thể, và một số toán tử có mức ưu tiên cao hơn những toán tử khác.
Trong bảng sau, bạn có thể thấy thứ tự ưu tiên của các toán tử, từ trên xuống dưới. Các quy tắc này giống trong toán học, nơi một số phép tính trong công thức phải được thực hiện trước những phép khác.
Độ ưu tiên
Toán tử
Mô tả
1
**
lũy thừa
2
*, /, %, //
nhân, chia, chia lấy dư, chia lấy phần nguyên
3
+, -
cộng, trừ
4
>, <, >=, <=
so sánh
5
==, !=
bằng/khác
6
= %= /= //= -= += *= **=
gán
7
and, or, not
logic
Tính kết hợp
Bạn đã thấy rằng độ ưu tiên rất quan trọng! Nhưng còn những toán tử nằm cùng một mức ưu tiên, như nhân và chia thì sao? Chúng có được thực thi cùng lúc không? Không. *, \, % và \\ được thực thi từ trái sang phải, trong khi ** được thực thi từ phải sang trái. Điều này được gọi là tính kết hợp.
Hãy xem ví dụ sau. Trong trường hợp này, các toán tử sẽ được thực thi từ trái sang phải, và kết quả là 3.
Tuy nhiên, bằng cách thêm dấu ngoặc, bạn có thể thay đổi thứ tự thực thi các toán tử. Đó là tính kết hợp, hoạt động giống như trong toán học. Bất cứ thứ gì trong ngoặc sẽ được tính trước. Trong trường hợp này, phép chia lấy phần nguyên được thực hiện trước, sau đó mới đến phép nhân.
Bây giờ bạn đã biết toán tử là gì, cách sử dụng và cách chúng hoạt động. Bạn cũng đã học về nạp chồng, độ ưu tiên và tính kết hợp. Bạn đang đi đúng hướng để trở thành một cao thủ Python! Nếu muốn học thêm nữa, đừng ngần ngại xem khóa học Intermediate Python for Data Science của chúng tôi.
Cũng giống như trong toán học, các ngôn ngữ lập trình như Python có các toán tử. Bạn có thể coi chúng như những hàm cực kỳ đơn giản nằm ở nền tảng của khoa học máy tính. Đây là các phép toán đơn giản nhất mà một chương trình máy tính có thể rút gọn về. Chúng là kiến thức thiết yếu cho bất kỳ ai muốn trở thành Nhà khoa học dữ liệu hoặc Kỹ sư phần mềm.
Trong hướng dẫn này, bạn sẽ tìm hiểu về
Nếu bạn muốn tìm hiểu thêm về những điều cơ bản của Ngôn ngữ lập trình Python, hãy xem khóa học miễn phí Intro to Python for Data Science của chúng tôi.
Toán tử số học
Bạn có lẽ đã quen thuộc với chúng, vì chúng xuất phát từ toán học cơ bản.
Các toán tử số học gồm có cộng (
+), trừ (-), nhân (*), chia (/), lũy thừa (**), chia lấy phần nguyên (//) và chia lấy dư (%). Bốn toán tử đầu khá đơn giản; lần lượt là cộng, trừ, nhân và chia, và có lẽ bạn đã quen với chúng.Ba toán tử còn lại phức tạp hơn một chút. Toán tử lũy thừa có nghĩa là "mũ". Ví dụ,
2 ** 3nghĩa là2được nhân với chính nó3lần, nên2 ** 3tương đương2 * 2 * 2, bằng 8.Chia lấy phần nguyên giống như phép chia thông thường, ngoại trừ việc kết quả luôn được làm tròn xuống. Trong ví dụ dưới đây, 5 chia cho 2 được 2.5. Nhưng vì là chia lấy phần nguyên, 2.5 được làm tròn xuống còn 2.
Cuối cùng, phép chia lấy dư là phần dư sau phép chia. Với
5%2, số 2 chỉ "lọt" được hai lần vào 5, nên phần dư là 1.Trong Python, toán tử cộng cũng có thể dùng để nối chuỗi. Nghĩa là chúng sẽ được ghép thành một chuỗi duy nhất, ví dụ:
Toán tử gán
Nếu bạn đã có chút kinh nghiệm lập trình, chắc chắn bạn đã từng dùng toán tử gán. Chúng gán một giá trị nhất định cho biến. Toán tử được dùng nhiều nhất là
=. Để dùng, chỉ cần gõ tên biến bạn muốn gán giá trị mới, tiếp theo là=, rồi đến giá trị cần gán. Ví dụ, nếu bạn muốn gán giá trị 100 cho biếnbalance, bạn có thể làm như sau:Nếu bạn muốn tăng giá trị của
balancethêm 10, bạn có thể dùngbalance += 10. Câu lệnh này tương đươngbalance = balance + 10, nhưng ngắn gọn hơn nhiều.Tương tự với
-=,balance -= 10giống nhưbalance = balance - 10:Các toán tử gán khác hoạt động theo đúng cách tương tự. Bao gồm:
*=/=**=//=%=Toán tử so sánh
Bạn có thể dùng các toán tử so sánh để, đúng như tên gọi, so sánh giá trị của các biến. Chúng luôn trả về một giá trị boolean, hoặc
TruehoặcFalse. Có sáu toán tử:==!=><>=<=Dưới đây là một số ví dụ so sánh:
==và!=cũng có thể dùng để so sánh chuỗi thay vì số. Các toán tử còn lại không tương thích với chuỗi, vì thật ra không thể nói một chuỗi "lớn hơn" chuỗi khác.Toán tử logic
Có thể bạn đã quen với chúng! Trong logic, chúng được gọi là các liên kết logic. Chúng cũng được dùng rộng rãi trong ngôn ngữ tự nhiên. Đó là:
and,orvànot.andchỉ trả về True nếu cả hai toán hạng (hai đối tượng boolean bạn đang so sánh) đều True. Ví dụ:Để hiểu hành vi của toán tử logic này, bạn có thể dùng bảng chân trị:
orlà True bất cứ khi nào có ít nhất một toán hạng True.Lưu ý rằng chúng cũng hoạt động với nhiều hơn hai toán hạng, ví dụ:
notsẽ trả về giá trị đối nghịch với toán hạng của nó, nênTruenếu đưa vàoFalsevà ngược lại.Nạp chồng toán tử
Hãy nhớ rằng trước đó, bạn đã thấy
+có thể dùng để cộng các số, nhưng cũng có thể dùng để nối, hay kết hợp các chuỗi. Vậy nên+hoạt động khác nhau tùy vào kiểu đối tượng bạn dùng. Nhưng không phải lúc nào cũng vậy. Đôi khi, toán tử bạn đang dùng đơn giản là không hỗ trợ kiểu đối tượng bạn muốn áp dụng.Đây là một ví dụ. Giả sử bạn có hai đối tượng
Dog,ozzyvàfilou. Chúng thuộc lớpDogbên dưới. Bạn có thể coi lớp như một bản thiết kế cho việc đối tượng phải trông như thế nào và hành xử ra sao. Trong trường hợp này, các đối tượngDogcó tên, tuổi và chiều cao. Sau khi lớp được định nghĩa, bạn có thể khởi tạo các đối tượng. Một trong số đó là Ozzy, 3 tuổi và cao 30 cm. Còn lại là Filou, 5 tuổi và cao 65 cm.Ví dụ này sử dụng khái niệm Lập trình hướng đối tượng. Nếu bạn muốn tìm hiểu thêm, hãy đọc hướng dẫn của chúng tôi về Lập trình hướng đối tượng trong Python
Giả sử bạn muốn so sánh hai chú chó bằng toán tử lớn hơn:
>. Điều này sẽ không hoạt động. Bạn sẽ nhận được lỗi'>' not supported between instances of 'Dog' and 'Dog'. Điều đó có nghĩa là>không biết cách so sánh các đối tượng của lớpDog.May mắn là với nạp chồng toán tử, bạn có thể định nghĩa hành vi của toán tử khi được gọi trên các đối tượng
Dog. Trong trường hợp này, cần định nghĩa một phương thức tên__gt__, nghĩa là "greater than" (lớn hơn), nhận vào hai đối số. Vì chúng ta muốn so sánh những chú chó theo chiều cao, phương thức sẽ trả vềself.height > other.height.Độ ưu tiên
Khi bạn kết hợp nhiều toán tử, mọi thứ có thể trở nên rắc rối. Hãy xem ví dụ dưới đây:
Làm sao bạn biết cái nào sẽ được thực thi trước? Bạn nên đọc một dòng mã có nhiều ký hiệu như thế nào? Nó được thực thi từ trái sang phải hay có một thứ tự cụ thể nào đó?
Đây là lúc độ ưu tiên phát huy tác dụng. Toán tử trong Python được thực thi theo một thứ tự rất cụ thể, và một số toán tử có mức ưu tiên cao hơn những toán tử khác.
Trong bảng sau, bạn có thể thấy thứ tự ưu tiên của các toán tử, từ trên xuống dưới. Các quy tắc này giống trong toán học, nơi một số phép tính trong công thức phải được thực hiện trước những phép khác.
Tính kết hợp
Bạn đã thấy rằng độ ưu tiên rất quan trọng! Nhưng còn những toán tử nằm cùng một mức ưu tiên, như nhân và chia thì sao? Chúng có được thực thi cùng lúc không? Không.
*,\,%và\\được thực thi từ trái sang phải, trong khi**được thực thi từ phải sang trái. Điều này được gọi là tính kết hợp.Hãy xem ví dụ sau. Trong trường hợp này, các toán tử sẽ được thực thi từ trái sang phải, và kết quả là 3.
Tuy nhiên, bằng cách thêm dấu ngoặc, bạn có thể thay đổi thứ tự thực thi các toán tử. Đó là tính kết hợp, hoạt động giống như trong toán học. Bất cứ thứ gì trong ngoặc sẽ được tính trước. Trong trường hợp này, phép chia lấy phần nguyên được thực hiện trước, sau đó mới đến phép nhân.
Kết luận
Bây giờ bạn đã biết toán tử là gì, cách sử dụng và cách chúng hoạt động. Bạn cũng đã học về nạp chồng, độ ưu tiên và tính kết hợp. Bạn đang đi đúng hướng để trở thành một cao thủ Python! Nếu muốn học thêm nữa, đừng ngần ngại xem khóa học Intermediate Python for Data Science của chúng tôi.