Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 25, 2019 17:51:39

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

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

Во первых:
Прошу прощенияFishHook
, был не прав, человек горячий, критику переношу плохо, но быстро отхожу и работаю над собой)
Во вторых:
Возможно было правильнее создать новую тему, но я решил продолжить в этой т.к. в своей работе старался учитывать ваши(всех, участвовавших в обсуждении выше) рекомендации, и не знаю стоит ли плодить темы, эта вроде подходит(правил форума не нашел,может плохо искал).
В общем, учебник тот же(М.Доусон) тема та же(списки,словари), задача написать программу в которой пользователь будет называть имя человека, а программа его отца.И предоставить пользователю возможность заменять, добавлять и удалять пары “сын-отец”. Доработать программу , что бы введя имя человека можно узнать кто его дед. При этом программа должна пользоваться тем же словарем с парами “сын-отец”. Добавил возможность дописывать людей с одним именем и разными родителями.
Хотелось бы знать ваше мнение, в правильном направлении ли я двигаюсь, ну и, собственно, подзатыльников, ибо что бы научить котенка писать в горшок , его надо тыкать носом в косяки
Собственно, вот сам код, уже вижу первый подзатыльник - отсутствие комментариев:

 lineage = {"София":["Илья"], "Илья":["Андрей"], "Андрей":["Степан"],
           "Людмила":["Олег"], "Олег":["Спиридон"], "Ирина":["Владимир"],
           "Тамара":["Николай"]}
change = ""
while change != "Закончить":
    print("""\nПрограмма родословная
        1 - Выяснить отца и деда человека
        2 - Добавить человека
        3 - Внести изменения
        4 - Удалить человека
        5 - Вывести список всех персон
        6 - Если вам надоест введите \"Закончить\"
        """)
    change = input("Выберите действие:")
    
    if change == "1":
        name = input("Введите имя человека:").title()        
        if name in lineage:
            all_father = lineage[name]
            name_list = []
            nam_father = len(all_father)
            print("Под именем ", name, "зарегистрированы следующие персоны:")
            print("ИМЯ\t\tОТЕЦ\t\tДЕД")
            for i in all_father:
                nam_father -= 1
                father = all_father[nam_father]    
                grandfather = lineage.get(father,["Неизвестен"])
                grandfather = grandfather[0]
                parents = (name, father, grandfather)
                name_list.append(parents)
                name_list.sort()                
            for parents in name_list:
                name, father, grandfather = parents
                print(name, "\t\t", father, "\t\t", grandfather)                                         
        else:
            print("Такой человек мне не известен, попробуйте его добавить!")
            
    elif change == "2":
        name = input("Введите имя человека:").title()
        father = input("Введите имя его отца:").title()      
        if name in lineage and father in lineage[name]:            
            print("Такой человек уже есть в списке")       
        else:
            if name in lineage:            
                lineage[name].append(father)
            else:
                lineage[name] = [father]                                    
            print(name , "добавлен в список")
                       
    elif change == "3":
        name = input("Введите имя человека:").title()
        father = input("Введите имя его отца:").title()
        if name in lineage and father in lineage[name]:
            new_father = input("Введите новое имя отца:").title()
            if new_father in lineage[name]:
                print("Такой человек уже есть в списке")
            else:
                lineage[name].remove(father)
                lineage[name].append(new_father)           
                print("Родословная", name,"изменена")            
        else:
            print("Такой человек мне не известен, попробуйте его добавить!")
            
    elif change == "4":
        name = input("Введите имя человека:").title()
        father = input("Введите имя его отца:").title()
        if name in lineage and father in lineage[name]:
            if len(lineage[name]) > 1:
                lineage[name].remove(father)
            else:                
                del lineage[name]            
            print(name, "удален из списка")
        else:
            print("Такой человек мне не известен, попробуйте его добавить!")
            
    elif change == "5":
        for i in lineage.items():        
            print(i)
    else:
        print("Такого пункта в меню нет!")
input("Нажмите Enter что бы выйти")

Офлайн

#2 Фев. 25, 2019 18:28:51

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

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

Babay82
Хотелось бы знать ваше мнение, в правильном направлении ли я двигаюсь
Кто-то из отцов-основателей, кажется Никлаус Вирт, сказал, что программирование - это алгоритмы + структуры данных.
Вы занимаетесь только алгоритмом, при этом удачно спроектированная структура может сделать половину дела. Эта задача - как раз тот случай, когда надо проектировать структуру, а алгоритм здесь тривиальный.
 person1 = {'name': 'John', 'father': None}
person2 = {'name': 'Matilda', 'father': person1}
person3 = {'name': 'Michael', 'father': person1}
people = [person1, person2, person3]
С ООП нам было бы еще проще, но можно и так.
Как получить деда? Ну тривиально же
 person = people[2]
print(person["father"]['father'])



Отредактировано FishHook (Фев. 25, 2019 18:30:35)

Офлайн

#3 Фев. 26, 2019 00:50:28

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

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

FishHook
Спасибо, да, вы правы, но тогда нарушалось бы условие задачи- “используя один и тот же словарь с парами ‘ сын - отец’.”. Но ,если честно, ваш вариант гораздо лучше . Сам не додумался. Книгу по структурам скачал а до чтения ещё не дошёл, буду исправлять. Учусь потихоньку.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version