因此,我试图编写一个带有多个参数的函数,例如a,b,c
,其中有些可能是长度X的列表,有些可能是单个值,但这是未知的。
然后,该函数应创建参数集(a[i],b[i],c[i])
,该参数集将被传递到多处理池。如果给定变量的单个值,则将对每个参数集重复该值。
现在,如果我想遍历每个变量,我可以为每个变量写一个if语句:
def foo(a, b, c):
if type(a) == int:
# make list of length needed
# Repeat for each variable
但是在实践中,这变得很混乱并且很快。我想知道是否有更简单的方法可以遍历输入变量。
我希望有类似的东西
def foo(a, b, c):
for variable in foo.__variables__:
if type(variable) == int:
# Make list of length needed
修改:其他信息
因此,正如Lauro Bravar所指出的,可以通过将参数作为列表传递来解决上述问题。不幸的是,我要解决的全部问题包括多个可选变量的存在,因此这是行不通的。因此,我正在寻找可以在这种情况下解决的代码:
def foo(a, b, c, d=None, e=None):
for variable in foo.__variables__:
if variable is not None:
if type(variable) == int:
# Make list of length needed
是否有一种无需使用**kwarg
的方法?理想情况下,我希望定义中所有可见的参数都具有可读性,因为可读性很重要(编码经验很少的学生会使用它)
答案 0 :(得分:4)
您可以通过*args
def foo(*args):
for item in args:
print(type(item))
foo([3,4,5],4,"foo")
出局:
<type 'list'>
<type 'int'>
<type 'str'>
关于您在问题中的其他信息:*args
占用您希望的任意数量的参数。遍历*args
的所有元素并检查其类型时,可以将结果存储在dictionary
或list
中以使其可访问:
def foo(*args):
mylist = list()
for item in args:
if type(item) == int:
mylist.append([item])
elif type(item) == list:
mylist.append(item)
return mylist
result = foo([3,4,5],4,"foo")
出局:
[[3, 4, 5], [4]]
在评论部分,您添加了两个条件:
help()
函数需要返回foo
的参数*args
,因为您要创建指定参数的参数集(*args
不支持开放式传递方案)因此,我的新方法处理内置函数locals(),该函数返回“当前本地符号表”。在函数中调用locals()
时,它将以字典的形式返回函数的所有参数及其值。确保在开始时就调用它,因为在运行时可能会在函数中创建新的本地变量,并且您可能最终陷入循环。
怎么样?
def foo(a, b, c, d=None, e=None):
foo_arguments = locals()
for variable in foo_arguments:
if foo_arguments[variable] is not None:
if type(foo_arguments[variable]) == int:
print("Detected argument named {} which is an integer of value {:d}"
.format(variable, foo_arguments[variable]))
result = foo([3,4,5], 4, "foo", d=10)
这使您可以传递a
,b
,c
和d
,e
的自变量。与
print(help(foo))
它返回
Detected argument named b which is an integer of value 4
Detected argument named d which is an integer of value 10
Help on function foo in module __main__:
foo(a, b, c, d=None, e=None)
答案 1 :(得分:1)
我可以想象的最简单的方法是做这样的事情:
def foo(*args):
for variable in args:
if type(variable) == int:
# Make list of length needed
您没有没有定义函数中的每个变量,在函数中使用起来更容易。由于上述设置,您必须从arg列表中检索所需的参数。如:
a = args[0]
b = args[1]
c = args[2]
我可以想象这在可读性上也较难,但这取决于您的用例。
答案 2 :(得分:0)
您可以将参数作为列表传递并遍历该列表。
def foo(bar):
for item in bar:
print(type(item))
答案 3 :(得分:0)
您可以通过* args和** kwargs传递变量和可选变量:
def foo(*args, **kwargs):
for x in (args + tuple(kwargs.values())):
print(type(x))
答案 4 :(得分:0)
这可以包含任意数量的参数,包括位置参数。
def print_keyword_args(*args, **kwargs):
print(kwargs)
print(args)
print_keyword_args(7, 8, [1,2,3], a = 5, b = 4)
输出:
{'a': 5, 'b': 4}
(7, 8, [1, 2, 3])
注意:可选参数包含在kwargs
中。