[英]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.