Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python枚举列表的良好编程实践_Python_List - Fatal编程技术网

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

Python枚举列表的良好编程实践,python,list,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

一般来说,我对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语句变得非常长。它被认为是好的编程吗?如果不是,是否有更好的方法来编写此函数

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

if i.upper() in "AEIOU"
下面是使用列表理解的函数的简短版本:

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

如果,则
与以下内容相同:

if i in "aeiouAEIOU"

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

我认为长语句比短语句更难理解。几乎总是有一种方法可以用更短的语句来做同样的事情。在您的情况下,您可以简化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"]

最好使用集合:

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与集合中的
c的性能比较

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
比如:


@如果我们假设
word
是一个字符串,而不是一个计数器,那么它们是等价的。这是一个好问题。请务必在接下来的几天内接受答复。谢谢。我不知道我也可以用“in”来表示字符串,我想我只能用它来表示列表。但是由于字符串的行为与列表几乎相同,我应该知道这一点。d谢谢大家。是的,有很多快捷方式:D@geekkid将代码压缩到这个答案的能力正是python的核心所在——它真正实现了简洁、无重复的编码,Python倾向于使用
下划线的名称
比如
get\u元音
str.upper()
在Unicode上使用是不礼貌的(什么是
'jh'.upper()
?),最好(更简洁!)明确地测试大小写:
如果我在“AEIOUaeiou”
中。你的上一个函数不会产生单词中的元音,它只是说
True
False
@jamylak哦,我真丢脸。谢谢,删除。使用集合是否会加快速度?因为元音='aeiouAUIOU'也适用。@Akavall是的,它稍微快一点,用
timeit
output更新。对于长度大于
aeiouAEIOU
的序列,差异将更为显著。集合包含的是平均事例常数时间,列表是线性时间。这里的字符数很小,所以几乎没有区别。哦,很漂亮。。。但这会使字母混乱,不会保留重复的字母。是的,是的,但太漂亮了,不能错过。
set('aeiouAUIOU') & set(word)