Уведомления

Группа в Telegram: присоединиться | Jabber-конференция сообщества: pythonua@conference.jabber.ru
  • Начало
  • » Центр помощи
  • » Задача "Разворот последовательности" без применения динамических структур данных [RSS Feed]

#1 Янв. 11, 2018 18:49:00

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 343
Репутация: +  37  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

py.user.next я под тест автора привел решение в котором данные в тестирующей системе подаются в таком виде и явно сказано нельзя пользоваться массивами и прочими динамическими структурами

kamikadze
Test 1
input:
1
2
3
0

Офлайн

#2 Янв. 11, 2018 21:47:29

kamikadze
Зарегистрирован: 2018-01-10
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

py.user.next правильно говорит. Просто большинство рассуждает с точки зрения решения задачи при данных обстоятельствах и в данное время “лишь бы прокатило”, впрочем, как и я. В учебном плане на Курсере часто встречаются несостыкухи пройденного материала с содержанием заданий. Думается, что авторы курса часто забегают вперед, чтобы подстегнуть учащихся самостоятельно искать материал. Но для человека, плохо разбирающегося в архитектуре (мне кажется, этот термин здесь подходит), сложно представить эффективность существующих методов конкретного языка с точки зрения функциональности, прогнозирования (считывать данные за пределами функции и т.п.), легкости кода и т.д. До этого момента я все задания делал исключительно сам: искал недостающий материал в книгах и на профильных сайтах, в том числе по темам, которые еще не были пройдены. А по этому заданию информацию не смог найти. Мы проходили по большей части массивы, и то поверхностно. В процессе учебы я увидел, что все сложные и непонятные в настоящий момент методы, а также саму логику кода можно клепать не из сложных для понимания новичка элементов Питона (типа lambda… вместо стандартной def func()), а с помощью простейших структур, которые еще и позволяет более глубоко понять сам язык и не забыть пройденный материал. И в этом задании я попытался вывести сбор данных в массив в отдельную функцию, чтобы не трогать другую функцию, которая делала бы сам reverse. Как оказалось (py.user.next), я был на правильном пути. Так py.user.next рассуждает с точки зрения архитектора, что даже не в каждой книжке найдешь. А это дает более глубокое понимание учебного материала. Если бы в школе объясняли, где и как мы в будущем смогли бы применить получаемые знания, и для чего они нам нужны в жизни, то образованных людей было бы гораздо больше.

Офлайн

#3 Янв. 12, 2018 03:08:06

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

Задача "Разворот последовательности" без применения динамических структур данных

marvellik
я под тест автора привел решение в котором данные в тестирующей системе подаются в таком виде
Ввод данных бывает двух видов: по длине и по маркеру. Ввод по длине - это когда в начале пишут число элементов, а потом подают эти элементы. Ввод по маркеру - это когда данные идут сразу, но их окончание можно определить по какому-то признаку конца. В данном случае используется ввод по маркеру, где маркером является ноль. В чём минус маркерного ввода? В том, что ты уже ноль в последовательности не можешь использовать, он совпадёт с маркером. То есть подавать можно только натуральные числа, а целые числа ты уже не подашь, потому что в них есть ноль, вся последовательность может из одних нулей состоять.

Вот ты написал функцию, она у тебя расчитана на маркерный ввод. Стоит только расширить эту задачу с натуральных до целых чисел и маркерный ввод надо будет заменить на ввод по длине, что очень часто бывает в таких задачах. И тут-то ты понимаешь, что из-за такой мелочи тебе нужно переписывать всё.

Надо было две функции написать, понимаешь? Одна бы вводила данные, а другая бы их преобразовывала (разворачивала в данном случае). Тогда бы оно не только всё приняло на сайте, но и было бы открыто как для изменения ввода данных, так и для изменения самого преобразования. Ты не смог выделить преобразование в отдельную функцию. Таким образом ты не можешь заменить одно преобразование на другое.

А что это даёт? И зачем это надо?
На курсере десяток таких же заданий и везде разный ввод и разные преобразования. То есть все задания имеют шаблон
<ввод данных><пребразование данных>
Так вот, написав один раз функцию ввода данных, ты десятки раз её потом используешь во всех заданиях. А когда ты её не написал, ты десятки раз пишешь одно и то же, затрачивая на это время.

Поэтому они должны быть разделены, даже если в задании там написано крупными буквами, что они могут быть слитными. Автор задания сегодня может сам не догонять, что он будет писать завтра новое задание, похожее на это задание своим вводом или своим преобразованием.



Офлайн

#4 Янв. 12, 2018 09:56:56

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 343
Репутация: +  37  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

py.user.next спасибо за развернутый ответ. я полностью согласен с этим. но меня наверно сбило с толку ‘нельзя пользоваться массивами и прочими динамическими структурами’ я так понял что даже в качестве аргумента полученного из функции ввода нельзя их использовать но на сайте питонтьютор есть такая задача и решение разработчиков сайта выглядит именно так одной функцией
Решение разработчиков

 def reverse():
    x = int(input())
    if x != 0:
        reverse()
    print(x)
reverse()

Отредактировано marvellik (Янв. 12, 2018 10:22:11)

Офлайн

#5 Янв. 12, 2018 11:03:56

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

Задача "Разворот последовательности" без применения динамических структур данных

marvellik
но на сайте питонтьютор есть такая задача и решение разработчиков сайта выглядит именно так одной функцией
А в жизни, в реальных программах, надо быть готовым чистить ввод и прикреплять к нему всякие Ctrl+C и Ctrl+D, поэтому внутри вычисляющих функций не должно быть ни ввода, ни вывода. Функции, которые выполняют только вычисления, причём всегда одинаково для одних и тех же аргументов, называются чистыми функциями. Чем больше у тебя чистых функций, тем надёжнее код (его гораздо легче тестировать, он всегда полностью предсказуем) и тем реже его придётся менять сам по себе. Для ввода/вывода используются отдельные нечистые функции, в которых эти эффекты изолируются от остальной части программы. Таким образом ты можешь написать и функции чтения из консоли (разные виды чтения), и функции чтения из базы данных (разные виды чтения), и функции чтения из сетевого сокета (разные виды чтения). При этом преобразующие и вычисляющие функции имеют дело только со строго определёнными промежуточными структурами данных, которые не знают, откуда они были прочитаны и куда будут писаться.



Отредактировано py.user.next (Янв. 12, 2018 11:04:45)

Офлайн

#6 Янв. 14, 2018 11:30:02

kamikadze
Зарегистрирован: 2018-01-10
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Задача "Разворот последовательности" без применения динамических структур данных

py.user.next

Спасибо тебе огромное, Товарищ! Посмотрел материал, разные примеры, и мудреные, и не очень. Нашел, как мне кажется, самый простой способ решения с помощью той же пресловутой функции. Особенностью задания является то, что цифры вводятся не одной строкой за раз, а по одной цифре в каждой строке. Таким образом, к кортежам и спискам данное задание, действительно, не имеет никакого отношения. Еще раз спасибо за уделенное время и помощь!

Вот мое решение:

 def reverse(n):
    if n != 0:
        reverse(int(input()))
        print(n)
    else:
        print(n)
reverse(int(input()))

Отредактировано kamikadze (Янв. 14, 2018 11:30:58)

Офлайн

  • Начало
  • » Центр помощи
  • » Задача "Разворот последовательности" без применения динамических структур данных[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version