Là gì dict.get()
phương pháp?
Như đã đề cập, get
phương thức chứa một tham số bổ sung cho biết giá trị còn thiếu. Từ tài liệu
get(key[, default])
Trả về giá trị cho khóa nếu khóa nằm trong từ điển, mặc định khác. Nếu mặc định không được đưa ra, nó mặc định là Không có, do đó phương thức này không bao giờ tăng a KeyError
.
Một ví dụ có thể là
>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1
Có cải thiện tốc độ ở bất cứ đâu?
Như đã đề cập ở đây ,
Dường như cả ba cách tiếp cận hiện đều thể hiện hiệu suất tương tự (trong khoảng 10% so với nhau), ít nhiều độc lập với các thuộc tính của danh sách các từ.
Trước đó get
chậm hơn đáng kể, tuy nhiên bây giờ tốc độ gần như tương đương cùng với lợi thế bổ sung là trả về giá trị mặc định. Nhưng để xóa tất cả các truy vấn của chúng tôi, chúng tôi có thể kiểm tra trên một danh sách khá lớn (Lưu ý rằng kiểm tra chỉ bao gồm tìm kiếm tất cả các khóa hợp lệ)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Bây giờ tính thời gian hai chức năng này bằng cách sử dụng timeit
>>> import timeit
>>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway"))
20.2124660015
>>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup"))
16.16223979
Như chúng ta có thể thấy việc tra cứu nhanh hơn get vì không có chức năng tra cứu. Điều này có thể được nhìn thấy thông quadis
>>> def lookup(d,val):
... return d[val]
...
>>> def getway(d,val):
... return d.get(val)
...
>>> dis.dis(getway)
2 0 LOAD_FAST 0 (d)
3 LOAD_ATTR 0 (get)
6 LOAD_FAST 1 (val)
9 CALL_FUNCTION 1
12 RETURN_VALUE
>>> dis.dis(lookup)
2 0 LOAD_FAST 0 (d)
3 LOAD_FAST 1 (val)
6 BINARY_SUBSCR
7 RETURN_VALUE
Nó sẽ hữu ích ở đâu?
Nó sẽ hữu ích bất cứ khi nào bạn muốn cung cấp một giá trị mặc định bất cứ khi nào bạn đang tra từ điển. Điều này làm giảm
if key in dic:
val = dic[key]
else:
val = def_val
Đến một dòng val = dic.get(key,def_val)
Nó sẽ KHÔNG hữu ích ở đâu?
Bất cứ khi nào bạn muốn trả lại một thông KeyError
báo rằng khóa cụ thể không có sẵn. Trả lại một giá trị mặc định cũng có rủi ro rằng một giá trị mặc định cụ thể cũng có thể là một khóa!
Có thể có get
tính năng như trong dict['key']
?
Đúng! Chúng ta cần thực hiện __missing__
trong một lớp con dict.
Một chương trình mẫu có thể là
class MyDict(dict):
def __missing__(self, key):
return None
Một cuộc biểu tình nhỏ có thể là
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
vàdictionary.get("foo")
hành xử khác nhau, mặc dù.