Nếu bạn đã thực hiện bất kỳ mã hóa nào trong Python, rất có thể bạn đã sử dụng một số trong một trong các chương trình của mình. Chẳng hạn, bạn có thể đã sử dụng một số nguyên để chỉ định chỉ mục của một giá trị trong danh sách
Nhưng có nhiều thứ hơn về số trong Python ngoài giá trị thô của chúng. Hãy xem ba điều về các con số trong Python mà bạn có thể không biết
#1 - Số Có Phương Pháp
Khá nhiều thứ trong Python là một đối tượng. Một trong những đối tượng đầu tiên bạn tìm hiểu về Python là đối tượng
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
7 để biểu diễn các chuỗi. Có thể bạn đã thấy cách các chuỗi có các phương thức, chẳng hạn như phương thức >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
8, trả về một chuỗi mới với tất cả các ký tự chữ thường>>> "HELLO".lower[]
'hello'
Các số trong Python cũng là các đối tượng và giống như chuỗi, có các phương thức riêng. Ví dụ: bạn có thể chuyển đổi một số nguyên thành một chuỗi byte bằng phương thức
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
9>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
Tham số
>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
0 chỉ định số byte sẽ sử dụng trong chuỗi byte và tham số >>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
1 xác định thứ tự của các byte. Ví dụ: đặt >>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
1 thành >>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
3 trả về chuỗi byte có byte quan trọng nhất trước và đặt >>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
1 thành >>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
5 đặt byte ít quan trọng nhất trước255 là số nguyên lớn nhất có thể được biểu diễn dưới dạng số nguyên 8 bit, vì vậy bạn có thể đặt
>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
6 trong >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
9 mà không gặp vấn đề gì>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
Tuy nhiên, nếu bạn đặt
>>> n.to_bytes[length=1, byteorder="big"]
b'\xff'
6 trong >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
9 cho 256, bạn sẽ nhận được một >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
60>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
6Bạn có thể chuyển đổi một chuỗi byte thành một số nguyên bằng phương thức lớp
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
61>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
9Các phương thức lớp được gọi từ tên lớp thay vì thể hiện của lớp, đó là lý do tại sao phương thức
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
61 được gọi trên >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
63 ở trên🤓
Mọt sách nhỏ. 1729 là số nguyên dương nhỏ nhất có thể được viết dưới dạng tổng của hai lập phương dương theo hai cách khác nhau — một sự thật được gán cho nhà toán học Ấn Độ Srinivasa Ramanujan, người đã tiết lộ tính chất này cho người cố vấn của mình là G. h. cứng rắn.
"Tôi [Hardy] nhớ một lần đến gặp anh ấy [Ramanujan] khi anh ấy bị ốm ở Putney. Tôi đã đi trên chiếc taxi số 1729 và nhận xét rằng con số này đối với tôi có vẻ khá buồn tẻ và tôi hy vọng đó không phải là một điềm xấu. “Không,” anh ấy trả lời, “đó là một con số rất thú vị; . '"
Một trong những cách bạn có thể biểu diễn 1729 dưới dạng tổng của hai lập phương là 1³ + 12³. Bạn có thể tìm cách khác không?
Số dấu phẩy động cũng có phương thức. Có lẽ phương pháp hữu ích nhất cho số float là
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
64 được sử dụng để kiểm tra xem một số float có phần phân số hay không>>> "HELLO".lower[]
'hello'
3Một phương thức float thú vị là phương thức
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
65, trả về một bộ chứa tử số và mẫu số của phân số biểu thị giá trị dấu phẩy động>>> "HELLO".lower[]
'hello'
5Tuy nhiên, do lỗi biểu diễn dấu phẩy động, phương thức này có thể trả về một số giá trị không mong muốn
>>> "HELLO".lower[]
'hello'
6Nếu cần, bạn có thể gọi các phương thức số trên các chữ số bằng cách bao quanh các chữ bằng dấu ngoặc đơn
>>> "HELLO".lower[]
'hello'
7Nếu bạn không bao quanh một chữ số nguyên bằng dấu ngoặc đơn, bạn sẽ thấy một ____166 khi bạn gọi một phương thức — mặc dù, lạ thay, bạn không cần dấu ngoặc đơn với chữ số dấu phẩy động
>>> "HELLO".lower[]
'hello'
9Bạn có thể tìm thấy danh sách đầy đủ các phương thức có sẵn trên các loại số của Python trong tài liệu
#2 - Các số có thứ bậc
Trong toán học, các con số có một hệ thống phân cấp tự nhiên. Ví dụ: mọi số tự nhiên đều là số nguyên, mọi số nguyên là số hữu tỉ, mọi số hữu tỉ là số thực và mọi số thực đều là số phức
Điều này cũng đúng với các số trong Python. “Tháp số” này được thể hiện thông qua các kiểu trừu tượng có trong mô-đun
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
67Tháp số
Mỗi số trong Python là một thể hiện của lớp
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
68>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
0Nếu bạn cần kiểm tra xem một giá trị trong Python có phải là số hay không, nhưng bạn không quan tâm giá trị đó thuộc loại số nào, hãy sử dụng
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
69Python đi kèm với bốn loại trừu tượng bổ sung có hệ thống phân cấp, bắt đầu bằng loại số chung nhất, như sau
- Lớp
90 được sử dụng để biểu diễn các số phức. Có 1 loại>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
90 bê tông lắp sẵn.>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
92>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
- Lớp
93 được sử dụng để biểu diễn các số thực. Có một loại>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
94 bê tông lắp sẵn.>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
95>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
- Lớp
96 được sử dụng để biểu diễn các số hữu tỉ. Có 1 loại>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
96 bê tông lắp sẵn.>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
98>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
- Lớp
99 được sử dụng để biểu diễn các số nguyên. Có hai loại>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
99 bê tông tích hợp.>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
63 và>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
32>>> "HELLO".lower[] 'hello'
Đợi đã. Giá trị
>>> "HELLO".lower[]
'hello'
32 là số?. Đúng. Bạn có thể xác minh tất cả những điều này trong REPL của mình>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
1Thoạt nhìn, mọi thứ dường như đúng ở đây — ngoài các giá trị
>>> "HELLO".lower[]
'hello'
32 là số, có lẽ🐍
Tính đặc thù của Python. Vì loại
>>> "HELLO".lower[]
'hello'
32 là >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
99 — trên thực tế, >>> "HELLO".lower[]
'hello'
32 kế thừa trực tiếp từ >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
63 — bạn có thể thực hiện một số nội dung khá kỳ lạ với >>> "HELLO".lower[]
'hello'
39 và >>> "HELLO".lower[]
'hello'
50. Ví dụ: bạn có thể sử dụng
>>> "HELLO".lower[]
'hello'
39 làm chỉ mục để nhận giá trị thứ hai của một lần lặp. Nếu bạn chia một số cho >>> "HELLO".lower[]
'hello'
50, bạn sẽ gặp lỗi >>> "HELLO".lower[]
'hello'
53. Thử chạy
>>> "HELLO".lower[]
'hello'
54 và >>> "HELLO".lower[]
'hello'
55 trong REPL của bạn. Tuy nhiên, hãy xem xét kỹ hơn, có một số điều hơi kỳ lạ về hệ thống phân cấp số của Python
Số thập phân không vừa
Có bốn kiểu số cụ thể tương ứng với bốn kiểu trừu tượng trong tháp số Pythons.
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
92, >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
95, >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
98 và >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
63. Nhưng Python có loại số thứ năm, lớp >>> "HELLO".lower[]
'hello'
60, được sử dụng để biểu diễn chính xác các số thập phân và khắc phục các hạn chế của số học dấu phẩy độngBạn có thể đoán rằng số
>>> "HELLO".lower[]
'hello'
60 là số >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94, nhưng bạn đã nhầm>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
2Trên thực tế, loại duy nhất mà số
>>> "HELLO".lower[]
'hello'
60 kế thừa là lớp >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
68 của Python>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
3Điều hợp lý là
>>> "HELLO".lower[]
'hello'
60 không kế thừa từ >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
99. Ở một mức độ nào đó, cũng có nghĩa là >>> "HELLO".lower[]
'hello'
60 không kế thừa từ >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
96. Nhưng tại sao >>> "HELLO".lower[]
'hello'
60 không kế thừa từ >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94 hoặc >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
90?Câu trả lời nằm trong mã nguồn CPython
Số thập phân có tất cả các phương thức được chỉ định bởi94 abc, nhưng nó không nên được đăng ký dưới dạng>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
94 vì số thập phân không tương tác với số float nhị phân [i. e.>>> n = 255 >>> n.to_bytes[length=2, byteorder="big"] b'\x00\xff'
74 không xác định]. Tuy nhiên, thực tế trừu tượng dự kiến sẽ tương tác với nhau [i. e. R1 + R2 sẽ hoạt động nếu R1 và R2 đều là Số thực]>>> "HELLO".lower[] 'hello'
Tất cả tập trung vào việc thực hiện
Phao thật kỳ lạ
Một mặt, số float triển khai lớp cơ sở trừu tượng
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94 và được sử dụng để biểu diễn số thực. Nhưng nhờ các ràng buộc bộ nhớ hữu hạn, các số dấu phẩy động chỉ là các xấp xỉ hữu hạn của các số thực. Điều này dẫn đến các ví dụ khó hiểu, như sau>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
4Các số dấu phẩy động được lưu trữ trong bộ nhớ dưới dạng phân số nhị phân, nhưng điều này gây ra một số vấn đề. Giống như phân số \[\frac{1}{3}\] không có biểu diễn thập phân hữu hạn — có vô số phần ba sau dấu thập phân — phân số \[\frac{1}{10}\] không có nhị phân hữu hạn
Nói cách khác, bạn không thể lưu trữ 0. 1 trên máy tính với độ chính xác tuyệt đối — trừ khi máy tính đó có bộ nhớ vô hạn
Từ quan điểm toán học nghiêm ngặt, tất cả các số dấu phẩy động đều là số hữu tỉ — ngoại trừ
>>> "HELLO".lower[]
'hello'
76 và >>> "HELLO".lower[]
'hello'
77. Nhưng các lập trình viên sử dụng chúng để tính gần đúng các số thực và phần lớn coi chúng là số thực🐍
Tính đặc thù của Python.
>>> "HELLO".lower[]
'hello'
77 là một giá trị dấu phẩy động đặc biệt đại diện cho các giá trị "không phải là số" — thường được viết tắt là giá trị >>> "HELLO".lower[]
'hello'
79. Nhưng vì >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
95 là một kiểu số, nên >>> "HELLO".lower[]
'hello'
91 trả về >>> "HELLO".lower[]
'hello'
39. Đúng vậy. giá trị "không phải là số" là số.
Phao thật kỳ lạ
#3 - Số có thể mở rộng
Các kiểu cơ sở số trừu tượng của Python cho phép bạn tạo các kiểu số cụ thể và trừu tượng tùy chỉnh của riêng bạn
Ví dụ, hãy xem xét lớp
>>> "HELLO".lower[]
'hello'
93 sau đây thực hiện các số có dạng \[a + b\sqrt{p}\] trong đó \[a\] và \[b\] là số nguyên và \[p\] là số nguyên tố [ >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
5Bạn cần triển khai nhiều phương thức dunder để đảm bảo loại cụ thể thực hiện giao diện
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94. Bạn cũng phải xem xét các phương thức như >>> "HELLO".lower[]
'hello'
95 và >>> "HELLO".lower[]
'hello'
96 tương tác với các loại >>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
94 khác như thế nào❗
Ghi chú. Không có nghĩa là ví dụ trên được dự định là hoàn chỉnh - cũng không hoàn toàn chính xác, đối với vấn đề đó. Mục đích duy nhất của nó trong cuộc sống là cho bạn nếm trải những gì có thể
Với việc triển khai
>>> "HELLO".lower[]
'hello'
93, giờ đây bạn có thể làm những việc như thế này>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
6Hệ thống phân cấp số của Python khá linh hoạt. Nhưng, tất nhiên, bạn phải luôn cẩn thận khi triển khai các kiểu bắt nguồn từ các kiểu cơ sở trừu tượng tích hợp sẵn. Bạn cần chắc chắn rằng họ chơi tốt với những người khác
Có một số mẹo trong tài liệu dành cho người triển khai loại mà bạn nên đọc trước khi triển khai các loại số tùy chỉnh. Cũng rất hữu ích khi xem qua việc triển khai
>>> n = 255
>>> n.to_bytes[length=2, byteorder="big"]
b'\x00\xff'
98Phần kết luận
Vì vậy, có bạn có nó. Ba điều [có thể cộng thêm nhiều điều nữa] mà bạn có thể chưa biết về các con số trong Python