@Rosuav Tôi không nghĩ rằng “giá trị không phải là giá trị” có nhiều vấn đề. Python đã có None
, NaN
và Ellipsis
Tất cả đều là những giá trị rất chắc chắn. Nếu None
tình cờ trở thành giá trị mặc định cho một đối số, thì không thể phân biệt được với việc không chuyển đối số đó, nhưng điều đó cũng giống như bất kỳ đối số nào khác [ví dụ: có nhiều chỗ mà số 0 hoạt động như một giá trị không] và trong . Hơn nữa, Ellipsis là một giá trị hoàn toàn bình thường được diễn giải một cách đặc biệt. “NaN” hơi khác một chút, vì nó không phải là một giá trị cụ thể mà là toàn bộ danh mục float [gọi “NaN” là một giá trị giống như gọi “khoảng trắng” là một giá trị - nhiều chuỗi riêng biệt có thể không có gì ngoài khoảng trắng], với đặc biệt . Tất cả những thứ này hoạt động hoàn toàn lành mạnh trong từ điển, các lớp tùy chỉnh, v.v.
>>> {None: None}
{None: None}
>>> n1, n2 = float["nan"], float["nan"]
>>> d = {n1: "n1", n2: "n2"}
>>> d[n1]
'n1'
>>> d[n2]
'n2'
>>> class MyDict:
.. def __init__[self]: self.store = {}
.. def __setitem__[self, key, value]:
.. print["Setting", key, "to", value]
.. self.store[key] = value
.. def __getitem__[self, key]:
.. print["Retrieving", key]
.. return self.store[key]
..
>>> d = MyDict[]
>>> d[n1] = "n1"
Setting nan to n1
>>> d[n2] = "n2"
Setting nan to n2
>>> d.store
{nan: 'n1', nan: 'n2'}
>>> d[n1]
Retrieving nan
'n1'
>>> d[n2]
Retrieving nan
'n2'
Theo mọi cách, đây LÀ những giá trị. Chúng không giống như giá trị “NULL” trong SQL mà đôi khi không phải là một giá trị, cũng không giống như các con trỏ null trong C, nhưng chúng là những giá trị hoàn toàn hợp lý trong mọi ngữ cảnh
Default
này sẽ không hành xử theo cách đó. Nó sẽ phải có một số phép thuật thay đổi hành vi đó khi nó được truyền dưới dạng tham số chức năng
00. 00 Giá trị mặc định nâng cao. Giả sử bạn muốn cung cấp một giá trị mặc định cho Deck
. Ví dụ, sẽ thuận tiện nếu Deck[]
tạo một bộ bài 52 quân bài kiểu Pháp thông thường
00. 14 Đầu tiên, chỉ định các cấp bậc và bộ quần áo khác nhau. Sau đó, thêm một hàm make_french_deck[]
để tạo danh sách các phiên bản của PlayingCard
00. 51 Ở đây, bốn bộ quần áo khác nhau được chỉ định bằng các ký hiệu Unicode của chúng. Chúng tôi có thể làm điều này bằng Python vì nó hỗ trợ viết mã nguồn theo UTF-8 theo mặc định
01. 04 Trang Wikipedia về đầu vào Unicode cung cấp một số trợ giúp về cách nhập các ký tự Unicode. Bạn cũng có thể nhập các ký hiệu Unicode cho các bộ quần áo bằng cách sử dụng các ký tự thoát Unicode None
0 hoặc các ký tự có tên None
1 thoát ra như nhìn thấy trên màn hình. Nếu bạn gặp sự cố khi nhập các mã này, chúng sẽ được đưa vào tệp tài nguyên khóa học để cho phép bạn sao chép và dán các dòng thích hợp vào REPL của mình
01. 32 Để đơn giản hóa việc so sánh các quân bài sau này, thứ hạng và chất cũng được liệt kê theo thứ tự thông thường của chúng. Về lý thuyết, giờ đây bạn có thể sử dụng chức năng này để chỉ định giá trị mặc định cho None
2
02. 04 Như bạn có thể thấy, bạn không nên làm điều này. Điều này sẽ giới thiệu một trong những mẫu chống phổ biến nhất trong Python. sử dụng các đối số mặc định có thể thay đổi. Vấn đề là tất cả các phiên bản của Deck
sẽ sử dụng cùng một đối tượng danh sách làm giá trị mặc định của thuộc tính None
4
02. 21 Điều này có nghĩa là nếu, giả sử, một thẻ bị xóa khỏi một Deck
, thì thẻ đó cũng biến mất khỏi tất cả các phiên bản khác của Deck
. Các lớp dữ liệu ngăn cản bạn làm điều này, vì mã đã tăng Deck[]
1. Thay vào đó, các lớp dữ liệu sử dụng thứ gọi là Deck[]
2 để xử lý các giá trị mặc định có thể thay đổi. Để sử dụng Deck[]
2 và nhiều tính năng thú vị khác của các lớp dữ liệu, bạn cần sử dụng trình xác định Deck[]
4
03. 07 Đối số của Deck[]
2 có thể là bất kỳ tham số 0 nào có thể gọi được. Giờ đây, thật dễ dàng để tạo một bộ bài đầy đủ. Trình xác định Deck[]
4 được sử dụng để tùy chỉnh từng trường của một lớp dữ liệu riêng lẻ
03. 25 Bạn sẽ thấy một số ví dụ khác sau. Để tham khảo, đây là các thông số mà Deck[]
4 hỗ trợ. Deck[]
8. giá trị mặc định của trường. Deck[]
2. một hàm trả về giá trị ban đầu của trường. make_french_deck[]
0. liệu trường có được sử dụng trong phương thức make_french_deck[]
1 hay không. Mặc định là make_french_deck[]
2
03. 46 make_french_deck[]
3. sử dụng trường trong make_french_deck[]
3 của đối tượng. Mặc định là make_french_deck[]
2. make_french_deck[]
6. bao gồm trường trong so sánh. Mặc định là make_french_deck[]
2
03. 56 make_french_deck[]
8. bao gồm trường khi tính toán make_french_deck[]
9. Mặc định là sử dụng giống như đối với make_french_deck[]
6. PlayingCard
1. một ánh xạ với thông tin về lĩnh vực này. Trong ví dụ về PlayingCard
2, bạn đã thấy cách thêm các giá trị mặc định đơn giản bằng cách viết PlayingCard
3. Tuy nhiên, nếu bạn cũng muốn tùy chỉnh trường, ví dụ để ẩn nó trong make_french_deck[]
3, bạn cần sử dụng tham số Deck[]
8 như được thấy trên màn hình
04. 25 Bạn không được chỉ định cả Deck[]
8 và Deck[]
2. Tham số PlayingCard
1 không được sử dụng bởi chính các lớp dữ liệu nhưng có sẵn cho bạn hoặc các gói của bên thứ ba để đính kèm thông tin vào các trường. Ví dụ, trong ví dụ về PlayingCard
2, bạn có thể chỉ định rằng vĩ độ và kinh độ phải được tính theo độ
05. 21 Siêu dữ liệu và thông tin khác về một trường có thể được truy xuất bằng hàm None
00
05. 35 Như bạn có thể thấy, có khá nhiều thông tin ở đó, nhưng thật dễ dàng để chọn chỉ một phần thông tin mà chúng ta quan tâm
05. 56 Trong phần tiếp theo của khóa học, bạn sẽ thấy cách bạn có thể thay đổi diện mạo của các đối tượng lớp dữ liệu