Tuy nhiên, có rất nhiều thứ bạn có thể làm với các toán tử số học trong Python. Trong hướng dẫn này, bạn sẽ học cách sử dụng rộng rãi các toán tử số học
Trước khi bắt đầu, hãy nhanh chóng tìm hiểu ý nghĩa của các nhóm ưu tiên và ưu tiên số học
Nhóm ưu tiên
Khi có nhiều phép tính số học được xâu chuỗi lại với nhau, trình biên dịch Python cần biết phép tính nào sẽ được đánh giá trước
1 + 2 * 3 ** 4 / 5
Đây là nơi ưu tiên được sử dụng
Nhóm ưu tiên của toán tử số học chỉ định biểu thức thứ tự nào được đánh giá
Đây là nhóm ưu tiên của các toán tử số học trong Python. Toán tử càng cao trên bàn, mức độ ưu tiên càng cao
Toán tửÝ nghĩax + y69Dấu ngoặc đơn
x + y70Số mũ
x + y71,
x + y72,
x + y73,
x + y74Phép nhân, chia, phép chia tầng, môđun
x + y75,
x + y76Cộng, trừ
Bây giờ bạn đã hiểu thế nào là ưu tiên, đã đến lúc tìm hiểu về các toán tử số học trong Python
Phép cộng
Trong Python, bạn có thể cộng hai giá trị số với nhau bằng toán tử cộng [+]
x + y
Ví dụ
x + y0
Toán tử +=
Khi thêm biến, bạn có thể kết hợp toán tử cộng [+] với toán tử gán [=] để tạo thành toán tử gán cộng [+=]
x + y1
Đây là cách viết tắt của
x + y2
Ví dụ
x + y3
Quyền ưu tiên
Toán tử cộng [+] thuộc nhóm ưu tiên thấp nhất với phép trừ
Điều này có nghĩa là bất kỳ hoạt động số học nào khác được thực hiện trước
Ví dụ
x + y4
Ở đây 2 * 3 được tính trước khi cộng nó với 1
Nói cách khác, trình biên dịch Python xem biểu thức trên là
x + y5
Trường hợp bất kỳ biểu thức nào bên trong dấu ngoặc đơn được tính trước
Bây giờ bạn đã hiểu những kiến thức cơ bản về toán tử cộng trong Python
Tiếp theo, chúng ta hãy xem cách sử dụng phép cộng nâng cao hơn
Phương thức __add__[]
Trong Python, bạn có thể cộng các kiểu số với nhau để tạo ra một giá trị số mới biểu thị tổng của hai
Điều này có thể thực hiện được nhờ phương thức __add__[] được triển khai đằng sau hậu trường
Trên thực tế, bất cứ khi nào bạn sử dụng toán tử +, bạn thực sự đang gọi phương thức __add__[] của đối tượng
Bạn có thể xác minh rằng đây là trường hợp bằng cách chạy thử nghiệm đơn giản
x + y6
Hiểu điều này là hữu ích trong một thời điểm
Trong Python, bạn có thể tạo một loại tùy chỉnh bằng cách triển khai một lớp chỉ định loại
Ví dụ: hãy tạo một lớp Cân nặng
x + y7
Bây giờ, hãy xem điều gì sẽ xảy ra khi bạn cố gắng cộng hai đối tượng Trọng lượng lại với nhau
x + y0
Điều này dẫn đến một lỗi
x + y1
Lỗi cho biết bạn không thể sử dụng + trên hai đối tượng Trọng lượng
Đây không phải là một bất ngờ
Làm thế nào trình thông dịch Python thậm chí có thể biết ý nghĩa của việc cộng hai trọng số lại với nhau?
Nhưng có một cách để bạn thực hiện công việc này
Để hỗ trợ thêm các loại tùy chỉnh trong Python, hãy triển khai phương thức __add__[] vào lớp tùy chỉnh
Chẳng hạn, hãy tạo khả năng cộng các đối tượng Trọng lượng lại với nhau bằng cách tính tổng số kilôgam của các đối tượng
x + y2
Phương thức __add__[] lấy hai đối tượng Weight
- bản thân, phía bên tay trái của hoạt động
- otherWeight, phía bên tay phải của hoạt động
Sau đó, nó tính tổng số kg trọng lượng, tạo một đối tượng Trọng lượng mới và trả về nó
Bây giờ bạn có thể cộng hai đối tượng Weight lại với nhau để tạo đối tượng Weight lớn hơn chẳng hạn
x + y0
đầu ra
x + y4
Khá tiện dụng phải không nào?
Bây giờ bạn đã hiểu cách cộng hai đối tượng tùy chỉnh với nhau trong Python bằng phương thức __add__
Nhưng nếu đối tượng bên trái và bên phải không cùng loại thì sao?
Thêm các loại khác nhau
Hãy thử thêm một đối tượng Weight và một int
x + y5
Điều này dẫn đến lỗi sau
x + y6
Điều này là do chúng tôi chưa chỉ định điều gì sẽ xảy ra khi thêm Trọng số vào một đối tượng khác, chẳng hạn như một int
Để hỗ trợ thêm các loại khác nhau, bạn cần mở rộng triển khai phương thức __add__[]
- Nếu vế phải là một số nguyên, chúng ta có thể thêm nó trực tiếp vào số kilogam của đối tượng Trọng lượng
- Nếu phía bên tay phải không phải là một số nguyên, chúng tôi cho rằng đó là Trọng số. Vì vậy, chúng ta cần truy cập số kg trước khi thêm chúng vào phía bên trái
Đây là những gì lớp cập nhật trông giống như
x + y7
Bây giờ bạn có thể cộng các đối tượng Weight và int lại với nhau
x + y8
đầu ra
x + y9
Nhưng có một vấn đề nhỏ
Khi bạn đảo ngược thứ tự của phép cộng
x + y00
Có một lỗi, mặc dù người ta mong đợi nó hoạt động
x + y01
Bây giờ, hãy nghĩ về lý do tại sao điều này xảy ra
Như bạn đã biết, gọi a + b cũng giống như gọi a. __thêm__[b]
Trong đoạn mã bị lỗi, bạn đang gọi 200 + w1, nghĩa là [200]. __thêm__[w1]
Bây giờ, đây là vấn đề
Cố gắng thêm một đối tượng Weight vào một đối tượng int không hoạt động vì int không biết gì về hạng Weight của chúng ta. Điều đó có nghĩa là phương thức __add__ trong lớp int không xử lý việc thêm các đối tượng Trọng lượng
Để khắc phục điều này, bạn cần sửa đổi cách triển khai gốc của kiểu int
Nhưng điều này là không nên
Thay vào đó, Python có một phương thức __radd__[] tích hợp sẵn mà bạn có thể sử dụng để hoán đổi thứ tự của phép cộng
Phương thức __radd__[]
Phương thức __radd__[] là viết tắt của “bổ sung đúng”
ý tưởng thật đơn giản
- Nếu a + b không thành công, hãy gọi b. __radd__[a] được triển khai sao cho a + b không gây ra sự cố
Hãy triển khai phương thức __radd__[] cho lớp Trọng lượng
x + y02
Bây giờ bạn kiểm tra xem nó có hoạt động không
x + y03
đầu ra
x + y4
Đáng kinh ngạc
Bây giờ bạn đã hiểu cách hoạt động của phép cộng trong Python, hãy chuyển sang phép trừ
phép trừ
Trong Python, bạn có thể trừ hai giá trị số với nhau bằng cách sử dụng toán tử trừ [-]
x + y05
Ví dụ
x + y06
Toán tử -=
Khi giảm biến, bạn có thể kết hợp toán tử trừ [-] với toán tử gán [=] để tạo thành toán tử gán trừ [-=]
x + y07
Đây là cách viết tắt của
x + y08
Ví dụ
x + y09
Quyền ưu tiên
Toán tử trừ thuộc nhóm ưu tiên thấp nhất với phép cộng
Điều này có nghĩa là bất kỳ hoạt động số học nào khác được tính trước
Ví dụ
x + y10
Ở đây 2 * 3 được tính trước khi lấy 1 trừ đi
Nói cách khác, trình biên dịch Python xem biểu thức trên là
x + y11
Chúng ta hãy xem xét một số cách sử dụng nâng cao của toán tử trừ
Phương thức __sub__[]
Trong Python, bạn có thể trừ hai loại số với nhau để tạo ra một giá trị mới thể hiện sự khác biệt giữa hai loại
Điều này có thể thực hiện được nhờ phương thức __sub__[] đằng sau hậu trường
Nguyên tắc hoạt động hoàn toàn giống với phương thức __add__[] ở phần trước
Bất cứ khi nào bạn sử dụng toán tử –, bạn thực sự đang gọi phương thức __sub__[]
x + y12
Trong Python, bạn có thể tạo một loại tùy chỉnh bằng cách triển khai một lớp chỉ định loại
Ví dụ: hãy tiếp tục với lớp Trọng lượng được triển khai trong chương trước
x + y7
Bây giờ, hãy xem điều gì sẽ xảy ra khi bạn cố gắng trừ hai đối tượng Trọng lượng
x + y14
Điều này dẫn đến lỗi sau
x + y15
Lỗi cho biết bạn không thể sử dụng – trên hai đối tượng Trọng lượng
Tuy nhiên, có một cách để bạn thực hiện công việc này
Để hỗ trợ phép trừ với các loại tùy chỉnh, hãy triển khai phương thức __sub__[] vào lớp tùy chỉnh
Chẳng hạn, hãy để có thể trừ các đối tượng Trọng lượng với nhau bằng cách trừ đi số kilôgam của các đối tượng
x + y16
Phương thức __sub__[] lấy hai đối tượng Weight
- bản thân, phía bên tay trái của hoạt động
- otherWeight, phía bên tay phải của hoạt động
Nó trừ đi số kg của trọng lượng, tạo một đối tượng Trọng lượng mới và trả về nó
Bây giờ bạn có thể trừ hai đối tượng Trọng lượng để lấy chênh lệch trọng lượng dưới dạng đối tượng Trọng lượng mới
x + y14
đầu ra
x + y18
Nhưng nếu đối tượng bên trái và bên phải không cùng loại thì sao?
Trừ các loại khác nhau
Hãy thử trừ một số nguyên từ Trọng lượng
x + y19
Điều này ném một lỗi
x + y6
Chúng tôi chưa chỉ định điều gì sẽ xảy ra khi trừ một thứ khác ngoài Trọng lượng từ một đối tượng Trọng lượng. Đây là lý do tại sao đoạn mã trên không hoạt động
Để thực hiện phép trừ các loại khác nhau, hãy mở rộng triển khai phương thức __sub__[]
- Nếu vế phải là một số nguyên, chúng ta có thể trừ trực tiếp nó ra khỏi đơn vị kilôgam
- Nếu phía bên tay phải không phải là một số nguyên, chúng tôi cho rằng đó là Trọng số. Vì vậy, chúng ta cần truy cập số kg trước khi trừ
x + y21
Bây giờ nó hoạt động
x + y19
đầu ra
x + y18
Nhưng còn một vấn đề nữa
Khi bạn đảo ngược thứ tự của phép trừ
x + y24
Có một lỗi, mặc dù người ta mong đợi nó hoạt động
x + y25
Như bạn đã biết, gọi a – b cũng giống như gọi a. __phụ__[b]
Ở trên, bạn đang gọi 150 – w1, nghĩa là [150]. __phụ__[w1]
Đây là vấn đề
Cố gắng trừ một đối tượng Trọng lượng khỏi một đối tượng int không hoạt động vì kiểu int tích hợp không có ý tưởng về lớp Trọng lượng
Để khắc phục sự cố, bạn cần thực hiện các thay đổi đối với kiểu int tích hợp. Nhưng điều này sẽ là xấu