Изменение строковой функции из двух слов, чтобы принимать ** kwargs в Python?

#python #string #function #split #boolean

#python #строка #функция #разделение #логическое

Вопрос:

Я написал базовую функцию, которая принимает любую строку из двух слов, переданную в качестве аргумента, проверяет совпадение индексов обоих слов и возвращает True , в противном случае False .

 def alliteration_check(str):

    sp1, sp2 = str.split()

    if sp1[0].upper() == sp2[0].upper():
        return True
    else:
        return False
 

Я хотел знать, можно ли изменить параметр str здесь, чтобы принимать ** kwargs? Я только недавно узнал об этой концепции, поэтому пытаюсь понять, как я могу применить ее на практике.

По сути, мой предполагаемый результат функции будет заключаться в том, что пользователь может поместить столько слов в качестве аргумента, и он возвращает True только в том случае, если ВСЕ первые индексы каждой строки совпадают. Я просто не уверен, как написать функцию или возможно ли это вообще?

Заранее спасибо!

Ответ №1:

Не называйте переменную (включая параметр) str , потому что это затенит встроенную str функцию / тип! Вы можете использовать str в качестве аннотации типа, но она должна идти после имени параметра, например foo: str .

Идея **kwargs заключается в том, чтобы ваша функция могла принимать произвольный набор аргументов ключевого слова (не аргументы позиции). Внутри реализации функции аргументы доступны как dict .

 def alliteration_check(**kwargs: str) -> bool:
    for s in kwargs.values():
        w1, w2 = s.split()
        if w1[0].upper() != w2[0].upper():
            return False
    return True
 

Вам нужно вызвать эту функцию с аргументами ключевого слова, например:

 alliteration_check(thing1="zig zag", other_thing="awkward alligator")
 

Если вы хотите, чтобы пользователь мог вызывать функцию с произвольным количеством позиционных аргументов, а не аргументов ключевого слова, используйте *args :

 def alliteration_check(*args: str) -> bool:
    for s in args:
        w1, w2 = s.split()
        if w1[0].upper() != w2[0].upper():
            return False
    return True
 
 alliteration_check("zig zag", "awkward alligator")
 

Вы также можете объединить их оба (т. Е. Иметь функцию, которая принимает оба *args и **kwargs ), чтобы иметь возможность обрабатывать аргументы в любом синтаксисе:

 def alliteration_check(*args: str, **kwargs: str) -> bool:
    for s in (*args, *kwargs.values()):
        w1, w2 = s.split()
        if w1[0].upper() != w2[0].upper():
            return False
    return True
 

Комментарии:

1. Спасибо за этот очень полезный ответ! Я еще не узнал о -> bool, поэтому я попытаюсь собрать код построчно, чтобы понять, что он делает. Спасибо за исправление о том, что вы не используете str в качестве var или param, я отмечу это для будущей ссылки!

2. -> bool Это аннотация типа, означающая «эта функция возвращает a bool «. Это полезный способ указать людям, читающим код (а также такие инструменты, как mypy ), как вы должны использовать функцию и что она должна делать.

Ответ №2:

Возможно, было бы более уместно использовать *args — список аргументов переменной длины, не содержащий ключевых слов, в вашем случае, потому что вы хотите проверить переменное количество слов. Затем вы можете повторить это как список.

В вашем случае вы просто хотите проверить, что первая буква каждого слова одинакова без учета регистра. Я бы построил набор и проверил, содержит ли он только один элемент:

 def alliteration_check(*args):
    return len(set(s[0].upper() for s in args)) == 1
 

Вы бы использовали это так:

 print(alliteration_check("hello", "Hello", "hi"))
 

Вывод:

 True
 

Ответ №3:

 def alliteration_check(*args):
    initialWord = args[0]
    allEqual=true
    for word in args:
       if (word != initialWord):
           allEqual=false
           break
    return allEqual

alliteration_check("4", "5")
alliteration_check("10", "9")
alliteration_check('2', "3", "4")
 

Ответ №4:

Вот решение, которое я получил. Для вашей конкретной ситуации вы должны использовать * args, а не ** kwargs

 def alliteration_check(*args):
    allit = True
    for arg in args:
        if arg[0].upper() != args[(args.index(arg))-1][0].upper():
            allit = False

    return allit
 

в основном это проверяет каждый аргумент, введенный в функцию, на предыдущий и проверяет, что первая буква во всех них одинакова. Если в какой-либо момент оно не равно, оно изменяет переменную allit на false и выходит из цикла.