使用字典的 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'
. 使用字典会使代码更简洁,但也会使代码更难阅读。 是否使用此约定取决于您。