Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 1, 2014 21:28:36

Mixeyka
Зарегистрирован: 2014-09-19
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Зацените код.

Решил в качестве эксперимента, попробовать выложить код на суд общественный.
Смысл эксперимента - “разбор полётов” - узнать мнение специалистов, узнать какие точки зрения существуют ещё, и соответственно попутное повышение скила, не только мне, но возможно и тем кто будет просто читать.
Если эксперимент пройдёт продуктивно, буду выкладывать ещё.

Практическое задание из книги. Код на инглише:

# Генератор Персонажей
# 
# Смысл задачи, составить программу в которой пользователь, распределяет
# очки параметров по характеристикам героя.
#
# Версия Питона - 3.4.1
# Кодировка UTF-8
# Начал с того, что объявил некоторые переменные.
# Константа главного меню:
MENU = ("""
Главное меню:
   0. Выход.
   1. Добавить очки.
   2. Убрать очки.
У вас есть {} очка/-ов развития.
   """)
# Параметры героя в виде словаря:
attribute_points = 30
attributes = {"сила": 0,
             "ловкость": 0,
             "мудрость": 0,
             "здоровье": 0,
             }
# Константа - "меню параметров":
STATS_MENU = ("""
Ваши параметры:
    0. Выйти в предыдущее меню.
    1. Сила = {0}
    2. Ловкость = {1}
    3. Мудрость = {2}
    4. Здоровье = {3}
У вас {4} очка/-ов развития.
    """)
# Теперь сама программа.
# Предлагаем пользователю поработать с главным меню.
choise = ""
while choise != "0":
    print(MENU.format(attribute_points))
    # Просим пользователя выбрать нужный пункт.
    choise = input("Укажите нужный вам пункт меню: ")
        
    # Обрабатываем ввод пользователя.
    if choise == "0":
        print("Программа завершена") # Это выход из программы.
    elif choise == "1" or choise == "2":        
        # Предлагаем пользователю поработать с меню "выбора параметров".
        selected_attribute = ""            
        while selected_attribute != "0":
            # Это вывод на экран самого меню:
            print(STATS_MENU.format(attributes["сила"], attributes["ловкость"], attributes["мудрость"], attributes["здоровье"], attribute_points))
            selected_attribute = input("Введите номер параметра, для изменения или \"0\", для выхода: ")
            
            if selected_attribute == "1" or selected_attribute == "2" or selected_attribute == "3"\
                or selected_attribute == "4" or selected_attribute == "0":
                if selected_attribute == "0": # Возврат в предыдущее меню.
                    continue            
                # Принимаем значение выбранного пункта меню.    
                elif selected_attribute == "1":
                    alterable_attribute = "сила"
                elif selected_attribute == "2":
                    alterable_attribute = "ловкость"
                elif selected_attribute == "3":
                    alterable_attribute = "мудрость"
                elif selected_attribute == "4":
                    alterable_attribute = "здоровье"
                else:
                    print("Пункта меню", str(selected_attribute), "не существует")
                    input("Нажмите Enter, для продолжения...")
                # Блок Увеличения Параметра.
                if choise == "1":                
                    change = int(input("Укажите на какое значение нужно увеличить {}: ".format(alterable_attribute)))
            
                    # Проверка на правильный ввод:                   
                    while change > attribute_points or change < 0:
                        print("Ваш запас очков равен - ", attribute_points)
                        print("Вы решили увеличить на {}!".format(change))
                        change = int(input("Укажите верное значение"))
                    # Теперь можно, изменить параметр.                               
                    attribute_points = attribute_points - change
                    attributes[alterable_attribute] += change
                # Блок Уменьшения Параметра.
                elif choise == "2":                
                    change = int(input("Укажите на какое значение нужно уменьшить {}: ".format(alterable_attribute)))
                    # Проверка на правильный ввод:
                    while change > attributes[alterable_attribute] or change < 0:
                        print("Параметр, который вы хотите уменьшить, равен {} очку/-ам ".format(alterable_attribute) )
                        print("Вы решили увеличить на {}!".format(change))
                        change = int(input("Укажите верное значение"))
                    # Теперь можно, уменьшить параметр.
                    attribute_points = attribute_points + change
                    attributes[alterable_attribute] -= change
            else:
                print("Пункта меню", str(selected_attribute), "не существует")
                input("Нажмите Enter, для продолжения...") 
            
    else:
        print("Пункта меню", str(choise), "не существует")
        input("Нажмите Enter, для продолжения...")    
              

