Python枚举列表的良好编程实践
一般来说,我对Python和编程非常陌生,我想知道使用许多逻辑运算符编写长语句(例如,在for循环中)是否是一种良好的编程实践 例如,我制作了一个函数,它从一个单词中获取所有元音,并返回一个包含这些元音的列表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
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)