Python 代码重复

Python Code Repetition

我的代码中有很多重复,一个典型的例子是当我做一个简单的检查来查看字符串的第一个字母是否是元音时。我的代码如下:

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,无论开头字母如何。

所以,澄清一下。代码运行良好,功能齐全,我知道我可以将它定义为一个函数并直接使用它,但它似乎很容易被缩短,而且这些知识对多个项目很有用。

使用 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") 这对于任何非空字符串总是为真。

对于像你这样的小测试来说没什么大不了的,但是 set 查找是 0(1) 而不是 0(n) 对于列表,字符串等。所以效率更高处理较大数据或多次重复查找时的解决方案。

您还可以将元组或字母传递给 str.startswith:

if word[0].startswith(("a","e","i","o","u")):

如果要忽略大小写,请在字母上调用word[0].lower()

使用关键字 in 进行测试。

word = "hello"
vowels = frozenset("aeiou")

if word[0] in vowels:
    print "It's in!"
else:
    print "It's not."

请注意,您可以将元音放在任何可迭代的对象中,setliststringdict、生成器函数或您喜欢的任何对象。
正如@MartijnPieters 在评论中指出的那样,frozenset 是最优化的方法。

您可以尝试使用 re 模块。

if re.match(r'(?i)[aeiou]$', word[0]):

这将处理大写和小写元音。 (?i) 称为不区分大小写的修饰符,有助于进行不区分大小写的匹配。由于 match 函数尝试从头开始匹配字符串,因此您不需要添加起始锚点 ^[aeiou] 字符 class 匹配 a 或 e 或 i 或 o 或 u。