Подтвердить что ты не робот

Обратная строка: string [:: - 1] работает, но строка [0:: - 1] и другие не

Я немного новичок в python/programming, и я только что играл с нарезкой строк. Таким образом, простой метод обратной строки string[::-1] работает отлично, как мы знаем, но в моем коде ниже есть другие экземпляры, которые дают неожиданные результаты:

In [1]: string = "Howdy doody"

In [2]: string[::]
Out[2]: 'Howdy doody'

In [3]: string[::-1]
Out[3]: 'ydood ydwoH'

In [4]: string[0:]    
Out[4]: 'Howdy doody'

In [5]: string[0::-1]
Out[5]: 'H'     # what up with this?

In [6]: string[:len(string)]
Out[6]: 'Howdy doody'

In [7]: string[:len(string):-1]
Out[7]: ''     # what up with this too?

In [8]: string[0:len(string)]
Out[8]: 'Howdy doody'

In [9]: string[0:len(string):-1]
Out[9]: ''    # And what up here too.

Я прокомментировал строки выше, где я ожидал, что строки будут отменены, но я удивлен, почему они не просто меняют строку. Кто-нибудь знает, что с этим связано?

4b9b3361

Ответ 1

Обозначение фрагмента "[a: b: c]" означает "подсчет с шагом c начиная с a включительно, до b exclusive". Если c отрицательный, вы считаете обратное, если оно опущено, оно равно 1. Если a опущено, вы начинаете как можно дальше в направлении, в котором вы рассчитываете (чтобы начало, если c было положительным, и конец, если отрицательный). Если b опущено, вы заканчиваете как можно дальше в направлении, в котором вы рассчитываете (так что конец, если c положителен, а начало - отрицательным). Если a или b отрицательно, это означает смещение от конца (-1, являющегося последним символом) вместо начала.

ОК, поэтому string[0::-1] - это один символ, он говорит: "Считайте обратную сторону от индекса 0 насколько это возможно". Насколько это возможно, это начало строки.

string[0:len(string):-1] или, если на то пошло, string[0:anything:-1] тонко отличается. Он пуст по той же причине, что string[1:0] пуст. Назначенный конец среза не может быть достигнут с самого начала. Вы можете подумать об этом, поскольку срез закончился "раньше", и он начал (следовательно, пуст), или вы можете думать, что конечная точка автоматически настраивается так, чтобы она была равна начальной точке (следовательно, срез пуст).

string[:len(string):-1] означает "отсчет назад от конца до, но не включая индекс len(string)". Этот индекс не может быть достигнут, поэтому срез пуст.

Вы не пробовали string[:0:-1], но это означает "отсчет назад от конца до, но не включая индекс 0". Так что все, кроме первого символа, обращаются вспять. [:0:-1] соответствует [::-1], поскольку [0:len(string)-1] соответствует [:]. В обоих случаях исключенный конец среза является индексом, который был бы включенным последним символом среза с опущенным концом.

Вы также не пробовали string[-1::-1], что совпадает с string[::-1], потому что -1 означает последний символ строки.

Ответ 2

Во всех ваших случаях, которые не работают, вы начинаете в начале , а затем перемещаетесь назад. Нет больше назад, чем начало, поэтому вы не получите больше символов.

Это будет решение:

>>> string[len(string)::-1]
'ydood ydwoH'

Обозначение среза start, end, step. Если step отрицательный, start должен быть больше end, чтобы получить что-либо. Если он оставил пустой ([::-1]), этот нюанс будет выполняться автоматически

В случае, когда вы получили только 'H', это может сбить с толку, почему было что-то. Но подумайте об объяснении:

Начиная с символа в start, увеличивайте шаг до (но не включая) конец

Теперь становится ясно, что, поскольку вы начинаете с 0, символ 0 включается