Форум сайта python.su
1
Решил в качестве эксперимента, попробовать выложить код на суд общественный.
Смысл эксперимента - “разбор полётов” - узнать мнение специалистов, узнать какие точки зрения существуют ещё, и соответственно попутное повышение скила, не только мне, но возможно и тем кто будет просто читать.
Если эксперимент пройдёт продуктивно, буду выкладывать ещё.
Практическое задание из книги. Код на инглише:
# Генератор Персонажей # # Смысл задачи, составить программу в которой пользователь, распределяет # очки параметров по характеристикам героя. # # Версия Питона - 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)
Офлайн
857
Mixeykaif 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В общем, то, что ты написал, - это код начинающего. В нём множество обычных граблей.
узнать какие точки зрения существуют ещё
MixeykaКниги бывают разные. Бывает так, что какой-нибудь программист не может написать программу, поэтому берётся писать книгу. Надо фильтровать.
Практическое задание из книги.
Отредактировано py.user.next (Окт. 2, 2014 01:30:24)
Офлайн
1
py.user.next
- Он монолитный, а должен быть разделённым на части.Это форматирование текста на сайте, убирает лишнее.
- В нём много уровней вложенности, а должно быть <= 3.Разве в процедурном это возможно?
- В нём одни части связаны с другими, а должны быть независимыми.Можно подробнее об этом? Непонятно, что ты имел ввиду.
- В нём ненужные комментарии, а должны быть только нужные.Признаюсь, удивлён. Всегда говорят про недостаток комментариев. Про их избыточность, первый раз слышу

- Весь этот код не может быть использован как часть другой программы.Почему?
if selected_attribute in ‘01234’:Отдельное спасибо.
print(STATS_MENU.format(attributes["сила"], attributes["ловкость"], attributes["мудрость"], attributes["здоровье"]
Офлайн
2
if choise == "0": print("Программа завершена") # Это выход из программы.

Отредактировано bs0d (Окт. 2, 2014 11:58:21)
Офлайн
0
Практическое задание из книги. Код на инглише:
Офлайн
1
Arthur
“Программирование на Питон”, называется. Понравилась тем, что практики много.
Офлайн
857
MixeykaЯ не про строки (их ты можешь оставить, вставив пробел в начале).
Это форматирование текста на сайте, убирает лишнее.
MixeykaДа, для этого из одного глубокого блока делай несколько. А чтобы понять, как это сделать, рисуй блок-схему программы.
Разве в процедурном это возможно?
MixeykaМожно и немонолитный код из частей сделать таким, что одни части будут влиять на другие. Поэтому нужно не только разделять код, но и следить, чтобы функции друг о друге не знали.py.user.nextМожно подробнее об этом? Непонятно, что ты имел ввиду.
- В нём одни части связаны с другими, а должны быть независимыми.
MixeykaСначала пишешь код. Если он непонятный, переписываешь его в понятный. Если он понятный, комментарии не нужны.
Признаюсь, удивлён. Всегда говорят про недостаток комментариев. Про их избыточность, первый раз слышу
MixeykaПотому что его надо переделывать для этого. А когда пишешь другую программу, то всё время уходит на неё.py.user.nextПочему?
- Весь этот код не может быть использован как часть другой программы.
MixeykaСделай короткие переменные, присвой им эти значения, короткие переменные передай в .format() .
Ещё интересует вот эта строка:
Отредактировано py.user.next (Окт. 2, 2014 23:38:24)
Офлайн
0
Mixeyka
это из двух частей Лутца, которые? Завидую вашей терпеливости и выдержке.
У меня была “Изучаем” продал. Купил на выходных новейшую “Питон.Карманный справочник” 5изд, оказалось ещё в мае вышла, но версии более чем актуальные и даже самые свежите по прошествию 4 месяцев: 2.7, , 3.4 .
Офлайн
1
py.user.next
Я понимаю функции, но не дошёл ещё до них. Вообщем не буду горячиться, завтра отвечу, когда освобожусь.
Arthur
Нет, это книга Доусона, она лучше подходит начинающим, на мой взгляд, из за того, что с самого начала, нужно писать код.
Отредактировано Mixeyka (Окт. 3, 2014 01:44:50)
Офлайн
1
py.user.next
Я не про строки (их ты можешь оставить, вставив пробел в начале).
Монолитный - это значит, что ты не можешь убрать из него половину так, чтобы другая половина продолжала функционировать. Потому что у него нет половин.
Проблема монолитных кодов в том, что их сложно менять. Одно цепляет другое.
Понятный код - это код, который можно понять, даже если не знаком с ним. (Как правило, человек, который пишет код, становится с ним незнакомым после нескольких лет. А если профессионал, то счёт идёт на месяцы или даже недели.)
Поэтому комментарии пишутся к тому, что нельзя понятно написать.
Сделай короткие переменные, присвой им эти значения, короткие переменные передай в .format() .Если надо отдельную строку заводить, то нет смысла на этот ход.
Офлайн