有人能告诉我为什么我的功能会删除一些元音而不是其他元音吗?

时间:2014-03-29 19:12:17

标签: python replace

def withoutVowels(string):
    for letter in string:
        if letter in ["a", "e", "i", "o", "u"]:
            noVowelString = string.replace(letter, " ")
            return noVowelString

这个功能删除并替换了一个,但不是我,你,我不知道为什么。

3 个答案:

答案 0 :(得分:2)

自从我完成Python以来已经有一段时间了,但是在更换第一个元音后,你的函数似乎会返回。

也许这就是你想要的:

def withoutVowels(string):
    noVowelString = ""
    for letter in string:
        if letter in ["a", "e", "i", "o", "u"]:
            noVowelString += " "
        else:
            noVowelString += letter

     return noVowelString

答案 1 :(得分:2)

for letter in string:
    if letter in ["a", "e", "i", "o", "u"]:
        noVowelString = string.replace(letter, " ")
        return noVowelString

想一想。你有一个for循环,如果循环体内的一个条件被评估为true,那么你做一些并从函数返回。因此,所有剩余的循环迭代都不会运行。

相反,您可能希望将return移出循环,因此它仍然可以继续。但是,您还希望保留更改过的字符串,并将其替换为一次,并继续执行该操作:

def withoutVowels(string):
    noVowelString = string
    for letter in string:
        if letter in ["a", "e", "i", "o", "u"]:
            noVowelString = noVowelString.replace(letter, " ")
    return noVowelString

最后,这一切都没有意义。如果您只想从字符串中删除所有元音,则无需迭代原始字符串的每个字符。相反,你可以循环元音,并删除它们:

def withoutVowels(string):
    for vowel in ("a", "e", "i", "o", "u"):
        string = string.replace(vowel, "")
    return string

答案 2 :(得分:1)

这里有五件事:

  1. 你的return语句缩进太多了。一旦控制第一次进入if块,for循环将停止迭代,函数将过早返回。

  2. String对象在Python中是不可变的。因此,str.replace返回字符串的修改后的副本,而不是修改原始对象。这意味着您需要在for循环的每次迭代中将string重新分配给副本。

  3. 你的for循环应该迭代元音列表,而不是输入字符串。或者,更有效率,一串元音。

  4. 因为你的函数应该从字符串删除元音,我认为用空字符串而不是空格替换它们会更好。

  5. 您的函数不会删除大写元音。

  6. 以下是解决这些问题的函数版本:

    def withoutVowels(string): 
        for vowel in "aeiouAEIOU":
            string = string.replace(vowel, "")
        return string