用于枚举列表的Python良好编程实践

时间:2012-04-07 13:51:57

标签: python list

我对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语句已经变得很长。这被认为是好的节目吗?如果不是,有没有更好的方法来编写这个功能?

5 个答案:

答案 0 :(得分:34)

不,它不被视为良好做法,总有更好的方法:D

if i.upper() in "AEIOU"

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

def get_vowels(word):
    vowels = "AEIOU"
    return [c for c in word if c.upper() in vowels]

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

(但第一种方法最具可读性,因此更具pythonic。另外,第二种方法将返回生成器,而不是Python 3中的列表。)

编辑 c in listc 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

答案 2 :(得分:1)

if与:

相同
if i in "aeiouAEIOU"

基本上你正在检查一组中的成员。

答案 3 :(得分:1)

我认为长期陈述比短期陈述更难理解。几乎总有办法用较短的陈述做同样的事情。在您的情况下,您可以简化如下:

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"]

答案 4 :(得分:1)

像:

set('aeiouAUIOU') & set(word)