python`else`无法按预期工作

fee*_*ine 0 python if-statement

def greet(language):
    database = {'english': 'Welcome',
                'czech': 'Vitejte',
                'danish': 'Velkomst',
                'welsh': 'Croeso'}
    for k, v in database.items():
        if language == k:
            return v
        # else: return('Welcome')

print(greet('czech'))
> Vitejte
Run Code Online (Sandbox Code Playgroud)

如果我取消注释else: return('Welcome')(如果问候语不在列表中),我希望收到"欢迎",但无论我输入现有语言还是现有语言,它都会返回"欢迎".

我也试过,elif language =!= k但它似乎以同样不受欢迎的方式工作

use*_*559 8

你想要这个:

def greet(language):
    database = {'english': 'Welcome',
                'czech': 'Vitejte',
                'danish': 'Velkomst',
                'welsh': 'Croeso'}
    for k, v in database.items():
        if language == k:
            return v

    # Return this only if none of the items matched.
    return('Welcome')
Run Code Online (Sandbox Code Playgroud)

正如您的代码当前所代表的那样,它只会检查字典中的第一项.如果该键匹配,则返回适当的值.否则,它返回"欢迎",但它永远不会移动到第二个项目.

在我的代码中,它会检查所有项目,并在找到匹配项后立即返回正确的值.只有找不到匹配项才会返回"欢迎".

顺便说一句,这是一个更简单的代码版本:

def greet(language):
    database = {'english': 'Welcome',
                'czech': 'Vitejte',
                'danish': 'Velkomst',
                'welsh': 'Croeso'}
    return database.get(language, 'Welcome')
Run Code Online (Sandbox Code Playgroud)

dict.get 允许您进行字典查找,如果找不到该项,则使用默认值.

这基本上是简单的(但是dict.get首选):

if language in database:
    return database[language]
else:
    return 'Welcome'
Run Code Online (Sandbox Code Playgroud)


Wil*_*sem 6

看到这样,for循环将枚举项目.

让我们假设.items()提取的第一个项目'english': 'Welcome'.现在如果语言不是英语,那么if将失败,因此返回else部分被执行'Welcome'.仅当枚举的第一项确实是正确的语言时,您的程序才会返回该值.

不过你做的事情太复杂,你可以使用dict.get(..)一个回退值:

def greet(language):
    database = {'english': 'Welcome',
                'czech': 'Vitejte',
                'danish': 'Velkomst',
                'welsh': 'Croeso'}
    return database.get(language,'Welcome')
Run Code Online (Sandbox Code Playgroud)

这也将提高性能:您的原始程序具有O(n)时间复杂度,而字典上的平均查找在O(1)时间内完成.