2016-02-03 4 views
3

Я ранг нового в Python, поэтому вопрос,Перестановка строки случай в Python

Я пытаюсь решить простую проблему, когда программа принимает в виде простой строки и свопы во всех случаях. Таким образом, если мы вводим

SimPLE 

Мы должны получить

sIMple 

Это мой код

def main(): 
    oldStr = input() 
    for s in oldStr: 
     if s.islower(): 
      s.upper() 
     elif s.isupper(): 
      s.lower() 
    print(oldStr) 
if __name__ == "__main__" : main() 

Он просто возвращает ту же строку. Любая помощь оценивается.

ответ

3

В качестве генератора выражение:

mystr = "SimPLE" 
print("".join(c.upper() if c.islower() else c.lower() for c in mystr)) 

пробой выше:

c.upper() if c.islower() else c.lower() 

является условное выражение, которое преобразует символ из верхнего в нижний регистр и наоборот.

Затем

(... for c in mystr) 

является выражение генератор, который несколько похож на список, который генерируется на лету.

Наконец:

".join(...) 

присоединится к любой последовательности строк вместе с ничего ("") между ними.

+0

Я знаю, что OP использовал 'str' как имя переменной, но вы должны изменить его в ответе. – TigerhawkT3

+0

@Brian получил часть str. Не могли бы вы объяснить код немного больше. – Zeus

+0

@Zeus обновлен с пояснениями - надеюсь, что это поможет! – Brian

2

Строки неизменяемы. Это означает, что когда вы используете функцию s.upper(), она не устанавливает, что буква в str имеет прописную букву, она просто возвращает эту букву в верхнем регистре.

Вот код, который работает:

def main(): 
    oldStr = input() 
    newStr = "" 
    for s in oldStr: 
     if s.islower(): 
      newStr+=s.upper() 
     elif s.isupper(): 
      newStr+=s.lower() 
    print(newStr) 

Теперь обратите внимание, что мы создаем новую строку и просто добавив буквы в каждой точке в forloop, в отличие от изменения этих букв в str.

+0

Я знаю, что OP использовал 'str' как имя переменной, но вы должны изменить его в ответе. – TigerhawkT3

0

Вы управляете каждым символом через lower() и upper(), но эти функции не изменить персонаж.

Вместо этого они возвращают модифицированную версию персонажа. Оригинальный персонаж s останется как есть.

Вы должны создать новую строку на основе выключения Возвращаемые значения из lower() и upper(), и возвращает эту строку.

3

ли это одним махом со строкой присоединиться в списке понимание отдельных персонажей:

outstr = ''.join([s.upper() if s.islower() else s.lower() for s in oldStr]) 
print(outstr) 

Входные & Выход:

sIMple 
SimPLE 
+0

Не могли бы вы немного объяснить код, как было сказано ранее, у меня есть фон Java и обычно используется для более подробного кода. – Zeus

+0

Я знаю, что OP использовал 'str' как имя переменной, но вы должны изменить его в ответе. – TigerhawkT3

+0

@ TigerhawkT3 почему я не могу использовать имя str? Это какая-то питонская конвенция? – Zeus

0

1) Вы должны поместить main() вызов новая строка, так как python опирается на пробелы в значительной степени для структуры программы

2) s - временная переменная, созданная для целей sta Tement. Это на самом деле не ссылаться на символ в строке

По сути то, что происходит это, что s имеет такое же значение, как символ в строке, но НЕ РЕАЛЬНО символ в строке.

+1

Вызов 'main()' не обязательно должен быть в новой строке. – TigerhawkT3

+0

Это не так? Всякий раз, когда я не помещаю вещи в новую строку, все, что она делает, это ошибка. Также, когда я не отступаю. –

+0

См. [Здесь] (https://docs.python.org/3/reference/simple_stmts.html) и [здесь] (https://docs.python.org/3/reference/compound_stmts.html). – TigerhawkT3