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