Практическое задание из книги. Код частично на русском:

# Генератор Персонажей
# 
# Смысл задачи, составить программу в которой пользователь, распределяет
# очки параметров по характеристикам героя.
#
# Версия Питона - 3.4.1
# Кодировка UTF-8
# Начал с того, что объявил некоторые переменные.
# Константа главного меню:
МЕНЮ = ("""
Главное меню:
   0. Выход.
   1. Добавить очки.
   2. Убрать очки.
У вас есть {} очка/-ов развития.
   """)
# Параметры героя в виде словаря:
запас_очков = 30
параметры = {"сила": 0,
             "ловкость": 0,
             "мудрость": 0,
             "здоровье": 0,
             }
# Константа - "меню параметров":
МЕНЮ_ПАРАМЕТРОВ = ("""
Ваши параметры:
    0. Выйти в предыдущее меню.
    1. Сила = {0}
    2. Ловкость = {1}
    3. Мудрость = {2}
    4. Здоровье = {3}
У вас {4} очка/-ов развития.
    """)
# Теперь сама программа.
# Предлагаем пользователю поработать с главным меню.
пункт_меню = ""
while пункт_меню != "0":
    print(МЕНЮ.format(запас_очков))
    # Просим пользователя выбрать нужный пункт.
    пункт_меню = input("Укажите нужный вам пункт меню: ")
        
    # Обрабатываем ввод пользователя.
    if пункт_меню == "0":
        print("Программа завершена") # Это выход из программы.
    elif пункт_меню == "1" or пункт_меню == "2":        
        # Предлагаем пользователю поработать с меню "выбора параметров".
        номер_параметра = ""            
        while номер_параметра != "0":
            # Это вывод на экран самого меню:
            print(МЕНЮ_ПАРАМЕТРОВ.format(параметры["сила"], параметры["ловкость"], параметры["мудрость"], параметры["здоровье"], запас_очков))
            номер_параметра = input("Введите номер параметра, для изменения или \"0\", для выхода: ")
            
            if номер_параметра == "1" or номер_параметра == "2" or номер_параметра == "3"\
                or номер_параметра == "4" or номер_параметра == "0":
                if номер_параметра == "0": # Возврат в предыдущее меню.
                    continue            
                # Принимаем значение выбранного пункта меню.    
                elif номер_параметра == "1":
                    изменяемый_параметр = "сила"
                elif номер_параметра == "2":
                    изменяемый_параметр = "ловкость"
                elif номер_параметра == "3":
                    изменяемый_параметр = "мудрость"
                elif номер_параметра == "4":
                    изменяемый_параметр = "здоровье"
                else:
                    print("Пункта меню", str(номер_параметра), "не существует")
                    input("Нажмите Enter, для продолжения...")
                # Блок Увеличения Параметра.
                if пункт_меню == "1":                
                    изменение = int(input("Укажите на какое значение нужно увеличить {}: ".format(изменяемый_параметр)))
            
                    # Проверка на правильный ввод:                   
                    while изменение > запас_очков or изменение < 0:
                        print("Ваш запас очков равен - ", запас_очков)
                        print("Вы решили увеличить на {}!".format(изменение))
                        изменение = int(input("Укажите верное значение"))
                    # Теперь можно, изменить параметр.                               
                    запас_очков = запас_очков - изменение
                    параметры[изменяемый_параметр] += изменение
                # Блок Уменьшения Параметра.
                elif пункт_меню == "2":                
                    изменение = int(input("Укажите на какое значение нужно уменьшить {}: ".format(изменяемый_параметр)))
                    # Проверка на правильный ввод:
                    while изменение > параметры[изменяемый_параметр] or изменение < 0:
                        print("Параметр, который вы хотите уменьшить, равен {} очку/-ам ".format(изменяемый_параметр) )
                        print("Вы решили увеличить на {}!".format(изменение))
                        изменение = int(input("Укажите верное значение"))
                    # Теперь можно, уменьшить параметр.
                    запас_очков = запас_очков + изменение
                    параметры[изменяемый_параметр] -= изменение
            else:
                print("Пункта меню", str(номер_параметра), "не существует")
                input("Нажмите Enter, для продолжения...") 
            
    else:
        print("Пункта меню", str(пункт_меню), "не существует")
        input("Нажмите Enter, для продолжения...")    
              

