Найти - Пользователи
Полная версия: Объясните код
Начало » Python для новичков » Объясните код
1
Jetactiv
Я новичок в изучении Python
Имею трудность в понимании нижеописанного кода. Я знаю, что в конечном результате он делает,(ищет самую длинную упорядоченную подстроку из букв в введенной строке) но я хочу понимать, КАК он это делает, и понимать. какую роль в этом процессе играет каждая строка.
Пока понимаю только до строчки, которая начинается if len(final_out)<len(output) - то есть я понимаю, что здесь сравнение длины этих списков, но зачем?
И зачем и что делает каждая последующая строка? Объясните, пожалуйста…

 s = input("Enter a string: ")
final_out = ""
output = ""
prev = ""
for cur in s:
    if cur >= prev:
        output += cur
        if len(final_out) < len(output):
            final_out = output
    else:
        output = cur
    prev = cur
print(final_out)
JOHN_16
код нужно оборачивать в теги code.
py.user.next
Jetactiv
но я хочу понимать, КАК он это делает, и понимать. какую роль в этом процессе играет каждая строка.
Там есть не только строки, но и невидимые логические связи, заложенные в этот код. Половину дела делают эти строки кода, а половину дела делают эти логические связи невидимые.

Чтобы понять код, ты его выносишь в функцию, а потом проводишь с ней эксперименты, подавая разные строки:
  
>>> def f(s):
...     final_out = ""
...     output = ""
...     prev = ""
...     for cur in s:
...         if cur >= prev:
...             output += cur
...             if len(final_out) < len(output):
...                 final_out = output
...         else:
...             output = cur
...         prev = cur
...     return final_out
... 
>>> f('')
''
>>> f('a')
'a'
>>> f('ab')
'ab'
>>> f('ba')
'b'
>>>

Вот ты берёшь строку ‘a’ и начинаешь для неё вручную (как бы вместе с ней) всё проходить, чтобы понять, как она попадаёт в результат.
Потом берёшь строку ‘ab’ и точно так же медленно проходишь для неё всё.
Так ты находишь все пути кода, куда строка может попасть.

Это, кстати, важное занятие, потому что так ты можешь легко определять, что код неправильный. Такое часто бывает - код вроде красивый, но в нём ошибка и этого сразу не видно.
Потом (как научишься) просто смотришь на код и у тебя возникает подозрение, что у него в каком-то месте ошибка. Подбираешь строку, которая предположительно ошибку должна дать, и начинаешь вместе с этой строкой медленно проходить строки кода. Это как бы внутренний дебаггер, и тренируется он как раз в такие моменты. Ты тренируешься и код в голове составлять, и уже написанный код просматривать по всем его ветвям.
А классически всё это учат делать путём построения блок-схем кода. Многие потом говорят “зачем мы их учили, они всё равно не пригодились”, но их как раз и дают чтобы развить воображение, дать такой универсальный инструмент для описания алгоритма в виде картинок.
unza
Jetactiv, еще вопрос - какая более упорядоченней последовательность в этой строке: abxzaabbc? Как по мне, задание не совсем корректное.
Что код с недоработками py.user.next - уже намекнул.

Что касается понимания кода - как вариант можно добавить принт переменной после интересующего шага и смотреть что там получается.
Например print (cur) после начала цикла - увидим чему она равна на каждом этапе прохождении этого цикла.

Что происходит в каждой строке:
  s = input("Enter a string: ") # Ввод строки
final_out = "" # задание переменной конечного результата
output = "" # задание промежуточной переменной
prev = "" # задание промежуточной переменной
for cur in s: # начало цикла, в котором будет перебираться по очереди каждая буква строки и заноситься в переменную [i] cur[/i]
    if cur >= prev: # текущая буква сравнивается с предыдущей
        output += cur # если текущая 'больше' предыдущей, то она прибавляется к промежуточной переменной [i]output[/i] 
        if len(final_out) < len(output): # сравнивается длина переменной конечного результата и длина полученной упорядоченной строки в [i]output[/i] 
            final_out = output # если конечный результат [i]final_out[/i] меньше новой переменной [i]output[/i], он ей приравнивается
    else: 
        output = cur # если текущая меньше  предыдущей, то переменная промежуточного результата задается равной текущей переменной
    prev = cur # предыдущую переменную хранящую букве приравнивают к текущей (сдвигают последовательность). Конец цикла.
print(final_out) # выводят  результат


Jetactiv
unza, Спасибо огромное!!!
Я просто только три дня учу питон, и это вообще мой первый язык программирования. Очень сложно подстроить женские мозги к такой логике
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB