我的代码中有很多重复,一个很好的例子就是当我做一个简单的检查,看看字符串的第一个字母是否是元音。我的代码如下:
if word[0] == 'a' or word[0] == 'e' or word[0] == 'i' or word[0] == 'o' or word[0] == 'u':
print 'An', word
else:
print 'A', word
这很好但是重复的数量让我觉得可以有一个简单的方法来缩短它,我只是不知道它。我也试过这段代码:
if word[0] == 'a' or 'e' or 'i' or 'o' or 'u':
print 'An', word
else:
print 'A', word
但是,无论起始字母如何,此代码都会为每个字返回True
。
所以,只是澄清一下。代码工作正常,功能齐全,我知道我可以将它定义为一个函数,只需使用它,但似乎可以很容易地缩短它,这些知识对多个项目都很有用。
答案 0 :(得分:3)
使用in
测试会员资格:
if word[0] in {"a","e","i","o","u"}
同样if word[0] == 'a' or 'e' or 'i' or 'o' or 'u'
总是会评估为True
,您基本上会检查if word[0] == "a"
然后if bool("e")
,对于任何非空字符串,它始终为True。
对于像你这样的小测试而言,这不是什么大问题,但是set查找是0(1)
而不是0(n)
对于列表,字符串等,所以这是一个更有效的解决方案处理更大的数据或多次重复查找。
您也可以将一个或多个字母传递给str.startswith
:
if word[0].startswith(("a","e","i","o","u")):
如果您想忽略大小写,请在信件上拨打word[0].lower()
。
答案 1 :(得分:2)
使用关键字in
。
word = "hello"
vowels = frozenset("aeiou")
if word[0] in vowels:
print "It's in!"
else:
print "It's not."
请注意,您可以将元音包含在任何可迭代的内容中,set
,list
,string
,dict
,生成器功能或任何您喜欢的内容。
正如@MartijnPieters在评论中指出的那样,frozenset
是最优化的方法。
答案 2 :(得分:1)
您可以尝试使用re
模块。
if re.match(r'(?i)[aeiou]$', word[0]):
这将处理大写和小写元音。 (?i)
称为不区分大小写的修饰符,它有助于执行不区分大小写的匹配。由于match函数尝试匹配开头的字符串,因此您不需要添加起始锚^
。 {\ n}}匹配a或e或i或o或u的字符类。