python - 我什么时候应该使用 *args?

标签 python function arguments

在编写 Python 3.x 函数时,我经常偶然发现编写接受单个值和多个值的代码的问题。 采用这个简单的函数:

def capitalize(word):
    return word.capitalize()

此函数适用于将单个字符串作为输入,但如果提供多个​​字符串或字符串列表,则会失败。

我们可以将函数转换为接受字符串列表,这样,如果同时提供一个或多个值,它就会工作。然而,即使我传递了单个值,它也需要包含在一个列表中,并且返回值也将是一个列表,即使包含一个元素也是如此。

def capitalize(words):
    return [word.capitalize() for word in words]

我最近阅读了有关 *args 的内容,并认为我可以通过将其重写为如下所示来解决必须将包含在列表中的单个字符串作为参数传递给上述函数的尴尬:

def capitalize(*words):
    return [word.capitalize() for word in words]

在我看来,这是对 *args 的合法使用。然而,我发现了一个 pyCon 2015 演讲,其中演讲者声称“可变位置参数有利于消除噪音并使您的代码可读,而不是将单个调用 api 转换为 N api”

https://www.youtube.com/watch?v=WjJUPxKB164在 5 点 30 分。

这是对 *args 的合理使用吗?如果这不是应该使用 *args 的方式,是否有处理单参数和多参数函数的既定方法?

最佳答案

除了公认的答案(提出了一些好的观点)之外,您还必须考虑您的功能将如何使用。以 os.path.join 为例,此函数接受 *args 是有意义的,因为人们通常会处理一组路径元素,每个人都可能有自己的名字。例如:

dir_name = os.getcwd()
temp_folder = 'temp'
base_name = 'base_file.txt'
full_path = os.path.join(dir_name, temp_folder, base_name)

另一方面,当您处理自然会被分组到容器对象中的难以区分的元素时,使用 args 更有意义。考虑以下与 str.join 的用法。

sentence = 'this is an example sentence'
words = sentence.split()
dash_separated = '-'.join(words)

关于python - 我什么时候应该使用 *args?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45462105/

相关文章:

c - C语言中函数指针有什么好处?

python - 如何使用 Python 代码让 sonarcloud 在 Travis Ci 上运行

python - 将 pyaudio 安装到 docker 容器

python - 对矩阵本身求幂 N 次?

python - 为什么我不能在流程图中使用 Keras 模型(如 tf op)

r - 与列表中所有向量的成对比较

javascript - REACT JS - 如何在 map 内进行求和?

c# - 传递指向类属性的指针

python - 创建以动态数量的值作为参数的字典

python - 将函数作为命名参数传递以进行条件检查