python 代码中 'or default' 的需要是什么?

What is the need of 'or default' in this python code?

这是代码 all_jokes 是一个字典,其中有一些类别映射到笑话。

def select_joke(category):
    jokes = all_jokes[category or 'default']
    shuffle(jokes)
    return jokes[0]

与许多其他语言一样,or returns 如果第一个元素是 "truthy",则第二个元素。

在这种情况下,如果category为0,或None,或空字符串等,我们得到all_jokes['default']。否则,我们得到 all_jokes[category].

意思是,

if category is false (or empty or None) use 'default' as key.

可能不知道其余代码,all_jokes 是一个包含 default 选项的字典。

Returns all_jokes 字典中 default 键的值,如果 category 的值不是 :

from random import shuffle

all_jokes = {
    'joke1': ['This is joke1'],
    'joke2': ['This is joke2'],
    'default': ['This is default joke']
}

def select_joke(category):
    jokes = all_jokes[category or 'default']
    shuffle(jokes)
    return jokes[0]

print("----------------------------------------")
print(f"input:{0} output:{select_joke(0)}")
print(f"input:{None} output:{select_joke(None)}")
print(f"input:{''} output:{select_joke('')}")
print("----------------------------------------")

输出:

----------------------------------------
input:0 output:This is default joke
input:None output:This is default joke
input: output:This is default joke
----------------------------------------

Python 的 andor 运算符等效于以下 if 表达式:

# NB: These work as intended for boolean values.
(a or b) is (a if a else b)
(a and b) is (b if a else a)
def select_joke(category):
    """Equivalent to your code."""
    jokes = all_jokes[category if category else 'default']
    shuffle(jokes)
    return jokes[0]

这允许可以接受 'default' 笑话的调用站点传入 ''None。 Python 当使用 or 代替匹配此模式的 if 表达式(用另一个假值替换另一个假值)时,代码往往看起来更漂亮,尤其是当您使用默认为假值的函数参数时。


作为旁注,您可以使用 random.choice:

来简化您的函数
def select_joke(category=None):
    return random.choice(all_jokes[category or 'default'])


select_joke()          # category will be 'default'.
select_joke('default') # category will be 'default'.
select_joke(None)      # category will be 'default'.
select_joke('')        # category will be 'default'.
select_joke('puns')    # category will be 'puns'.