Я нашел этот фрагмент кода из связанного вопроса об изменении строк в python, но может ли кто-нибудь интерпретировать его на простом английском языке? Обратите внимание, что я все еще новичок в python и только вчера научился использовать циклы и функции while: /, поэтому я действительно не могу выразить это словами, потому что я еще не совсем понял.

В любом случае вот код:

def reverse_string(string):
    new_strings = [] 
    index = len(string) 
    while index:  
        index -= 1                       
        new_strings.append(string[index]) 
    return ''.join(new_strings) 

print(reverse_string('hello'))
0
user17415509 24 Ноя 2021 в 07:07
Зачем кому-то понадобился этот беспорядок вместо ''.join(reversed(list(my_string))), я не знаю, но какую его часть вы не понимаете? Он создает пустой список, затем очень неэффективно перебирает строку от конца до начала, добавляя каждый символ в список и, наконец, объединяя символы в списке в строку и возвращая результат.
 – 
Grismar
24 Ноя 2021 в 07:12
Вы заметили, что OP является новичком и имеет знания до цикла while в python?
 – 
sahasrara62
24 Ноя 2021 в 07:21

3 ответа

Лучший ответ

Конечно, зная, что он делает, вы сможете понять код. В цикле while значение index начинается с конца строки и отсчитывается до 0. На каждом шаге он добавляет этот символ (опять же, начиная с конца) в конец строки. список, который он строит. Наконец, он объединяет список в строку.

Итак, учитывая abcd, список строится:

'abcd'  #3 -> ['d']
'abcd'  #2 -> ['d','c']
'abcd'  #1 -> ['d','c','b']
'abcd'  #0 -> ['d','c','b','a']
4
Tim Roberts 24 Ноя 2021 в 07:10

По сути, получить длину строки с помощью метода len. Что вернет вам целочисленное значение, представляющее длину этой строки.

Затем они используют длину этой строки и эффективно выполняют итерацию до нуля в цикле while. Использование оператора -=.

Каждая итерация (то есть каждый раз вокруг цикла) будет уменьшать длину, пока не достигнет нуля.

Итак, давайте воспользуемся hello в качестве примера ввода и рассмотрим это вместе.

reverse_string('hello') - это то, как мы вызываем метод в операторе print вашего кода.

Затем мы входим в функцию и выполняем следующие шаги:

  1. Мы создаем новый пустой массив с именем new_strings.
  2. Мы находим длину начальной строки hello, которая возвращает нам 5. Это означает, что теперь index равно 5.
  3. Мы создаем цикл while, который продолжается до тех пор, пока index не перестанет использовать while(index): - такой цикл while обрабатывает значение 0 как falsy и завершается при достижении этого . Поэтому, когда index равно 0, цикл остановится.
  4. Первая строка этого цикла выполняет index -= 1, что аналогично записи index = index - 1, поэтому в самом первом проходящем цикле мы получаем index = 5 - 1, а затем теперь index равно 4.
  5. Поскольку Python затем позволяет нам получить доступ к character строки с помощью string[index] (и поскольку это работает от 0 до n), выполнение hello[4] фактически даст нам символ o .
  6. Мы также добавляем этот символ в массив new_strings, что означает, что по мере прохождения итераций для достижения нуля он будет добавлять каждый символ в обратном направлении к этому массиву, давая нам ['o', 'l', 'l', 'e', 'h']
  7. Поскольку теперь индекс равен нулю, мы выходим из цикла и выполняем операцию join с массивом, чтобы снова создать строку. Команда ''.join(new_strings) означает, что мы хотим присоединиться к ранее имеющемуся массиву без разделителя. Если бы мы сделали '#'.join(new_strings), вместо этого мы получили бы o#l#l#e#h вместо olleh.

Надеюсь, этот ответ дает вам некоторую ясность.

1
Johan Jarvi 24 Ноя 2021 в 07:20
Ах, это проясняет мои вопросы по последней строчке, которую я собирался задать. Спасибо за объяснение :)
 – 
user17415509
24 Ноя 2021 в 07:36
Совершенно не беспокойтесь. Я рад, что смог помочь. Тем не менее Тим Робертс прав; многие из этих вещей можно понять, изучив основы. Я предлагаю, чтобы всякий раз, когда вы натыкались на код, который не понимаете, попробуйте поискать в документации по языку метод / оператор. Даже если вы не понимаете этого вначале, привычка к этому и попытки понять это очень хорошо послужат вам в продвижении вперед.
 – 
Johan Jarvi
24 Ноя 2021 в 08:28
В качестве примера документация str.join (), которая является частью документации по встроенным типам в Python может подтвердить это будет очень полезно в дальнейшем, но я могу понять, насколько это может показаться ошеломляющим и сбивающим с толку на данном этапе, но очень хорошо выработать привычку находить эти ресурсы и учиться их интерпретировать.
 – 
Johan Jarvi
24 Ноя 2021 в 08:31

Конечно, это очень простая программа. Вам следует обратиться к строковым методам и индексации строк в Python, чтобы получить ясное представление. Позвольте мне объяснить это подробно.

print (reverse_string ('hello')) // Функция печати вызывает другую функцию reverse_string и передав аргумент «привет».

def reverse_string (string) : // Аргумент "привет" сохраняется в переменной строка в функции reverse_string.

**new_strings = []** // created a new empty list
**index = len(string)** // len function returns the length of the argument 
                           passed to the function. len("hello")=5 and assigned 
                           to index. index=5.

while index: // цикл while выполняется до тех пор, пока условие не станет ложным. пример, когда index = 0. в строке индексация начинается с 0. пример. строка [0] = h, строка [1] = e, строка [2] = l, строка [3] = l, строка [4] = o.

    **index -= 1**  //Note the last letter 'o' is in string[4] and the len 
                      function returned 5 so we need to decrement index variable 
                      to 4 so that it will pointing to string[4]=o                     
  

new_strings.append (string [index]) // добавляем строку [4], которая равна o, и так далее ... return '' .join (новые_строки)

0
Dharman 24 Ноя 2021 в 08:28