2013-04-19 2 views
1

Мне нужно написать функцию, которая возвращает копию строки с двумя крайними правыми символами, перемещенными спереди. Вот мой код:Функция Python (начинающий)

def go_right(mystr): 
    if mystr >= 2: 
     for i in range(len(mystr)): 
       a = mystr[-2:] + mystr[:-2] 
     return a 

Приведенный выше код работает отлично, но я не могу показаться, чтобы обернуть вокруг моей головы, почему я не могу это сделать:

def go_right(mystr): 
     if mystr >= 2: 
      for i in range(len(mystr)-2): 
        a = mystr[-2:] + mystr 
      return a 

Если я использовал выше, если функция I прошел по-привет, он просто вернул бы «lohello». Почему 2 не влияет на миф? Я думал, что он должен проходить через каждого персонажа, за исключением последних двух? Если бы кто-нибудь мог помочь прояснить это для меня, я был бы признателен.

+2

Добавляет ли 'print i' под строку объяснение? Вы зацикливаетесь, и я не уверен, почему; вам не нужен оператор 'for' в любом случае. – Ezra

+0

Одна вещь, которую вы, возможно, захотите запомнить, это то, что нарезка в Python не изменяет исходную строку. Таким образом, взятие 'mystr [-2:]' не «отрубает его» в конце оригинала, оно просто говорит «используйте то, что есть». Перед изменением «оригинала» вам необходимо назначить обратно (назначение среза). –

ответ

2

В

def go_right(mystr): 
    if mystr >= 2: 
     for i in range(len(mystr)): 
       a = mystr[-2:] + mystr[:-2] 
     return a 

переменная i никогда не используется и mystr никогда не изменяется. Таким образом, a = mystr[-2:] + mystr[:-2] исполняется len (mystr) раз, делая одно и то же снова и снова.

Поэтому неудивительно, что изменение длины цикла for ничего не меняет, поскольку существование цикла for не делает ничего.

Ваш метод эквивалентен

def go_right(mystr): 
    if mystr >= 2: 
     a = mystr[-2:] + mystr[:-2] 
    return a 

И есть еще ошибка в этом коде. Вместо mystr> = 2, то среднее значение LEN (mystr)> = 2, например, так:

def go_right(mystr): 
    if len(mystr) >= 2: 
     a = mystr[-2:] + mystr[:-2] 
    return a 

(семантика сравнения строки и номер, чтобы всегда сравнивать их ложь, например "a" >= 2 является True)

Однако, теперь это даст ошибку, когда длина mystr равна 0 или 1: 'UnboundLocalError: локальная переменная' a ', на которую ссылаются перед назначением'. Одним из способов решения этой проблемы является:

def go_right(mystr): 
    if len(mystr) >= 2: 
     return mystr[-2:] + mystr[:-2] 
    return mystr 
+0

О, мне кажется, что я ударился головой о стол прямо сейчас. Ну спасибо:) –

+0

@ Rodney Turiaf Обновлен ответ немного – Patashu

0

Я немного запутался, почему вы используете цикл для этого ... петля ничего не делает для вас в любом случае. Однако, чтобы ответить на ваш вопрос, это происходит из-за того, что вы добавляете все мифы в mystr [-2:]. Что имеет смысл, так как, проходя через цикл, mystr не изменяется.

0

Здесь есть логическая ошибка:

for i in range(len(mystr)): 
    a = mystr[-2:] + mystr[:-2] 

вы присваиваете новое значение a для len(mystr) раза. Все, что вам нужно на самом деле сделать, это позвонить

return mystr[:-2] + mystr[:-2] 

Ума вашего i индекса, вы не используете, что список элементы доступа, потому что вы используете ломтик обозначение вместо этого.

См. this question для дальнейших ссылок на это.

0

Вы также можете значительно упростить код, как:

def go_right(mystr): 
    return mystr[-2:] + mystr[:-2] 

входы с длиной 0, 1 или 2 возвращается без изменений.

Смежные вопросы