python 元音转小写,辅音转大写

python vowels to lowercase and consonants to uppercase

我是 python 的新手,我一直坚持这个特定的练习。 我正在尝试编写一个程序来获取用户的输入(字符串)并将所有元音字母切换为小写字母并将辅音字母切换为大写字母。

示例输入:"Learning python is fun."
预期输出:"LeaRNiNG PYTHoN iS FuN."

这是我试过的:

def toggle(phrase):
    for letter in phrase:
        if letter not in "aeiou":
            letter = letter.upper()
        elif letter in "AEIOU":
            letter = letter.lower()
        else:
            letter = letter.upper()
    return phrase


print(toggle(input("Enter a phrase: ")))

但是,输出没有切换任何东西。我错过了什么?

我假设你的意思是“所有的元音都是小写的,所有的辅音都是大写的”

def toggle(phrase):
    new_phrase = ""
    for letter in phrase:
        if letter in ['a', 'e', 'i', 'o', 'u'] or letter in ['A', 'E', 'I', 'O', 'U']:
            new_phrase += letter.lower()
        else:
            new_phrase += letter.upper()
    return new_phrase


print(toggle(input("Enter a phrase: ")))

问题是您正在遍历短语的可迭代对象,并且通过分配字母实际上并没有更改短语中的字母。

您可以将整个字符串转为大写然后使用 str.translate

vowel_trans = str.maketrans('AEIOU', 'aeiou')
def toggle(phrase):
    return phrase.upper().translate(vowel_trans)

如果这还不够,您可以在循环时使用相同的逻辑生成一个字符串,然后 return 该字符串。

def toggle(phrase):
    new_phrase = ''
    for letter in phrase.upper():
        if letter in 'AEIOU':
            new_phrase += letter.lower()
        else:
            new_phrase += letter

编辑

这也可以简化为理解:

def toggle(phrase):
    return ''.join(l.lower() if l in 'AEIOU' else l for letter in phrase)

甚至使用 re:

import re

def toggle(phrase):
    return re.sub('AEIOU', 'aeiou', phrase.upper())

当你说 letter = letter.upper 时,你实际上并没有改变字符串 phrase 的内容,你只是在改变变量 letter 指向的字符串。

事实上,您不能改变 python 中的字符串。尝试 运行ning "hello"[0] = "g",你会得到一个错误。

一个解决方案不是尝试修改字符串 phrase,而是构建一个新字符串并将正确的字母放入其中。这就是我的意思:

def toggle(phrase):
    answer = ""
    for letter in phrase:
        if letter not in "aeiouAEIOU":
            answer = answer + letter.upper()
        else:
            answer = answer + letter.lower()
    return answer


print(toggle(input("Enter a phrase: ")))

当你运行这个时,你会得到

Enter a phrase: Learning python is fun.
LeaRNiNG PYTHoN iS FuN.

当我说 answer = answer + letter.upper() 时,看起来我正在改变字符串,但实际上发生的是,类似于你对字母所做的,我实际上并没有改变字符串本身,我我只是创建一个新字符串 (answer + letter.upper()) 并将该字符串的值分配给变量 answer。这是一个微妙但重要的区别。

我还更改了您决定是大写还是小写的方式,使其适用于小写元音。你最初的方式是,如果当前字母是 "a",else 分支 运行s 并且它在不应该的时候变成大写。这是因为 "a""aeiou" 中而不在 "AEIOU" 中,所以 else 分支 运行s 并且它变成大写。