抛弃dict[key]的方式访问Python字典的值

2023-10-04 12:16:33 浏览数 (2)

0. 标题

抛弃dictkey的方式访问Python字典的值

代码语言:txt复制
作者: quantgalaxy@outlook.com   
blog: https://blog.csdn.net/quant_galaxy  
欢迎交流

1. What: dictkey访问方式是什么

从各种教程中,学到访问字典的方式,基本都是dictkey这样的方式,比如:

代码语言:python代码运行次数:0复制
d = {'apple':4, 'orange':5, 'pear':6}

x = d['apple']    # 4
y = d['orange']   # 5
z = d['pear']     # 6

通过dkey来获取字典d中key对应的值。

如果访问的key不存在呢?比如:

代码语言:python代码运行次数:0复制
d = {'apple':4, 'orange':5, 'pear':6}

a = d['pineapple']
代码语言:txt复制
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[202], line 3
      1 d = {'apple':4, 'orange':5, 'pear':6}
----> 3 a = d['pineapple']

KeyError: 'pineapple'

如果key不存在,dkey会抛出一个KeyError类型的异常,这将导致python程序崩溃,这是非常令人烦恼的事情。

2. Why: 为什么在程序中避免抛出异常

如果是在运行一个离线任务,需要跑好几个小时,但是在运行几个小时后,程序突然崩溃了,抛出了一个KeyError,这会导致之前的结果全都失效,需要重跑。

如果是一个游戏,打boss进行了一半,一个异常导致整个游戏崩溃,也是用户不可接受的事情。

除了异常的处理,我们尽可能的,应该用非抛出异常的方式,处理各种可能性。

我们可以通过判断key是否存在的方式,先进行访问再调用,比如:

代码语言:txt复制
d = {'apple':4, 'orange':5, 'pear':6}

if 'pineapple' in d:
	a = d['pineapple']
else:
	a = ""

通过这样的方式,可以避免访问到不存在的key,缺点就是,需要每次都要先检查在使用,并根据不同的类型设置不同的默认值。

还有一种方式,就是dict.get()方法,实现了上面的需要。如果key不存在,不会抛出异常,会返回一个None,或者可以指定默认值。

代码语言:txt复制
作者: quantgalaxy@outlook.com   
blog: https://blog.csdn.net/quant_galaxy  
欢迎交流

3. How:如何使用dict.get()方法访问key

代码语言:txt复制
d = {'apple':4, 'orange':5, 'pear':6}

x = d.get('apple')      # 4
y = d.get('orange')     # 5
z = d.get('pear')       # 6
a = d.get('pineapple')  # None

通过上面的例子,可以看出,我们完美的解决了上面出现的问题。

使用dict.get()有如下好处:

  1. key存在,和dictkey有一样的行为。
  2. key不存在,dict.get(key)不会抛出异常。
  3. key不存在,dict.get(key)会返回一个默认值。

我们还可以指定dict.get()方法的默认值,dict.get(key, defaultValue),比如:

代码语言:python代码运行次数:0复制
d = {'apple':4}

x = d.get('apple')          # 4
y = d.get('orange', 100)    # 100
z = d.get('pear', 3.14159)  # 3.14159

如果key存在,实际值被返回。

如果key不存在,设置的默认值被返回,就是第二个参数。

4. 作者信息

代码语言:txt复制
作者: quantgalaxy@outlook.com   
blog: https://blog.csdn.net/quant_galaxy  
欢迎交流

0 人点赞