Найти - Пользователи
Полная версия: Как, не используя функции, сделать код элегантнее и лаконичнее?
Начало » Python для новичков » Как, не используя функции, сделать код элегантнее и лаконичнее?
1 2 3 4 5
shotokan
JOHN_16
и да и нет. Да - если вы хотите педантично последовательно следовать всему что написано в конкретно этой книге. Нет - если вы действительно хотите обучиться языку и программированию в целом, то про такой узкий подход надо забыть сразу. Программисту свойственно широко черпать информацию и из разных источников, и не останавливатсья на достигнутом.
И еще, не читал Доусона, но в целом могу сказать что учебные примеры в реальные жизни часто не используются. Ибо на то они и учебные. Так что на них зацикливаться может и вовсе не стоит.
Я не против!
Ну не может человек, который учиться ездить на автомобиле, сразу сделать полицейский разворот. Ему нужно получить основы знаний и уже потом совершенствовать свои навыки.

Python для изучения я выбрал, в первую очередь из-за дружелюбного комьюнити. Так мне показалось при беглом просмотре форума. Если человека задавить, то он бросит это дело, и возможно никогда больше не начнет кодить. А ведь это так интересно.

Кстати, как мой код? Ужас или УЖАС-УЖАС!!!
Babay82
Может поздно, а может кому и пригодиться, исходя из изученного в книге до главы в которой эта задача включительно, у меня получилось вот( то что я изучил в этой книге до этого момента, весь опыт в программировании, который у меня есть):
 print("""Для изменения характеристики героя
        введите её номер:
        1 - Здоровье
        2 - Сила
        3 - Мудрость
        4 - Ловкость
        """)
character = [["Здоровье",0] , ["Сила",0] , ["Мудрость",0] , ["Ловкость",0] , ["Нераспределенное",30]]
choice = ""
while choice != "хватит":
    for i in character:
        print(i)
    choice = int(input("Выберите характеристику для изменения:"))
    value = int(input("Введите число на которое изменяете начение, если уменьшить то отрицательное:"))
    character[choice-1][1] += value
    character[4][1] -= value
    if character[4][1] <= 0:
        print("У вас нет такого количества свободных очков, свободные очки в пункте - Нераспределенное!")
        character[4][1] += value
        character[choice-1][1] -= value
  
FishHook
Babay82
Позволю себе маленький совет по чистоте кода. Ваша программа нарушает принцип DRY
Babay82
FishHook
FishHook
Babay82Позволю себе маленький совет по чистоте кода. Ваша программа нарушает принцип DRY
А можно поинтересоваться в чем именно? Погуглил информацию по DRY не совсем понял в чем нарушение?
FishHook
Babay82
Очевидно, что если вы захотите проапгрейдить свою программу и “Мудрость” переназвать “Знанием”, то исправления коснутся двух частей программы

 print("""Для изменения характеристики героя
введите её номер:
1 - Здоровье
2 - Сила
3 - Мудрость # ТУТ
4 - Ловкость
""")
character = [["Здоровье",0] ,
["Сила",0] ,
["Мудрость",0] , # И ТУТ
["Ловкость",0] ,
["Нераспределенное",30]]

Это значит, что вы неудачно спроектировали свою программу - она плохо модифицируется.
Babay82
FishHook
Я изучаю программирование вообще( не именно я зык Python) месяц, по часу / два ( а иногда ни одного) в день. По книге Доусона. Тут задача стояла, с помощью изученного к данному моменту материала( с 1й по 5ю главу- это типы, переменные, ветвление, циклы while и for, строки, кортежи, списки, словари и всё)) , написать программу которая между 4мя характеристиками распределяет 30 очков, и при этом что бы была возможность вернуть их обратно и перераспределить. Код писался непосредственно только для выполнения этой задачи, без дальнейших планов модификации, исключительно в целях усвоения пройденного материала(верхняя строка описание дописалась уже после , для порядка). Меня интересует оценка непосредственно самого кода выполнения программы, относительно поставленных задач?
Babay82
FishHook
А DRY у нас ещё впереди, будем изучать и применять
PEHDOM
Babay82
Код писался непосредственно только для выполнения этой задачи, без дальнейших планов модификации, исключительно в целях усвоения пройденного материала(верхняя строка описание дописалась уже после , для порядка). Меня интересует оценка непосредственно самого кода выполнения программы, относительно поставленных задач?
Ну как вам сказать, ИМХО тут нехватает “защиты от дурака”. Вы сделали только контроль нераспределенных характеристик при списывании, а где контроль при возврате? Тоесть я могу ввести -10000 и получу 10030 нераспределенных очков сходу.

FishHook
Babay82
Код писался непосредственно только для выполнения этой задачи, без дальнейших планов модификации, исключительно в целях усвоения пройденного материала(верхняя строка описание дописалась уже после , для порядка). Меня интересует оценка непосредственно самого кода выполнения программы, относительно поставленных задач?

Понятно, что выполняя учебные задачи вы тренируете какой-то конкретный аспект полученных знаний, но это не значит, что можно не обращать внимания на другие аспекты. Искусство программиста вовсе не в циклах и ветвлениях, это всё ерунда - арифметика, надо с первых шагов учиться писать чистый и понятный код. А какие у нас основополагающие правила хорошего кода? Во-вепрых, задачу следует стремиться решить в общем виде. Давайте посмотрим на ваш код:
character[4][1] -= value
Какая есть необходимость жестко привязывать решение именно к четырем характеристикам? Вася, Петя и Коля получают задачу из стартового поста, но у Васи вариант А (четыре характеристики), у Пети Б (пять характеристик), а у Коли В (шесть характеристик). Вася и Петя решили задачу для своего частного случая, а Коля решил в общем виде - его программа легко модифицируется под любое количество характеристик. Чья программа лучше? Конечно, колина, ведь он один сделал и свою работу и васину и петину. Он более эффективен как программист, его код более ценен и Коля закончив курсы получает более высокооплачиваемую должность, хотя в циклах и ветвлениях они все понимают одинаково.

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

Babay82
переменные, ветвление, циклы while и for, строки, кортежи, списки, словари и всё
Отлично! У вас есть все, чтобы написать программу более правильно. Попробуйте.
Babay82
PEHDOM
 print("""Для изменения характеристики героя
        введите её номер:
        1 - Здоровье
        2 - Сила
        3 - Мудрость
        4 - Ловкость
        """)
character = [["Здоровье",0] , ["Сила",0] , ["Мудрость",0] , ["Ловкость",0] , ["Нераспределенное",30]]
choice = ""
while choice != "хватит":
    for i in character:
        print(i)
    choice = int(input("Выберите характеристику для изменения:"))
    value = int(input("Введите число на которое изменяете начение, если уменьшить то отрицательное:"))
    character[choice-1][1] += value
    character[4][1] -= value
    if character[4][1] < 0 or character[4][1] > 30:
        print("Вы превысили лимит! Сумма всех очов не может быть больше 30!")
        character[4][1] += value
        character[choice-1][1] -= value
а так?
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