Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否有一种方法可以循环给定给函数的每个变量并确定其类型?_Python_Python 3.x - Fatal编程技术网

Python 是否有一种方法可以循环给定给函数的每个变量并确定其类型?

Python 是否有一种方法可以循环给定给函数的每个变量并确定其类型?,python,python-3.x,Python,Python 3.x,所以我试着写一个函数,它接受多个参数,比如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 f

所以我试着写一个函数,它接受多个参数,比如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就可以做到这一点的方法?理想情况下,我希望定义中的所有参数都可见,因为可读性很重要。这将由没有编码经验的学生使用。

您可以将参数作为列表传递,并在该列表上迭代

def foo(bar):
    for item in bar:
         print(type(item))

您可以将参数作为列表传递,并在该列表上迭代

def foo(bar):
    for item in bar:
         print(type(item))

我能想象的最简单的方法是这样做:

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]

我可以想象,这在可读性方面也更难,但这取决于您的用例。

我可以想象的最简单的方法是这样做:

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]

我可以想象,它的可读性也很难,但这取决于您的用例。

您可以通过*args传递变量

输出:

输出:

第二次编辑我的答案: 在“注释”部分中,您添加了两个条件:

help函数需要返回foo的参数 无法使用*args,因为要创建开放传递方案*args不支持的指定参数的参数集 因此,我的新方法处理内置函数,它返回当前的本地符号表。当在函数中调用局部变量时,它将作为字典返回函数的所有参数及其值。请确保在一开始就调用它,因为在运行时,可能会在函数中创建新的局部变量,最终可能会导致循环

这个怎么样

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)

您可以通过*args传递变量

输出:

输出:

第二次编辑我的答案: 在“注释”部分中,您添加了两个条件:

help函数需要返回foo的参数 无法使用*args,因为要创建开放传递方案*args不支持的指定参数的参数集 因此,我的新方法处理内置函数,它返回当前的本地符号表。当在函数中调用局部变量时,它将作为字典返回函数的所有参数及其值。请确保在一开始就调用它,因为在运行时,可能会在函数中创建新的局部变量,最终可能会导致循环

这个怎么样

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)

您可以通过*args和**kwargs传递变量和可选变量:

def foo(*args, **kwargs):
    for x in (args + tuple(kwargs.values())):
        print(type(x))

您可以通过*args和**kwargs传递变量和可选变量:

def foo(*args, **kwargs):
    for x in (args + tuple(kwargs.values())):
        print(type(x))

这可以接受任意数量的参数,包括位置参数

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中。

这可以包含任意数量的参数,包括位置参数

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中被捕获。

我已经考虑过这一点。问题是,在完整的问题中,我有一些可选参数,如果指定了这些参数,那么应该以完全相同的方式处理它们。我会用这些信息更新问题。我已经考虑过了。问题是,在完整的问题中,我有一些可选参数,如果指定了这些参数,那么应该以完全相同的方式处理它们。我会用这些信息更新这个问题。谢谢你的回答。我已经在问题的上下文中详细阐述了完整的问题,因为涉及到可选参数,我希望避免使用**kwarg,因为理想情况下,我希望每个变量都易于访问。请查找我对答案的更新。性病
I’我肯定你找的不是args?使用**kwarg,您可以将变量的名称与值一起传递。如果需要的话,将其恢复为实际变量是一个单行程序。默认值也没有问题,因为有一组参数,我需要在调用帮助时显示这些参数,并且未命名的变量不会显示。如果没有办法同时获得这两种效果,那么我只能显式地循环它们。谢谢你的回答。我已经在问题的上下文中详细阐述了完整的问题,因为涉及到可选参数,我希望避免使用**kwarg,因为理想情况下,我希望每个变量都易于访问。请查找我对答案的更新。仍然确定*args不是你想要的?使用**kwarg,您可以将变量的名称与值一起传递。如果需要的话,将其恢复为实际变量是一个单行程序。默认值也没有问题,因为有一组参数,我需要在调用帮助时显示这些参数,并且未命名的变量不会显示。如果没有办法同时获得这两种效果,那么我只能显式地循环它们。