python`else`无法按预期工作

时间:2017-06-14 10:09:48

标签: 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

如果我取消注释else: return('Welcome')(如果问候语不在列表中),我希望收到“欢迎”,但无论是否输入现有或不存在的语言,它都会返回“欢迎”。< / p>

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

6 个答案:

答案 0 :(得分:8)

你想要这个:

from .models import User,Player,Game,Match,Team,Post, db as models_db
models_db.create_all()

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

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

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

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

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

这基本上是为了这一点(但def greet(language): database = {'english': 'Welcome', 'czech': 'Vitejte', 'danish': 'Velkomst', 'welsh': 'Croeso'} return database.get(language, 'Welcome') 是首选):

dict.get

答案 1 :(得分: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')

这也将提升性能:原始程序的 O(n)时间复杂度,而字典上的平均查询则在 O(1)时间内完成。

答案 2 :(得分:3)

这是因为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')

答案 3 :(得分:0)

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

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

输出: 欢迎 Vitejte 欢迎 Velkomst Croeso 欢迎

答案 4 :(得分:0)

看看this SO post,您将了解检查密钥是否在字典中的最快方法。

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

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

答案 5 :(得分:0)

无论你提到的是什么只是预期的行为,为什么因为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 .....

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

要避免这种情况,您可以使用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

打印(迎接(&#39;捷克&#39;))

  
    

Vitejte

  

打印(迎接(&#39; zabcczech&#39;))

  
    

欢迎