когда вы говорите letter = letter.upper
, вы фактически не меняете содержимое строки phrase
, вы просто меняете строку, на которую указывает переменная letter
.
Фактически, вы не можете изменять строки в python. Попробуйте запустить "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()
, но что на самом деле происходит так, что, как и в случае с letter, я фактически не меняю строку, я просто создаю новую строку (answer + letter.upper()
) и присваиваю значение этой строки переменной answer
. Это тонкое, но важное различие.
Я также изменил способ, которым вы решаете, следует ли использовать верхний или нижний регистр, чтобы заставить его работать с гласными нижнего регистра. Как у вас было изначально, если текущая буква "a"
, запускается ветвь else, и она переводится в верхний регистр, когда не должна. Это потому, что "a"
находится в "aeiou"
, а не в "AEIOU"
, поэтому ветвь else запускается и получает верхний регистр.