CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN Advanced Use of Mathematical Operators in Python này được tác giả thu thập và sắp xếp. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
Hành vi của một đối tượng trong Python được xác định bởi kiểu của đối tượng đó. Cái gọi là kiểu hỗ trợ một số hoạt động cụ thể. Đối tượng số là thành phần cơ bản trong bất kỳ ngôn ngữ lập trình nào và hỗ trợ các phép toán như cộng, trừ, nhân và chia. Các đối tượng số của Python bao gồm số nguyên và số dấu phẩy động, và hỗ trợ nhiều phép toán khác nhau, chẳng hạn như +, -, *, /, v.v. Nếu không có các toán tử này, chương trình chỉ có thể sử dụng các lệnh gọi hàm để thực hiện các phép toán, chẳng hạn như add(2, 3), sub(5, 2). Chức năng của các toán tử trong chương trình tương tự như các phép toán thông thường, dễ sử dụng và trực quan hơn. Trong Python, các toán tử này được triển khai bằng cách định nghĩa một số phương thức đặc biệt của đối tượng, chẳng hạn như object.__add__() và object.__sub__(). Nếu người dùng triển khai các phương pháp đặc biệt trên khi định nghĩa lớp của riêng mình, họ có thể khiến các đối tượng của lớp tùy chỉnh hỗ trợ các phép toán tương ứng, do đó mô phỏng hành vi của các đối tượng kỹ thuật số. Trên thực tế, điều này đạt được hiệu ứng quá tải toán tử.
Ở đây, chúng tôi triển khai một lớp số Trung Quốc hỗ trợ các phép toán cộng để minh họa cách triển khai một lớp hỗ trợ các phép toán phổ biến trong Python. Định nghĩa cơ bản của lớp ChineseNumber như sau.
?
1
2
3
4
5
6
7
8
9
10
11
12
|
lớp học
Tiếng TrungSố:
định nghĩa
__khởi tạo__(
bản thân
, N):
bản thân
.số
=
N
bản thân
.bảng chữ cái
=
[bạn
'không'
, bạn
'một'
, bạn
'hai'
, bạn
'ba'
, bạn
'Bốn'
,
bạn
'năm'
, bạn
'sáu'
, bạn
'bảy'
, bạn
'tám'
, bạn
'Chín'
, bạn
'mười'
]
định nghĩa
__str__(
bản thân
):
dấu hiệu
=
'gánh nặng'
nếu như
bản thân
.số <
0
khác
''
trở lại
dấu hiệu
+
''.tham gia([
bản thân
.bảng chữ cái[
số nguyên
(S)]
vì
S
TRONG
đường
(
bụng
(
bản thân
.số))])
định nghĩa
__repr__(
bản thân
):
trở lại
bản thân
.__str__()
|
Hiện nay, hiệu quả đạt được như sau:
?
1
2
3
4
5
6
|
>>> một
=
Tiếng TrungSố(
2
)
>>> một
hai
>>>
in
(Một)
hai
|
.
Nhìn chung, khi định nghĩa một lớp cho các toán tử toán học, bạn triển khai phương thức __add__() để thêm toán tử + vào lớp. Thêm phương thức sau vào ChineseNumber:
?
1
2
3
4
5
6
7
|
định nghĩa
__thêm vào__(
bản thân
, khác):
nếu như
kiểu
(khác)
là
Tiếng TrungSố:
trở lại
Tiếng TrungSố(
bản thân
.số
+
other.num)
nếu
kiểu
(khác)
là
số nguyên
:
trở lại
Tiếng TrungSố(
bản thân
.số
+
khác)
khác
:
trở lại
Chưa thực hiện
|
Lúc này, đối tượng ChineseNumber có thể sử dụng +.
?
1
2
3
4
5
6
7
|
>>> a, b
=
Tiếng TrungSố(
2
), Số Trung Quốc(
10
)
>>> một
+
b
mười hai
>>> một
+
5
bảy
>>> một
+
3.7
TypeError: toán hạng không được hỗ trợ
kiểu
(S)
vì
+
:
'Số Trung Quốc'
Và
'trôi nổi'
|
Đối với +, a + b tương đương với việc gọi a.__add__(b). Tương tự, các toán tử toán học khác có thể được định nghĩa, hãy xem bảng bên dưới.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
sự vật
.__thêm vào__(
bản thân
, khác):
+
sự vật
.__phụ__(
bản thân
, khác):
-
sự vật
.__mul__(
bản thân
, khác):
*
sự vật
.__matmul__(
bản thân
, khác): @
sự vật
.__truediv__(
bản thân
, khác):
/
sự vật
.__floordiv__(
bản thân
, khác):
/
/
sự vật
.__sửa__(
bản thân
, khác):
%
sự vật
.__divmod__(
bản thân
, khác):
divmod
,
divmod
(a, b)
=
(Một
/
b, một
%
b)
sự vật
.__bụp__(
bản thân
, khác[,modulo]):
*
*
,
bột
()
sự vật
.__lshift__(
bản thân
, khác): <<
sự vật
.__rshift__(
bản thân
, khác): >>
sự vật
.__Và__(
bản thân
, khác): &
sự vật
.__xor__(
bản thân
, khác): ^
sự vật
.__hoặc__(
bản thân
, khác): |
|
Các toán tử toán học có toán hạng đảo ngược (Toán hạng phản chiếu/hoán đổi).
?
1
2
|
>>>
2
+
Một
TypeError: toán hạng không được hỗ trợ
kiểu
(S)
vì
+
:
'int'
Và
'Số Trung Quốc'
|
2 là kiểu số nguyên và phương thức __add__() của nó không hỗ trợ các đối tượng của lớp ChineseNumber, do đó xảy ra lỗi trên. Việc xác định các toán tử toán học với toán hạng đảo ngược có thể giải quyết được vấn đề này. Thêm phương thức __radd__() vào lớp ChineseNumber để triển khai phép toán + với toán hạng đảo ngược.
?
1
2
|
định nghĩa
__rồi__(
bản thân
, khác):
trở lại
bản thân
.__thêm__(khác)
|
Đối với a + b, nếu a không định nghĩa phương thức __add__(), Python sẽ thử gọi phương thức __radd__() của b. Trong trường hợp này, a + b tương đương với việc gọi b.__radd__(a).
?
1
2
3
|
>>> một
=
Tiếng TrungSố(
2
)
>>>
2
+
Một
Bốn
|
Tương tự như vậy, các toán tử toán học khác có phép đảo ngược toán hạng cũng có thể được định nghĩa, hãy xem bảng bên dưới.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
đối tượng.__radd__(bản thân, khác): +
đối tượng.__rsub__(bản thân, khác): -
đối tượng.__rmul__(bản thân, khác): *
đối tượng.__rmatmul__(bản thân, khác): @
đối tượng.__rtruediv__(bản thân, khác): /
đối tượng.__rfloordiv__(bản thân, khác): //
đối tượng.__rmod__(bản thân, khác): %
đối tượng.__rdivmod__(bản thân, khác): divmod, divmod(a, b) = (b/a, b%a)
đối tượng.__rpow__(bản thân, khác[,modulo]): **, pow()
đối tượng.__rlshift__(bản thân, khác): <<
đối tượng.__rrshift__(bản thân, khác): >>
đối tượng.__rand__(bản thân, khác): &
đối tượng.__rxor__(bản thân, khác): ^
đối tượng.__record__(bản thân, khác): |
|
Toán tử gán phép tính Toán tử gán phép tính sử dụng một toán tử duy nhất để hoàn tất các phép tính và gán, ví dụ a += b tương đương với việc gọi a = a + b. Thêm phương thức __iadd__() vào ChineseNumber để triển khai toán tử +=.
?
1
2
3
4
5
6
7
8
9
|
định nghĩa
__tôi__(
bản thân
, khác):
nếu như
kiểu
(khác)
là
Tiếng TrungSố:
bản thân
.số
+
=
số khác
trở lại
bản thân
nếu
kiểu
(khác)
là
số nguyên
:
bản thân
.số
+
=
khác
trở lại
bản thân
khác
:
trở lại
Chưa thực hiện
|
vào thời điểm này, .
?
1
2
3
4
5
6
7
|
>>> a, b
=
Tiếng TrungSố(
2
), Số Trung Quốc(
10
)
>>> một
+
=
b
>>> một
mười hai
>>> một
+
7
>>> một
mười chín
|
Tương tự như vậy, các toán tử gán phép toán khác cũng có thể được định nghĩa, hãy xem bảng bên dưới.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
|
sự vật
.__iadd__(
bản thân
, khác):
+
=
sự vật
.__isub__(
bản thân
, khác):
-
=
sự vật
.__imul__(
bản thân
, khác):
*
=
sự vật
.__imatmul__(
bản thân
, khác): @
=
sự vật
.__itruediv__(
bản thân
, khác):
/
=
sự vật
.__ifloordiv__(
bản thân
, khác):
/
/
=
sự vật
.__imod__(
bản thân
, khác):
%
=
sự vật
.__ipow__(
bản thân
, khác[,modulo]):
*
*
=
sự vật
.__chuyển đổi__(
bản thân
, khác): <<
=
sự vật
.__chuyển đổi __(
bản thân
, khác): >>
=
sự vật
.__và__(
bản thân
, khác): &
=
sự vật
.__ixor__(
bản thân
, khác): ^
=
sự vật
.__tôi__(
bản thân
, khác): |
=
|
Toán tử toán học một ngôi Toán tử toán học một ngôi là các phép toán chỉ có một toán hạng, chẳng hạn như toán tử - để phủ định các số. - Hàm đặc biệt tương ứng là __neg__(). Thêm phương thức __neg__() cho ChineseNumber.
?
1
2
|
định nghĩa
__phủ__(
bản thân
):
trở lại
Tiếng TrungSố(
-
bản thân
.số)
|
Tại thời điểm này, đối tượng ChineseNumber hỗ trợ thao tác -.
?
1
2
3
|
>>> một
=
Tiếng TrungSố(
5
)
>>>
-
Một
Âm năm
|
Xem bảng bên dưới để biết các toán tử đơn vị khác.
?
1
2
3
4
5
6
7
8
9
|
đối tượng.__neg__(bản thân): -
đối tượng.__pos__(bản thân): +
đối tượng.__abs__(bản thân): abs()
đối tượng.__invert__(bản thân): ~
đối tượng.__complex__(self): phức tạp()
đối tượng.__int__(bản thân): int()
đối tượng.__float__(bản thân): float()
đối tượng.__round__(self): vòng()
đối tượng.__index__(self): toán tử.index()
|
Cuối cùng, bài viết này về cách sử dụng nâng cao các toán tử toán học trong Python ở đây. Nếu bạn muốn biết thêm về cách sử dụng nâng cao các toán tử toán học trong Python, vui lòng tìm kiếm các bài viết trên CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!