【问题标题】:Accessing all function argmuments访问所有函数参数
【发布时间】:2016-09-26 08:38:42
【问题描述】:

我有一个带有 4 个参数的函数,并想检查这 4 个参数的某些内容。 目前我是这样做的:

def function1(arg1, arg2, arg3, arg4):
    arg1 = function2(arg1)
    arg2 = function2(arg2)
    arg3 = function2(arg3)
    arg4 = function2(arg4)

def function2(arg):
    arg = dosomething(arg)
    return arg

我认为这不是一个很好的方法,所以我的想法是做这样的事情:

def function1(arg1, arg2, arg3, arg4):
    for arg in listOfArguments:
        arg = function2(arg)


def function2(arg):
    arg = checkSomething(arg)
    return arg

有没有办法在 Python 中获取传递给 function1 的所有参数的列表?

感谢您的帮助和想法。

【问题讨论】:

  • 有:*args 用于任意参数列表

标签: python function python-3.x


【解决方案1】:

由于您有 set 个参数只需从它们中创建一个可迭代对象,例如,将参数名称包装在元组文字中:

for arg in (arg1, arg2, arg3, arg4):
    # do stuff

如果你不介意你的函数能够被更多的参数调用,只需使用*args syntax

def function1(*args):
    for arg in args:
        arg = function2(arg)

然后将调用函数的参数公开为可以迭代的元组。

如果您需要存储每次调用的结果,最好将for-loop 更改为list comprehension,创建一个返回值列表。例如,给定一个函数,它接受一个值并简单地将2 添加到它:

def add2(arg):
    return arg + 2

def function1(arg1, arg2, arg3, arg4):
    a1, a2, a3, a4 = [add2(arg) for arg in (arg1, arg2, arg3, arg4)]
    print(a1, a2, a3, a4)

我们创建一个列表推导式,它将每个arg 提供给add2,然后将其作为一个条目存储在列表中,然后我们解包到a1,..,aN。这些值现在包含函数调用的结果:

function1(1, 2, 3, 4)
3, 4, 5, 6

在前面的例子中(arg1, arg2, arg3, arg4)总是可以替换成args,如果你在定义函数时使用*args语法,结果会相似。


作为附录,如果您更喜欢函数式编程,您总是可以map 函数的参数并保存几个字符 :-)。这次我将添加*argsfunction1 定义:

def function1(*args):
    a1, a2, a3, a4 = map(add2, args)
    print(a1, a2, a3, a4)

同样的结果。

【讨论】:

  • 感谢您的快速回复。现在有一个问题,即 arg = function2(arg) 正在为 arg 创建一个新值,但是在 for 循环完成后这个值会丢失。如何将 arg 的新值传递回我的 args,以便在 for 循环完成后使用它们?
  • 我已经编辑了我的答案,如果您需要存储返回的值,您可以使用列表理解而不是 for 循环。然后将结果列表解压缩为您可以使用的变量,即a1, a2, a3, a4 = r
【解决方案2】:

是的,使用*args

In [1]: def func(*args):
   ...:     print(len(args), args)
   ...:     

In [2]: func(1, 2, 3, 4)
4 (1, 2, 3, 4)

更多信息可以找到here.

【讨论】:

  • 打印是py3中的一个函数
  • @Sevanteri:已修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2019-08-10
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多