17

我对 Python 和一般编程很陌生,我想知道用许多逻辑运算符编写长语句是否是一种好的编程习惯 - 例如,在 for 循环中。

例如,这是我创建的一个函数,它从一个单词中获取所有元音并返回一个包含这些元音的列表。

def getVowels(word):
    vowel_list = []
    index = 0
    for i in word:
        if i == "a" or i == "e" or i == "i" or i == "o" or i == "u" or i == "A" or i == "E" or i == "I" or i == "O" or i == "U":
            vowel_list.append(word[index])
        index += 1
    return vowel_list

如您所见,if 语句变得很长。它被认为是好的编程吗?如果不是,有没有更好的方法来编写这个函数?

4

5 回答 5

34

不,这不是好的做法,总有更好的方法:D

if i.upper() in "AEIOU"

这是使用列表推导的函数的更短版本:

def get_vowels(word):
    vowels = "AEIOU"
    return [c for c in word if c.upper() in vowels]
于 2012-04-07T13:54:53.503 回答
4

使用集合可能会更好:

VOWELS = set('aeiouAUIOU')

def get_vowels(word):
    return [c for c in word if c in VOWELS]

或者,更令人讨厌:

def get_vowels(word):
    return filter(VOWELS.__contains__, word)

(但第一种方法可读性最强,因此更符合 Python 风格。另外,第二个函数将返回生成器,而不是 Python 3 中的列表。)

编辑c in listvs的性能比较c in set

import timeit

VOWELS = 'aeiouAEIOU'
VOWSET = set(VOWELS)
SAMPLE = 'asflasrjoperugASDFAROUAoarfpeoriugargagadropgue'

def get_vowels(word, vowels):
    return [c for c in word if c in vowels]

print timeit.timeit('get_vowels(SAMPLE, VOWELS)', 
                    'from __main__ import VOWELS, SAMPLE, get_vowels') 
# ^ prints 10.0739870071
print timeit.timeit('get_vowels(SAMPLE, VOWSET)', 
                    'from __main__ import VOWSET, SAMPLE, get_vowels') 
# ^ prints 9.43965697289
于 2012-04-07T15:05:10.263 回答
1

喜欢:

set('aeiouAUIOU') & set(word)
于 2012-04-07T16:20:57.717 回答
1

与以下if内容相同:

if i in "aeiouAEIOU"

基本上,您正在检查集合中的成员。

于 2012-04-07T13:55:02.387 回答
1

我认为长语句比短语句更难理解。几乎总有一种方法可以用较短的语句来做同样的事情。在您的情况下,您可以像这样简化 if:

def getVowels(word):
    vowel_list = []
    for i in word:
        if i in "aeiouAEIOU":
            vowel_list.append(i)
    return vowel_list

因为 Python 允许您使用“in”运算符在另一个字符串中搜索一个字符串。

但是 Python 也允许列表推导,这简化了循环:

def getVowels(word):
    return [i for i in word if i in "aeiouAEIOU"]
于 2012-04-07T13:56:59.210 回答