Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2015 00:04:28

shotokan
Зарегистрирован: 2015-07-06
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

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

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

Кстати, как мой код? Ужас или УЖАС-УЖАС!!!

Офлайн

#2 Фев. 19, 2019 13:15:32

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

Может поздно, а может кому и пригодиться, исходя из изученного в книге до главы в которой эта задача включительно, у меня получилось вот( то что я изучил в этой книге до этого момента, весь опыт в программировании, который у меня есть):

 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
  

Офлайн

#3 Фев. 19, 2019 15:33:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

Babay82
Позволю себе маленький совет по чистоте кода. Ваша программа нарушает принцип DRY



Офлайн

#4 Фев. 20, 2019 07:35:48

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

FishHook

FishHook
Babay82Позволю себе маленький совет по чистоте кода. Ваша программа нарушает принцип DRY
А можно поинтересоваться в чем именно? Погуглил информацию по DRY не совсем понял в чем нарушение?

Офлайн

#5 Фев. 20, 2019 09:01:38

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

Babay82
Очевидно, что если вы захотите проапгрейдить свою программу и “Мудрость” переназвать “Знанием”, то исправления коснутся двух частей программы

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

Это значит, что вы неудачно спроектировали свою программу - она плохо модифицируется.



Офлайн

#6 Фев. 20, 2019 14:51:48

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

FishHook
Я изучаю программирование вообще( не именно я зык Python) месяц, по часу / два ( а иногда ни одного) в день. По книге Доусона. Тут задача стояла, с помощью изученного к данному моменту материала( с 1й по 5ю главу- это типы, переменные, ветвление, циклы while и for, строки, кортежи, списки, словари и всё)) , написать программу которая между 4мя характеристиками распределяет 30 очков, и при этом что бы была возможность вернуть их обратно и перераспределить. Код писался непосредственно только для выполнения этой задачи, без дальнейших планов модификации, исключительно в целях усвоения пройденного материала(верхняя строка описание дописалась уже после , для порядка). Меня интересует оценка непосредственно самого кода выполнения программы, относительно поставленных задач?

Офлайн

#7 Фев. 20, 2019 14:54:46

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

FishHook
А DRY у нас ещё впереди, будем изучать и применять

Офлайн

#8 Фев. 20, 2019 16:01:27

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

Babay82
Код писался непосредственно только для выполнения этой задачи, без дальнейших планов модификации, исключительно в целях усвоения пройденного материала(верхняя строка описание дописалась уже после , для порядка). Меня интересует оценка непосредственно самого кода выполнения программы, относительно поставленных задач?
Ну как вам сказать, ИМХО тут нехватает “защиты от дурака”. Вы сделали только контроль нераспределенных характеристик при списывании, а где контроль при возврате? Тоесть я могу ввести -10000 и получу 10030 нераспределенных очков сходу.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#9 Фев. 21, 2019 05:04:01

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

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

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

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

Babay82
переменные, ветвление, циклы while и for, строки, кортежи, списки, словари и всё
Отлично! У вас есть все, чтобы написать программу более правильно. Попробуйте.



Отредактировано FishHook (Фев. 21, 2019 05:06:10)

Офлайн

#10 Фев. 21, 2019 11:56:30

Babay82
Зарегистрирован: 2019-02-19
Сообщения: 39
Репутация: +  0  -
Профиль   Отправить e-mail  

Как, не используя функции, сделать код элегантнее и лаконичнее?

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
а так?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version