Отредактировано Mixeyka (Окт. 1, 2014 21:31:08)

Офлайн

#2 Окт. 2, 2014 01:11:39

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

Зацените код.

Mixeyka
            if selected_attribute == "1" or selected_attribute == "2" or selected_attribute == "3"\
                or selected_attribute == "4" or selected_attribute == "0":

if selected_attribute in set('01234'):

if selected_attribute in '01234':


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

- Он монолитный, а должен быть разделённым на части.
- В нём много уровней вложенности, а должно быть <= 3.
- В нём одни части связаны с другими, а должны быть независимыми.
- В нём ненужные комментарии, а должны быть только нужные.
- Весь этот код не может быть использован как часть другой программы.

Mixeyka
Практическое задание из книги.
Книги бывают разные. Бывает так, что какой-нибудь программист не может написать программу, поэтому берётся писать книгу. Надо фильтровать.



Отредактировано py.user.next (Окт. 2, 2014 01:30:24)

Офлайн

#3 Окт. 2, 2014 11:47:19

Mixeyka
Зарегистрирован: 2014-09-19
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Зацените код.

py.user.next

- Он монолитный, а должен быть разделённым на части.
Это форматирование текста на сайте, убирает лишнее.

- В нём много уровней вложенности, а должно быть <= 3.
Разве в процедурном это возможно?

- В нём одни части связаны с другими, а должны быть независимыми.
Можно подробнее об этом? Непонятно, что ты имел ввиду.

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

- Весь этот код не может быть использован как часть другой программы.
Почему?

if selected_attribute in ‘01234’:
Отдельное спасибо.

