在函数中制作输入变量列表

Making a list of input variables within a funciton

我正在使用 locals 函数创建一个可迭代对象,其中填充了调用此函数时提供的 a、b、c 的值。当我遍历 locals returns 的字典时,我遍历了变量名,而不是那里的值。但是 l.values 不是可迭代的,我猜它指向一个函数,而不是我期望的列表。

    Traceback (most recent call last):
  file.py on line ?, in getUserOutputs
    userOutput = _runaedlz(testInputs[i])
  file.py on line ?, in _runaedlz
    return extraNumber(*_fArgs_dfasruobxant)
  file.py on line 5, in extraNumber
    for i in l:
TypeError: 'builtin_function_or_method' object is not iterable

是否有更好的方法来列出这些值?我可以用更蛮力的方式来做,但我正在尝试学习所有这些内置函数以及它们的好处。

或者有没有办法遍历我丢失的字典值?

完成同一件事的两种不同方法,是吗?

def extraNumber(a, b, c):
    l=locals()
    l=l.values
    print(l)
    for i in l:
        if(l.count(i)==1):
            return i
>>> def extraNumber(a,b,c):
...     for i in locals().values():
...         yield i
... 
>>> 
>>> for n in extraNumber(5,10,7):
...     n
... 
10
5
7

我使用了 yield 语句,因为 extraNumber 函数将为每个参数值生成一个值。

作为替代方案,如果您想要一次获得整个列表,您可以使用类似这样的方法。

>>> def extraNumber(a,b,c):
...     parameterValues=list(locals().values())
...     return parameterValues
...     
>>> extraNumber(5,10,7)
[10, 5, 7]

locals() 的一个潜在问题是它 returns 是一个字典,并且没有定义字典中值的顺序,因此列出值可能会相对于它们被传递给函数。如果你真的想做这样的事情,你可以通过使用函数的 __code__ 对象的 __co_varnames 属性来获得定义的顺序。类似于:

def extraNumber(a, b, c):
    loc = locals() #should be the first line, so that only parameters have values
    vals = list(loc.values()) #order might have been changed
    lvals = extraNumber.__code__.co_varnames
    orderedVals = [loc[x] for x in lvals if x in loc]
    return vals, orderedVals #both returned for comparison

当我 运行 我得到了:

>>> extraNumber(1,2,3)
([3, 2, 1], [1, 2, 3])

不同的运行(尤其是在新的 Python shell 中)在第一个返回列表中会有不同的顺序,但第二个将始终是 [1,2,3]