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’ и точно так же медленно проходишь для неё всё.
Так ты находишь все пути кода, куда строка может попасть.
Это, кстати, важное занятие, потому что так ты можешь легко определять, что код неправильный. Такое часто бывает - код вроде красивый, но в нём ошибка и этого сразу не видно.
Потом (как научишься) просто смотришь на код и у тебя возникает подозрение, что у него в каком-то месте ошибка. Подбираешь строку, которая предположительно ошибку должна дать, и начинаешь вместе с этой строкой медленно проходить строки кода. Это как бы внутренний дебаггер, и тренируется он как раз в такие моменты. Ты тренируешься и код в голове составлять, и уже написанный код просматривать по всем его ветвям.
А классически всё это учат делать путём
построения блок-схем кода. Многие потом говорят “зачем мы их учили, они всё равно не пригодились”, но их как раз и дают чтобы
развить воображение, дать такой универсальный инструмент для описания алгоритма в виде картинок.