Ещё интересует вот эта строка:
print(STATS_MENU.format(attributes["сила"], attributes["ловкость"], attributes["мудрость"], attributes["здоровье"]
Не нашел способа лучше, но получается очень длинно.

Офлайн

#4 Окт. 2, 2014 11:55:38

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Зацените код.

    
if choise == "0":
        print("Программа завершена") # Это выход из программы.
Пример избыточного коммента. Коммент можно считать избыточным, когда после его прочтения хочется сказать “Спасибо Кэп”

Попробуй, для начала, разделить код на отдельные функции. Какие-то будут возвращать данные для другой функции, какие-то будут просто выполняться (В нём одни части связаны с другими, а должны быть независимыми)

Отредактировано bs0d (Окт. 2, 2014 11:58:21)

Офлайн

#5 Окт. 2, 2014 19:34:37

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

Зацените код.

Практическое задание из книги. Код на инглише:

напишите что за книгу читаете

Офлайн

#6 Окт. 2, 2014 22:06:40

Mixeyka
Зарегистрирован: 2014-09-19
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Зацените код.

Arthur
“Программирование на Питон”, называется. Понравилась тем, что практики много.

Офлайн

#7 Окт. 2, 2014 23:36:15

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

Зацените код.

Mixeyka
Это форматирование текста на сайте, убирает лишнее.
Я не про строки (их ты можешь оставить, вставив пробел в начале).
Монолитный - это значит, что ты не можешь убрать из него половину так, чтобы другая половина продолжала функционировать. Потому что у него нет половин.

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

Mixeyka
Разве в процедурном это возможно?
Да, для этого из одного глубокого блока делай несколько. А чтобы понять, как это сделать, рисуй блок-схему программы.

Mixeyka
py.user.next
- В нём одни части связаны с другими, а должны быть независимыми.
Можно подробнее об этом? Непонятно, что ты имел ввиду.
Можно и немонолитный код из частей сделать таким, что одни части будут влиять на другие. Поэтому нужно не только разделять код, но и следить, чтобы функции друг о друге не знали.

Если функция вызывает функцию, то она должна знать только то, как вызвать.

Mixeyka
Признаюсь, удивлён. Всегда говорят про недостаток комментариев. Про их избыточность, первый раз слышу
Сначала пишешь код. Если он непонятный, переписываешь его в понятный. Если он понятный, комментарии не нужны.

Понятный код - это код, который можно понять, даже если не знаком с ним. (Как правило, человек, который пишет код, становится с ним незнакомым после нескольких лет. А если профессионал, то счёт идёт на месяцы или даже недели.)

Поэтому комментарии пишутся к тому, что нельзя понятно написать.

Mixeyka
py.user.next
- Весь этот код не может быть использован как часть другой программы.
Почему?
Потому что его надо переделывать для этого. А когда пишешь другую программу, то всё время уходит на неё.

Напиши функцию, которая выполняет три раза твой код, не переделывая его.


Mixeyka
Ещё интересует вот эта строка:
Сделай короткие переменные, присвой им эти значения, короткие переменные передай в .format() .



Отредактировано py.user.next (Окт. 2, 2014 23:38:24)

Офлайн

#8 Окт. 3, 2014 00:51:05

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

Зацените код.

Mixeyka
это из двух частей Лутца, которые? Завидую вашей терпеливости и выдержке.
У меня была “Изучаем” продал. Купил на выходных новейшую “Питон.Карманный справочник” 5изд, оказалось ещё в мае вышла, но версии более чем актуальные и даже самые свежите по прошествию 4 месяцев: 2.7, , 3.4 .

Офлайн

#9 Окт. 3, 2014 01:41:37

Mixeyka
Зарегистрирован: 2014-09-19
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Зацените код.

py.user.next
Я понимаю функции, но не дошёл ещё до них. Вообщем не буду горячиться, завтра отвечу, когда освобожусь.

Arthur
Нет, это книга Доусона, она лучше подходит начинающим, на мой взгляд, из за того, что с самого начала, нужно писать код.

Отредактировано Mixeyka (Окт. 3, 2014 01:44:50)

Офлайн

#10 Окт. 3, 2014 19:24:40

Mixeyka
Зарегистрирован: 2014-09-19
Сообщения: 32
Репутация: +  1  -
Профиль   Отправить e-mail  

Зацените код.

py.user.next

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

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

Если код большой, то я с этим согласен, а если на одну-две страницы, то ни к чему это. Если переделать тот который в шапке темы, то получиться во первых много повторяемых строк, а во вторых он вырастет в размерах в полтора - два раза…. Нафиг оно надо?

Понятный код - это код, который можно понять, даже если не знаком с ним. (Как правило, человек, который пишет код, становится с ним незнакомым после нескольких лет. А если профессионал, то счёт идёт на месяцы или даже недели.)
Поэтому комментарии пишутся к тому, что нельзя понятно написать.

Тут всё очень субъективно… Нельзя найти двух разных людей, которым будут непонятны одни и те же вещи, в то время как автору всё кажется понятным и само собой разумеющимся.

Сделай короткие переменные, присвой им эти значения, короткие переменные передай в .format() .
Если надо отдельную строку заводить, то нет смысла на этот ход.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version