Що таке dict.get()
метод?
Як уже згадувалося, get
метод містить додатковий параметр, який вказує на відсутнє значення. З документації
get(key[, default])
Поверніть значення для ключа, якщо ключ є у словнику, інакше за замовчуванням. Якщо за замовчуванням не вказано, він за замовчуванням не має значення, щоб цей метод ніколи не піднімав a KeyError
.
Прикладом може бути
>>> 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
Чи є десь покращення швидкості?
Як згадувалося тут ,
Схоже, зараз усі три підходи демонструють однакову ефективність (приблизно в межах 10% один від одного), більш-менш незалежну від властивостей списку слів.
Раніше get
було значно повільніше, проте зараз швидкість майже порівнянна разом із додатковою перевагою повернення значення за замовчуванням. Але щоб очистити всі наші запити, ми можемо перевірити досить великий список (зауважте, що тест включає пошук лише всіх дійсних ключів)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Тепер призначайте ці дві функції за допомогою 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
Як ми бачимо, пошук стає швидшим, ніж отримати, оскільки немає пошуку функції. Це можна побачити наскрізьdis
>>> 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
Де це буде корисно?
Це буде корисно, коли ви бажаєте надати значення за замовчуванням, коли ви шукаєте словник. Це зменшує
if key in dic:
val = dic[key]
else:
val = def_val
До одного рядка, val = dic.get(key,def_val)
Де це НЕ буде корисним?
Щоразу, коли ви хочете повернути KeyError
заяву про те, що конкретний ключ недоступний. Повернення значення за замовчуванням також несе ризик, що певне значення за замовчуванням може бути і ключем!
Чи можливо мати get
подібну функцію в dict['key']
?
Так! Нам потрібно реалізувати __missing__
підклас dict.
Зразок програми може бути
class MyDict(dict):
def __missing__(self, key):
return None
Невелика демонстрація може бути
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]
іdictionary.get("foo")
поводяться по-різному.