修改两个单词的字符串函数以在 Python 中获取 **kwargs?

Modifying A Two-Word String Function To Take **kwargs in Python?

我写了一个基本函数,它接受任何两个单词的字符串作为参数传递,检查两个单词的索引是否匹配,并且 returns 为真,否则为假。

def alliteration_check(str):

    sp1, sp2 = str.split()

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

我想知道是否可以在这里更改 str 的参数以接收 **kwargs?我最近才了解这个概念,所以想了解如何将其付诸实践。

本质上,我的预期函数输出是用户可以放置与参数一样多的单词,并且只有 returns 如果每个字符串的所有第一个索引都匹配,它才为真。我只是不确定如何编写该函数,或者它是否可能?

提前致谢!

不要命名变量(包括参数)str,因为它会隐藏内置 str function/type!您可以使用 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")

如果您希望用户能够使用任意数量的 positional 参数而不是 keyword 参数调用函数,请使用*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
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")

这是我得到的解决方案。对于您的具体情况,您应该使用 *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 并跳出循环。

在您的情况下,使用 *args - 一个非关键措辞的可变长度参数列表可能更合适,因为您想要检查可变数量的单词。然后你可以像列表一样迭代它。

在你的情况下,你只想检查每个单词的第一个字母是否相同,不区分大小写。我会构建一个集合并检查它只包含一个元素:

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

你会这样使用它:

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

输出:

True