Python 'else' 没有按预期工作


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

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

我也尝试过elif language =!= k但它似乎以同样不需要的方式工作

你想要这个:

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')

按照您的代码当前情况,它只会检查字典中的第一项。如果该键匹配,则返回适当的值。否则,它将返回"欢迎",但永远不会移动到第二项。

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

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

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

dict.get允许您执行字典查找,并在找不到该项时使用默认值。

它基本上是对此的简写(但首选dict.get(:

if language in database:
    return database[language]
else:
    return 'Welcome'

这样看,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')

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

这是因为return语句在第一个分支中执行时else劫持了for的控制权,退出了函数。例如,您可以改为将else作为for的一部分移动;指示'Welcome'仅在for完全耗尽时才应返回:

...
for k, v in database.items():
    if language == k:
        return v
else: 
    return 'Welcome'

或者使用字典的 get 方法返回默认值:

...
return database.get(lang, 'Welcome')

我也修改了代码并附加了输出:

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

print(greet('english'))
print(greet('czech'))
print(greet('welsher'))
print(greet('danish'))
print(greet('welsh'))
print(greet('hindi'))

输出:欢迎维特伊特欢迎维尔科姆斯特克罗索Welcome

看看这个SO帖子,你会了解检查一个键是否在字典中的最快方法是什么。

所以在你的情况下,我会说这是最快的检查方法

def greet(k):
    database = {'english': 'Welcome',
                'czech': 'Vitejte',
                'danish': 'Velkomst',
                'welsh': 'Croeso'}
    if k in database:
        return(database[k])
    else:
        return('Welcome')
print(greet('welsh'))

输出:

Croeso

但对于:

def greet(k):
    database = {'english': 'Welcome',
                'czech': 'Vitejte',
                'danish': 'Velkomst',
                'welsh': 'Croeso'}
    if k in database:
        return(database[k])
    else:
        return('Welcome')
print(greet('tamil'))

输出:

Welcome

你提到的一切都只是预期的行为,为什么,因为字典是一个无序的对象集合。

每当你做dict.items((时,它都可以以任何顺序迭代,考虑你的示例本身:

def greet(language):
database = {'english': 'Welcome','czech': 'Vitejte','danish': 'Velkomst',
            'welsh': 'Croeso'}
for k, v in database.items():
    print "k,v :",k,v       --> it may print you in any order 
output:
       Combination 1:
       1) english': 'Welcome 2) danish': 'Velkomst 3) czech': 'Vitejte
       4) welsh': 'Croeso
       Combination 2:
       1) welsh': 'Croeso  2)  english': 'Welcome 3) czech': 'Vitejte
       4) danish': 'Velkomst
       and few more combinations will yield .....

因此,在您的示例中,您的第一次迭代不是捷克语,这就是您的代码始终返回 Welcome 的原因。

为了避免这种情况,你可以使用 dict.get(( 或简单地将变量跟踪为下面:

def greet(language):
var = 0                            -> intialized var with 0
database = {'english': 'Welcome',
            'czech': 'Vitejte',
            'danish': 'Velkomst',
            'welsh': 'Croeso'}
for k, v in database.items():
    if k == language:
        var = 1                    -> if enterd in loop assign var = 1 
        return v
if (var != 1):
   return('Welcome')               -> if above compa'ion fails returns welcome

打印(问候('捷克语'((

维特伊特

print(greet('zabcczech'((

欢迎

最新更新