繁体   English   中英

python`else`不能按预期工作

[英]python `else` doesn't work as expected

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') (因此,如果问候语不在列表中),无论我输入现有的还是不存在的语言,我都希望收到“ Welcome”,但它会返回“ 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')

就目前的代码而言,它只会检查字典中的第一项。 如果该键匹配,则返回适当的值。 否则,它将返回“ Welcome”,但它永远不会移至第二项。

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

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

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

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

这基本上是dict.get方式(但是dict.get是首选):

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

这样看, for循环将枚举item

假设.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 Vitejte Welcome Velkomst Croeso 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

无论您提到什么,都是预期的行为,这是为什么,因为DICTIONARY是对象的无序集合。

每当您执行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 .....

因此,在您的示例中,您的第一个迭代不是czech ,这是代码始终返回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

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

维捷特

打印(问候('zabcczech'))

欢迎

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM