Попытка обернуть мою голову вокруг переменных входных аргументов в функциях Python - PullRequest
0 голосов
/ 14 декабря 2018

Итак, сначала я скажу, что это проблема кода, над которой я работаю, параметры которой приведены ниже.

Итак, сначала напишите функцию с именем cover, которая принимает один параметр, набор тем.Пусть функция вернет список курсов из КУРСОВ, где поставленный набор и значение курса (также набор) перекрываются.Например, cover ({"Python"}) вернет ["Основы Python"].

Вот пример, который я извлекаю из содержимого вложенного набора для тем курса.

COURSES = {
"Python Basics": {"Python", "functions", "variables",
                  "booleans", "integers", "floats",
                  "arrays", "strings", "exceptions",
                  "conditions", "input", "loops"},
"Java Basics": {"Java", "strings", "variables",
                "input", "exceptions", "integers",
                "booleans", "loops"},
"PHP Basics": {"PHP", "variables", "conditions",
               "integers", "floats", "strings",
               "booleans", "HTML"},
"Ruby Basics": {"Ruby", "strings", "floats",
                "integers", "conditions",
                "functions", "input"}}

Теперь, поиск наборов диктов - довольно прямолинейное использование циклов for, но задача звучит так, как будто я хочу, чтобы я создал новый набор имен курсов, темы которых совпадали с входными данными аргументов и выходными данными.результат в виде списка.

def covers(topics):
    hold_set = set()
    for key in COURSES.keys():
        if topics in COURSES[key]:
            result = key
            hold_set.add(result)
        else:
            continue
    conversion = list(hold_set)
    return conversion

Теперь моей первой проблемой было принятие переменного количества аргументов, я не очень знаком с * args / ** kwargs, поэтому мои попытки использовать их здесь в основном только что привели к функции печатидавая мне пустые списки.Другой создавал дополнительный ненужный набор для сравнения с новым, созданным после поиска подмножеств в dict, он казался излишним ненужным, так как hold_set уже содержит имена и сравнивал их с предполагаемым .intersection () перед преобразованиемрезультаты в список просто объединяют те же результаты с большим количеством работы.

Но я отступаю, прямо сейчас я предполагаю, что основной проблемой здесь является неспособность функций принимать переменное число аргументов, касающихся параметров поиска в теме (потому что при отправке запроса появляется сообщение «Не полученоправильный вывод из covers. "), поэтому, если кто-нибудь сможет пролить свет на то, как я это сделаю, это очень ценится, так как через пару дней мой мозг начал кашлять, и я забрел читать о других областяхинформатика для распаковки.

1 Ответ

0 голосов
/ 14 декабря 2018

Если вы хотите работать с несколькими аргументами, вы можете попробовать это:

def covers(*args):

    mydict = dict()

    for arg in args:
        mylist = list()

        for k, v in COURSES.items():
            if arg in v:
                mylist.append(k)

        mydict[arg] = mylist

    return mydict

Используя дикты и списки, вы можете сделать это короче:

def covers(*args):
    return {arg: [k for k, v in COURSES.items() if arg in v] for arg in args}

Это приведет ксловарь с записью для каждой строки, которую вы предоставляете.Значение записи представляет собой список со всеми соответствующими курсами.Поэтому, если вы называете это так:

covers('variables', 'Python')

Вы получите следующий дикт:

{'variables': ['PHP Basics', 'Java Basics', 'Python Basics'], 'Python': ['Python Basics']}

Относительно ваших проблем с несколькими аргументами: * args перехватывает все позиционные аргументы в списке, которыеявно не объявлено в определении функции, и ** kwargs аналогично перехватывает все ключевые аргументы в dict.Таким образом, определяя только * args в качестве аргумента функции, все аргументы из вызова функции сохраняются в виде списка, который можно повторять как обычно.

...