Quelle est la dict.get()méthode?
Comme déjà mentionné, la getméthode contient un paramètre supplémentaire qui indique la valeur manquante. De la documentation
get(key[, default])
Renvoie la valeur de key si key est dans le dictionnaire, sinon par défaut. Si la valeur par défaut n'est pas indiquée, elle est définie par défaut sur None, de sorte que cette méthode ne déclenche jamais a KeyError.
Un exemple peut être
>>> 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
Y a-t-il des améliorations de vitesse quelque part?
Comme mentionné ici ,
Il semble que les trois approches présentent désormais des performances similaires (à environ 10% l'une de l'autre), plus ou moins indépendantes des propriétés de la liste de mots.
Plus tôt getétait considérablement plus lent, mais maintenant la vitesse est presque comparable avec l'avantage supplémentaire de retourner la valeur par défaut. Mais pour effacer toutes nos requêtes, nous pouvons tester sur une liste assez longue (Notez que le test inclut la recherche de toutes les clés valides uniquement)
def getway(d):
for i in range(100):
s = d.get(i)
def lookup(d):
for i in range(100):
s = d[i]
Maintenant, chronométrez ces deux fonctions en utilisant 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
Comme nous pouvons le voir, la recherche est plus rapide que le get car il n'y a pas de recherche de fonction. Cela peut être vu à traversdis
>>> 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
Où cela sera-t-il utile?
Il sera utile chaque fois que vous souhaitez fournir une valeur par défaut chaque fois que vous recherchez un dictionnaire. Cela réduit
if key in dic:
val = dic[key]
else:
val = def_val
Sur une seule ligne, val = dic.get(key,def_val)
Où ne sera-t-il PAS utile?
Chaque fois que vous souhaitez retourner un KeyErrorindiquant que la clé particulière n'est pas disponible. Le retour d'une valeur par défaut comporte également le risque qu'une valeur par défaut particulière soit également une clé!
Est-il possible d'avoir une getfonctionnalité similaire dans dict['key']?
Oui! Nous devons implémenter la __missing__sous-classe in a dict.
Un exemple de programme peut être
class MyDict(dict):
def __missing__(self, key):
return None
Une petite démonstration peut être
>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
dictionary["foo"]etdictionary.get("foo")se comportent différemment, cependant.