Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.70/43: Рейтинг темы: голосов - 43, средняя оценка - 4.70
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101

Изучаем Python по книге Лутца

17.04.2020, 12:37. Показов 9163. Ответов 87
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
на 490 стр 5 того издания 1 части Лутца встречаются первые задания по практики...
1. Написание базовых циклов. В данном упражнении предлагается поэкспериментировать с циклами for.
а) Напишите цикл for, который выводит код ASCII каждого символа в строке по
имени S. Для преобразования символа в целочисленный код ASCII используйте встроенную функцию ord (символ). Формально функция ord в Python З.Х
возвращает кодовую точку Unicode, но если вы ограничите содержимое строки символами ASCII, то будете получать обратно коды ASCIL (Опробуйте ее
интерактивно, чтобы посмотреть, как она работает.)
Python
1
2
3
4
s = 'spam'
for i in s:
    v = ord(i)
    print(v, end=' ')
б) Далее измените цикл для вычисления суммы кодов ASCII всех символов в строке.

здесь что то пошло не так..
Python
1
2
3
4
5
s = 'spam'
for i in s:
    v = ord(i)
    print(v, end=' ')
print(sum(v))
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.04.2020, 12:37
Ответы с готовыми решениями:

Объясните текст из книги Лутца "Изучаем python"
В книге написано: В текущей реализации python это ещё и программный пакет который называется интерпретатором. Интерпретатор - это такой...

