使用字典的 Pythonic 方式

Python 字典是该语言的一个有用部分。 除了具有存储键和值的能力,你还可以使用字典方法来操作那些值,你可以使用字典来编写更简洁的代码。

使用 get()setdefault() 用字典

尝试访问不存在的字典键会导致 KeyError 错误,因此程序员通常会编写非 pythonic 代码来避免这种情况:

>>> # Unpythonic Example
>>> workDetails = {}
>>> if 'hours' in workDetails:
...     hoursWorked = workDetails['hours']
... else:
...     hoursWorked = 0 # Default to 0 if the 'hours' key doesn't exist.
...
>>> hoursWorked
0

这种模式经常发生,以至于字典有一个 get() 允许您指定在字典中不存在键时返回默认值的方法。 以下代码与前面的示例等效,但是是 pythonic 的:

>>> # Pythonic Example
>>> workDetails = {}
>>> hoursWorked = workDetails.get('hours', 0)
>>> hoursWorked
0

如果您发现自己正在编写 if 语句来检查键是否存在并在键不存在时提供默认值,请使用 get() 方法代替。

相反,如果键不存在,您可能希望设置默认值。 例如,如果字典在 workDetails 没有 'hours' 键,然后是指令 workDetails['hours'] += 10 会导致 KeyError 错误。 您可能想要添加代码来检查密钥是否缺失并设置默认值:

>>> # Unpythonic Example
>>> workDetails = {}
>>> if 'hoursWorked' not in workDetails:
...     workDetails['hours'] = 0
...
>>> workDetails['hours'] += 10
>>> workDetails['hours']
10

前面的例子是非 pythonic 的。 因为这种模式也很常见,所以字典有更多的 pythonic setdefault() 方法。 下面的代码等价于前面的例子:

>>> # Pythonic Example
>>> workDetails = {}
>>> workDetails.setdefault('hours', 0) # Does nothing if 'hours' exists.
0
>>> workDetails['hours'] += 10
>>> workDetails['hours']
10

如果你发现自己在写作 if 检查字典中是否存在键并在键不存在时设置默认值的语句,使用 setdefault() 方法代替。

Python 使用字典而不是 Switch 语句

Java 等语言具有 switch 声明,这是一种 if-elif-else 基于单个变量或表达式的值运行代码的语句。 Python 没有 switch 声明,而是一个 switch 语句类似于以下 Python 代码,它设置了 holiday 基于值的变量 month 多变的:

>>> # Unpythonic Example
if season == 'Winter':
    holiday = 'Christmas'
elif season == 'Spring':
    holiday = 'Easter'
elif season == 'Summer':
    holiday = 'American Independence Day'
elif season == 'Fall':
    holiday = 'Halloween'
else:
    holiday = 'Personal day off'

使用处理代码 if 模仿的陈述 switch 语句是非Pythonic的。 默认情况下,Java switch 语句具有“fall-through”,要求每个块以 break 陈述。 否则,执行将继续下一个块。 忘记添加这个 break 语句是错误的常见来源。 然而,所有的 if-elif 我们的 Python 示例中的语句也好不到哪里去,因为它们可能过于冗长。 一些 Python 程序员更喜欢设置字典值而不是使用 if-elif 声明。 以下简洁的 pythonic 代码等同于前面的示例:

>>> # Pythonic Example
holiday = {'Winter': 'Christmas',
           'Spring': 'Easter',
           'Summer': 'American Independence Day',
           'Fall':   'Halloween'}.get(season, 'Personal day off')

此代码只是一个赋值语句。 存储在的值 holiday 是的返回值 get() 方法调用,返回季节设置的键的值。 如果季节键不存在,则 get() 回报 'Personal day off'. 使用字典会使代码更简洁,但也会使代码更难阅读。 是否使用此约定取决于您。

阅读更多

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注