Уведомления

Группа в Telegram: @pythonsu

#1 Июль 28, 2017 18:55:46

Jetactiv
Зарегистрирован: 2017-07-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните код

Я новичок в изучении 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)

Отредактировано Jetactiv (Июль 28, 2017 20:23:24)

Офлайн

#2 Июль 28, 2017 20:21:08

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Объясните код

код нужно оборачивать в теги code.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Июль 29, 2017 00:50:38

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните код

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’ и точно так же медленно проходишь для неё всё.
Так ты находишь все пути кода, куда строка может попасть.

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



Отредактировано py.user.next (Июль 29, 2017 00:59:23)

Офлайн

#4 Июль 29, 2017 22:55:11

unza
Зарегистрирован: 2017-07-26
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните код

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) # выводят  результат


Отредактировано unza (Июль 29, 2017 22:55:59)

Офлайн

#5 Июль 29, 2017 23:10:45

Jetactiv
Зарегистрирован: 2017-07-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Объясните код

unza, Спасибо огромное!!!
Я просто только три дня учу питон, и это вообще мой первый язык программирования. Очень сложно подстроить женские мозги к такой логике

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version