М. Лутц Изучаем Python. Том 1
Добрый день! Заказал по ошибке 2 книги (5 издание, 1 том) с ozon (...

Лутц Марк - Изучаем Python. 5 издание
Как ориентироваться в исходниках? https://www.oreilly.com/library/view/learning-python-5th/9781449355722/ ...

87
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.04.2020, 19:08
Студворк — интернет-сервис помощи студентам
coa3, Разберем сначала предыдущий пример, который выполняется в интерактивном режиме.

Добавлено через 6 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
>>> X = 'Spam'
>>> def func():
         X = 'NI'
         def nested():
                 print(X)
         nested()
 
    
>>> func()
NI
>>> X
'Spam'
Добавлено через 7 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1.    X = 'Spam'                          # глобальной переменной X присваивается значение 'Spam'.
2.    def func():                           # определяется функция с именем func
 
3.        X = 'NI'    # внутри функции func локальной переменной X присваивается значение 'NI' , так как глобальная   
                             переменная X внутри функции не доступна для записи, и поэтому создается локальная переменная X.
4.        def nested():      # внутри функции func определяется вложенная функция nested, для которой функция func 
                                       является объемлющей.
5.                   print(X)    # все что делает функция nested, это печатает значение переменной X из ближайшей области 
                                        видимости, где есть переменная с именем X.
                                     #  рассмотрим области видимости в соответствии с правилом LEGB: ближайшая область видимости,
                                         где есть X, это область объемлющей функции func, где X присвоено значение 'NI'. Поэтому, 
                                         когда бы мы не вызывали функцию nested, она будет выводить на экран значение X 
                                         из объемлющей области, в данном случае 'NI'.
6.        nested()             # находясь внутри функции func, но снаружи функции nested, при работе функции func, 
                                         эта инструкция вызовет функцию функцию nested, которая,  как мы выяснили выше, 
                                         выведет на экран 'NI'.
Так как мы работаем в интерактивном режиме, то все что возвращают выражения и функции сразу выводится на экран
без использования инструкции print.
 
9. func()                           # вызывается функция func . Так как у функции func() нет внутри инструкции return. то она
                                           ничего не возвращает и потому она сама ничего не выводит на экран, но она вызывает
                                           вложенную функцию nested,  которая используя print(X) выводит на экран значение 'NI'.
11. X                               # интерпритатор в интерактивном режиме выводит значение переменной X из глобальной области.               
                                           (так как мы на данны момент уже вышли из функций и находимся в глобальной области. 
                                          Поэтому выводится значение 'Spam'
Добавлено через 7 минут
coa3, Не получилось удобно разместить пояснения, из за того, что это в интерактивном режиме. Но если что то осталось не понятно, переспросишь.

Добавлено через 11 минут
Цитата Сообщение от coa3 Посмотреть сообщение
к стати как вот этот код засунуть в функцию?
Просто берешь и вставляешь этот код в тело функции. И потом вызываешь эту функцию.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def func():
    n = int(input())
    i = 0
    for i in range(n):
        print('+___', sep='', end=' ')
    print()
 
    for i in range(n):
        print('|', i + 1, ' /', sep='', end=' ')
    print()
 
    for i in range(n):
        print('|', "__", '\\', sep='', end=' ')
    print()
 
    for i in range(n):
        print('|   ', sep='', end=' ')
    print()
 
func()
Выводит:
Python
1
2
3
4
5
5
+___ +___ +___ +___ +___
|1 / |2 / |3 / |4 / |5 /
|__\ |__\ |__\ |__\ |__\
|    |    |    |    |
1
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
27.04.2020, 20:12  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Так как мы работаем в интерактивном режиме, то все что возвращают выражения и функции сразу выводится на экран
без использования инструкции print.
вот отсюдого небольшие непонятки и были, из за интерактивного режима.. остальное то там легко и понятно

Добавлено через 2 минуты
Цитата Сообщение от Viktorrus Посмотреть сообщение
просто берешь и вставляешь этот код в тело функции. И потом вызываешь эту функцию.
я то хотел сократить повторы, то есть for повторяется много раз ну и может частично то что в теле функции for хотелось сократить создав свою функцию, а ни целиком все в создаваемую функцию поместить...

Добавлено через 5 минут
Python
1
2
3
4
for i in range(1, 11):
    for j in range(1, 11):
        print(i * j, end=' ')
    print()
как работает цикл for понятно, i присваивается каждое число из диапазона 1 - 10, дальше создается еще один такой диапазон числе?
и значения перемножаются, но как в итоге получается вот так не пойму...
Python
1
2
3
4
5
6
7
8
9
10
1 2 3 4 5 6 7 8 9 10 
2 4 6 8 10 12 14 16 18 20 
3 6 9 12 15 18 21 24 27 30 
4 8 12 16 20 24 28 32 36 40 
5 10 15 20 25 30 35 40 45 50 
6 12 18 24 30 36 42 48 54 60 
7 14 21 28 35 42 49 56 63 70 
8 16 24 32 40 48 56 64 72 80 
9 18 27 36 45 54 63 72 81 90 
10 20 30 40 50 60 70 80 90 100
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.04.2020, 20:57
coa3, Учись использовать отладчик в пошаговом режиме. С помощью него можно увидеть всю последовательность действий программы и понять ее логику, а так же понять ошибки, когда программа делает не то, что тебе нужно.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.04.2020, 20:58
Каждую строку выводит внутренний цикл, так как print там не заканчивает ввод переводом строки - вместо нее просто пробел " ".
После того как внутренний цикл отрабатывает свой диапазон срабатывает пустой print(), который наоборот вводит символ \n в stdout. И теперь новый внутренний цикл будет уже печатать цифры уже с другой строки.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
27.04.2020, 21:34
Внешний цикл, берет по одному числу из диапазона от 1 до 10. И для каждого числа i из внешнего цикла Запускается внутренний цикл, где берутся по очереди числа от 1 до 10 и умножаются на текущее число i.
Рассмотрим например число 3 из внешнего цикла. Переменной i присваивается число 3 и запускается вложенный цикл.
3*1=3
3*2=6
3*3=9
...
3*9=27
3*10=30
Как мы видим, это числа в третьей строке выводимой информации.
То есть вложенный цикл формирует строку значений произведений для текущего I (в данном случае для числа 3), выводя его произведения на числа из диапазона от 1 до 10.
После того, как вложенный цикл выведет на экран все произведения для текущего i в виде одной строки (числа через пробел), нужно сделать переход на новую строку. Для этого используется print() без аргументов. Все что делает этот print(), это делает переход на следующую строку, потому что в эту функцию по умолчанию заложен переход на следующую строку.
Python
1
print(end='\n')
Добавлено через 13 минут
Цитата Сообщение от coa3 Посмотреть сообщение
for повторяется много раз
У тебя for работает n раз, но тело цикла записано в одном экземпляре. Функция тебе тут ничего не даст. Смысл функции, когда тебе нужно один и тот же код использовать в разных местах и что бы не повторять одни и те же куски кода несколько раз, записывают этот код в функцию, и в нужных местах вызывают эту функцию. Это первое для чего используются функции. Второе для чего используются функции, это для структурирования кода. Если громоздкий код можно разбить на имеющие конкретный смысл куски, то эти куски оформляют в виде функций (хотя они и используются по одному разу). Но такой код удобнее читать и он более понятен. То есть ты видишь структуру кода в виде блоков и при необходимости можешь разобраться в работе каждого блока, которые оформлены в виде функций.
1
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
27.04.2020, 22:46  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Учись использовать отладчик в пошаговом режиме.
то он у меня запускается, а то не запускается..
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.04.2020, 00:08
coa3, Разбирайся, без отладчика никак. Я ничем помочь не могу, так как pycharm не знаю.
Я работаю со средой разработки Microsoft Visual Studio Community 2017. Эта версия официально бесплатная. Мощная программа, но требует более мощного компьютера чем PyCharm. В обшем со средой разработки разбирайся, без хорошего отладчика программировать не сможешь.
0
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
28.04.2020, 12:24  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Внешний цикл, берет по одному числу из диапазона
Python
1
2
3
4
# По данному натуральному n≤9 выведите лесенку из n ступенек, i-я ступенька состоит из чисел от 1 до i без пробелов.
N = int(input())
for x in range(1, N+1):
    print(*range(1, x+1), sep='')
вроде и схожий простой пример, но сам не могу такое решить и до такого кода дойти...
первые 2 строчки да, а следующую строчку уже не смог бы осилить..
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
28.04.2020, 16:16
Цитата Сообщение от coa3 Посмотреть сообщение
а следующую строчку уже не смог бы осилить..
Естественно. Ведь ты еще не изучил главу "Аргументы", и поэтому не знаешь, что такое звезда * в аргументах функции print().
Не берись за задания, которые тебе еще рано решать, так как они требуют знаний, которых у тебя еще нет.
Не гони лошадей, а изучай главу "Аргументы".
Кстати * в аргументах не усваивается сходу. Я не раз возвращался к тому месту в книге, где она объясняется. Понимание усложняется тем, что * по разному трактуется, в зависимости от того где она используется, в определении функции или в вызове функции. В определении функции * группирует аргументы, а в вызове функции наоборот разгруппировывает.

Добавлено через 20 минут
range(1, x+1), при x равном 3 возвращает список чисел [1, 2, 3]. В свою очередь звезда * при вызове функции распаковывает этот список в набор позиционных аргументов и мы получим:
Python
1
print(1, 2, 3, sep='')
Что выведет очередную строку на данном (третьем) шаге цикла
123
В итоге, программа при N равном например 5, выведет:
Python
1
2
3
4
5
6
5
1
12
123
1234
12345
1
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
07.05.2020, 14:28  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Естественно. Ведь ты еще не изучил главу "Аргументы", и поэтому не знаешь, что такое звезда * в аргументах функции print(
почитал об аргументах, осталось 250 стр. голой теории и это только в первом томе...
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
07.05.2020, 15:12
coa3, Когда закончишь изучение части iV "Функции и генераторы", то скажешь. Тогда нужно будет вернуться назад, к изучению пропущенной главы 7 "Фундаментальные основы строк". И попутно начнем практиковаться с решением задач. Я буду выбирать с этого форума подходящие для тебя задачи. Ты будешь пробовать решить эти задачи самостоятельно, и потом будем делать подробный анализ задачи и твоего решения, здесь в твоей теме.

Добавлено через 1 минуту
coa3, И задавай вопросы по изучаемому тобой материалу. Или тебе все понятно?
1
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
07.05.2020, 22:20  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
И задавай вопросы по изучаемому тобой материалу. Или тебе все понятно?
да когда читаю, то процентов на 90 понятно, но боюсь что забывается начало..((

Добавлено через 1 минуту
Цитата Сообщение от Viktorrus Посмотреть сообщение
Фундаментальные основы строк
я это тоже читал, единственно там где всякие форматирования с % не усвоил..

Добавлено через 23 минуты
к стати по прежнему моя самая большая проблема, слабое место в цепи это циклы while и в меньшей степени for в их усложненном виде, пока я не разберусь в них на все 100, буду не верить в себя...
списки, словари и все остальное, что уже прошел, намного проще и усвоилось в определенной степени, а циклы...
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
08.05.2020, 02:14
coa3, Закончишь эту часть, и закрепим пройденное решением задач, которые я сам буду подбирать тебе. А форматирование разберем подробно , но с современным синтаксисом. Форматные строки (f-string). В Лутце их нет, но я дам источник. И подробно их изучим. Это очень мощное средство форматирования. Займемся форматированием, когда закончишь изучать часть iV "Функции и генераторы".
1
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
08.05.2020, 14:32  [ТС]
575 стр. Лутц
Python
1
2
3
4
5
6
7
def mysum (L) :
    print(L)
    if not L:
        return 0
    else:
        return L[0] + mysum(L[l:]) # Рекурсивный вызов самой себя
#»> mysum([1, 2, 3, 4, 5])
[1, 2, 3, 4, 5]
[2r 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
вообще не понимаю, почему принт L печатает список с уменьшением цифр, по мне так как сумма 15 получается понятно, а что заставляет это печатать...

Добавлено через 11 минут
честно говоря и этот вариант тоже не очень...
Python
1
2
3
4
5
L = [1, 2, 3, 4, 5]
sum = О
while L:
    sum += L[0]
    L = L[l:]
понятно и легко только это:

Python
1
2
3
L = [1, 2, 3, 4, 5]
sum = О
for х in L: sum += x
Добавлено через 11 минут
577стр. что то тоже несуразное просто...
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
08.05.2020, 19:46
coa3, Я тебе уже как то говорил об этом, но ты видимо забыл.
Существует два режима работы интерпретатора.
1) Интерактивный режим, когда интерпретатор сразу выполняет инструкцию, как только ты ее вводишь.
2) Режим выполнения кода из файла.
В интерактивном режиме например по умолчанию работает IDLE, или когда интерпретатор загружен в командной строке ОС. То, что мы находимся в интерактивном режиме, можно увидеть по подсказке >>> .
И у Лутца в книге, если в напечатанном коде мы видим подсказки >>> , то это значит предлагается пример, который исполняется в интерактивном режиме, например в IDLE .
В этих двух режимах существует разница в механизме вывода результата на экран.
В интерактивном режиме, если мы вводим имя переменной или вызываем функцию (как у тебя) то результат выводится на экран автоматически (без использования функции print().)
Когда же у нас выполняется код из файла, то вывод на экран производится только через функцию print().
Посмотрим твой пример.
Python
1
2
3
4
5
6
7
8
9
>>> def mysum (L) :
    if not L:
        return 0
    else:
         return L[0] + mysum(L[1:]) # Рекурсивный вызов самой себя
 
        
>>> mysum([1, 2, 3, 4, 5])
15
Здесь мы видим подсказку-приглашение к вводу >>> . Значит пример рассматривается для интерактивного режима, где для вывода на экран функция print() не требуется. И так как функция возвращает 15, то это число в интерактивном режиме интерпретатор непосредственно выводит на экран (без использования print()).

Не по теме:

Мне нужно отойти на 30 мин, второй пример объясню чуть позже.



Добавлено через 25 минут
coa3, Извини, я вывел другой пример, но твой пример, как мы видим, тоже предполагает использования интерактивного режима.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> def mysum (L) :
    print(L)
    if not L:
        return 0
    else:
         return L[0] + mysum(L[1:]) # Рекурсивный вызов самой себя
 
        
>>> mysum([1, 2, 3, 4, 5])
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
15
>>>
В нем добавлена функция print(L), так как в этой точке интерпретатор, в том числе и в интерактивном режиме, не будет автоматически выводить нужную информацию. Поэтому мы делаем вывод на экран с помощью функции print().

Добавлено через 4 минуты
Подытожим. Конечный результат, возвращаемый функцией mysum() выводится в интерактивном режиме автоматически. А для промежуточных результатов, которые не будут в интерактивном режиме выводится автоматически, выводятся с помощью функции print().

Добавлено через 1 час 18 минут
coa3, Во втором примере у тебя та же ошибка. У Лутца этот пример для интерактивного режима, ты же выводишь сюда код для файла. Ты вообще то пользуешься IDLE ? Такие примеры лучше реализовать в нем. Должно быть так
Python
1
2
3
4
5
6
7
8
>>> L = [1, 2, 3, 4, 5]
>>> sum = 0
>>> while L:
    sum += L[0]
    L = L[1:]
    
>>> sum
15
Кстати, ты видимо копируешь код из книги, потому что у тебя в строке sum = 0 вместо нуля стоит буква "О". Кстати копировать код с книги нужно аккуратно, так как часто происходят искажения. Вместо цифры 1 копируется латинская буква "l" , кавычки копируются типогравские, у которых другой наклон, и питон их не понимает, а так же другие ошибки.
Теперь разберем работу данного примера. В нем нужно сложить все числа из списка. Мы это делаем прибавляя на каждом шаге цикла очередное значение из списка до тех пор, пока не переберем все элементы списка.
Как мы это делаем.
Перед циклом инициализируем переменную sum , куда будем прибавлять числа из списка. Что бы инициализировать переменную, нужно присвоить ей значение. Но что бы это значение не искажало результат, присваиваем ноль sum = 0.
Затем в цикле по очереди берем по одному элементу из списка. Это можно делать разными способами, например создав переменную-счетчик и считать циклы. Затем в зависимости от номера цикла брать элемент по соответствующему его смещению в списке.
Здесь же используется другой способ.
После каждого шага цикла мы копируем срезом часть списка, оставляя только те элементы, которые мы еще не использовали.
Поэтому при каждом шаге мы берем всегда первый элемент из списка. Прибавляем его к sum и делаем срез, в который уже не входит использованный элемент. И шаги цикла while повторяются до тех пор, пока очередной срез не вернет пустой список []. Но так, как любой пустой объект , как и число ноль, в условии питон оценивает как FALSE, то в шапке цикла while получая в условии пустой список [] , условие будет определено как FALSE, и цикл прекратит свою работу.
Затем в интерактивном режиме, введя переменную sum , автоматически будет выведено ее значение, то есть сумма чисел из списка.

Добавлено через 4 минуты
Цитата Сообщение от coa3 Посмотреть сообщение
577стр. что то тоже несуразное просто...
Выкладывай по очереди все несуразное, будем разбираться.
Если из моего объяснения, что то остается не ясным, задавай дополнительные вопросы.

Добавлено через 5 минут
coa3, Кстати я вот что подумал, у тебя такая не приязнь к циклам не потому, что циклы для тебя сложны, а потому, что у тебя еще не достаточно опыта, что бы решать сложные задачи, а ты пытаешься решать задачи с циклами, содержимое которых требует больше знаний. И дело тут не в понимании тобой циклов, а в понимании того, что закладывается в тело цикла и требует дополнительных знаний, не связанных с циклом, как таковым.

Добавлено через 9 минут
coa3, Цикл while очень простой. Проверяется условие и если оно TRUE, то выполняется то, что в теле цикла. После этого управление передается снова к шапке цикла и вновь проверяется условие. И это повторяется до тех пор, пока выполняя действия в теле цикла, мы не поменяем условие на FALSE. И тогда, после передачи управления к шапке цикла, цикл увидев, что условие равно FALSE, прерывает свою работу и передает управление на следующую за циклом строку.
0
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
08.05.2020, 21:07  [ТС]
Цитата Сообщение от Viktorrus Посмотреть сообщение
Я тебе уже как то говорил об этом, но ты видимо забыл.
я понимаю разницу между интерактивном режимом и интерпретатором, вопрос не в этом абсолютно, вопрос в непонятности работы этой функции..
я тоже очень часто в теле когда вставляю много принтов, что бы понять, на каких то моментах, что происходит, так сказать поэтапно...
вот здесь когда вставили принт с (L) как раз и стал непонятен результат вывода...
вот этот...
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]

Добавлено через 2 минуты
Цитата Сообщение от Viktorrus Посмотреть сообщение
Ты вообще то пользуешься IDLE
да я раньше этим пользовался и у меня на рабочем столе остался значок IDLE...

Добавлено через 16 минут
Цитата Сообщение от Viktorrus Посмотреть сообщение
Поэтому при каждом шаге мы берем всегда первый элемент из списка. Прибавляем его к sum и делаем срез, в который уже не входит использованный элемент. И шаги цикла while повторяются до тех пор, пока очередной срез не вернет пустой список [].
все равно не понимаю, как здесь устроен счетчик цикла...
L = [1, 2, 3, 4, 5]
>>> sum = 0
>>> while L: # пока L существует, то есть не пустой объект
sum += L[0] # sum = 0 + 1
L = L[1:] # L = все элементы списка начиная с первого

Добавлено через 2 минуты
Цитата Сообщение от Viktorrus Посмотреть сообщение
Проверяется условие и если оно TRUE, то выполняется то, что в теле цикла. После этого управление передается снова к шапке цикла и вновь проверяется условие. И это повторяется до тех пор, пока выполняя действия в теле цикла, мы не поменяем условие на FALSE. И тогда, после передачи управления к шапке цикла, цикл увидев, что условие равно FALSE, прерывает свою работу и передает управление на следующую за циклом строку.
это я знаю, как устроено, но написать самому не всегда получается, и пример выше даже по написанному не разберу..

Добавлено через 3 минуты
Цитата Сообщение от Viktorrus Посмотреть сообщение
Выкладывай по очереди все несуразное, будем разбираться.
там вся страница такая... "Рекурсия или очереди и стеки"
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
08.05.2020, 21:52
Цитата Сообщение от coa3 Посмотреть сообщение
вообще не понимаю, почему принт L печатает список с уменьшением цифр, по мне так как сумма 15 получается понятно, а что заставляет это печатать...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
depth = 0
def mysum (L) :
    global depth
    res = 0
    depth +=1
    if not L:
        res = 0
    else:
        
        # здесь мы только предвычисляем, готовим базу для вычислений
        print("прямой ход рекурсии:  D:[%02d] Res=>[%-2d]:" % (depth,res), L)
        res = L[0] + mysum(L[1:]) # рекурсивный вызов - водораздел двух этапов вычислений
        depth -=1
        #  а вот на этой стадии происходит непосредственый возврат значений всех помещенных в стек вызовов функций
        print("обратный ход рекурсии D:[%02d] Res=>[%-2d]:" % (depth,res), L)
    
    return res
        
mysum([1, 2, 3, 4, 5])
Code
1
2
3
4
5
6
7
8
9
10
прямой ход рекурсии:  D:[01] Res=>[0 ]: [1, 2, 3, 4, 5]
прямой ход рекурсии:  D:[02] Res=>[0 ]: [2, 3, 4, 5]
прямой ход рекурсии:  D:[03] Res=>[0 ]: [3, 4, 5]
прямой ход рекурсии:  D:[04] Res=>[0 ]: [4, 5]
прямой ход рекурсии:  D:[05] Res=>[0 ]: [5]
обратный ход рекурсии D:[05] Res=>[5 ]: [5]
обратный ход рекурсии D:[04] Res=>[9 ]: [4, 5]
обратный ход рекурсии D:[03] Res=>[12]: [3, 4, 5]
обратный ход рекурсии D:[02] Res=>[14]: [2, 3, 4, 5]
обратный ход рекурсии D:[01] Res=>[15]: [1, 2, 3, 4, 5]
https://foxford.ru/wiki/inform... d-rekursii

P.S. Нужно почитать про теорию рекурсии. Она довольно обширная и сложная. Или посмотреть видеоуроки на эту тему.
Хирьянов неплохо объясняет в курсе по Python.
1
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
08.05.2020, 22:17  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Хирьянов неплохо объясняет в курсе по Python.
вот я его к стати тоже недавно не спеша начал смотреть
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
08.05.2020, 22:55
Цитата Сообщение от coa3 Посмотреть сообщение
все равно не понимаю, как здесь устроен счетчик цикла...
Здесь нет счетчика цикла. В цикле while изначально не предусматривается счетчик цикла. Здесь циклом управляет условие в шапке. В некоторых случаях это условие может определятся заранее созданным счетчиком цикла, но чаще условием управляют другим способом, например флагом (переменной, значение которой при необходимости меняют внутри тела цикла). Или другими способами, отслеживая какие либо события внутри цикла. В данном примере таким событием является исчерпывание содержимого списка, то есть когда список становится пустым []. Это в данном случае является условием для прекращения работы цикла while, и выхода из него.
То есть для использования цикла while, нужно четко определить условие, при истинности которого цикл работает повторяя одни и те же действия снова и снова, а при ложности цикл прекращает работу и передает управление в строку кода за циклом.

Добавлено через 7 минут
Цитата Сообщение от coa3 Посмотреть сообщение
L = L[1:] # L = все элементы списка начиная с первого
Не верно, в питоне счет начинается с нуля. Поэтому L = L[1:] # L = будут элементы списка начиная со второго, который имеет смещение 1. Первый элемент имеет смещение "0". Мы на очередном шаге его использовали и создаем список без него L[1:], начиная со второго, который для следующего прохода в новом списке уже становится первым, со смещением "0".

Добавлено через 12 минут
Цитата Сообщение от coa3 Посмотреть сообщение
вот здесь когда вставили принт с (L) как раз и стал непонятен результат вывода...
вот этот...
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
Garry Galler, тебе объяснил механизм, почему так выводит. А еще очень полезно для понимания , как работает программа, использовать отладчик в пошаговом режиме. Делаешь шаг и смотришь, что происходит, какие значения принимают переменные. Ты отладчиком пользуешься? Это очень важно, когда разбираешься, как работает чужая программа, или твоя, когда она делает не то, что тебе нужно. Без отладчика я вообще не представляю как можно программировать. Это нужно быть супер профессионалом. Хотя супер профессионалы решают супер сложные задачи, и им в этом случае тоже без отладчика не обойтись.

Добавлено через 8 минут
Цитата Сообщение от coa3 Посмотреть сообщение
там вся страница такая... "Рекурсия или очереди и стеки"
Но страница там состоит не из одного примера а из нескольких. Так же из нескольких абзацев, где даются понятия. Вот и пиши какое понятие ты не можешь осмыслить или какой пример тебе не понятен. Не понятны все? Тогда начинай с первого, и выкладывай его сюда, написав что тебе в нем не понятно, какие в нем строки не понятны.
0
1 / 1 / 0
Регистрация: 27.02.2020
Сообщений: 101
09.05.2020, 14:23  [ТС]
установил Visual Studio Code
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2020, 14:23
Помогаю со студенческими работами здесь

Не работает код Эрик Матиз - Изучаем Python, упражнение 19.1
Здравствуйте Помогите пожалуйста с решением задачи 19.1 из книги Эрика Матиза - Изучаем Python Блог: создайте новый проект Django...

Изучаем С++ по книге Майкла Доусона
Всем привет, недавно начал изучать C++ и начал я с книги (Майкл Доусон - Изучаем С++ через программирование игр) по мере прочтения и...

Исходники к книге Дэвида Гриффитса - Изучаем программирование на с
Может есть у кого-нибудь хоть какие-нибудь???

Обучение программированию по книге "Изучаем С#"
Я ничего не знал о С# и почемуто купил книгу "Изучаем С#" (3-е издание 2014) Эндрю Стиллмен и Дженифер Грин дочитал до 350 страницы и...

Проект на PyGame из книги «Изучаем Python. Программирование игр, визуализация данных, веб-приложения», Мэтиза
Пишу первый проект на Питоне, никак не могу разобрать как исправить ошибку. Код переписывать (перекопировать с учебника) уже пытался.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru