在函数中列出输入变量

时间:2016-11-13 15:32:22

标签: python list dictionary local iterable

我正在使用locals函数来创建一个可迭代对象,该对象填充了我调用此函数时提供的a,b,c的值。当我遍历locals返回的dictionairy时,我遍历变量名称,而不是值。但是l.values不可迭代,我猜它指的是一个函数,而不是像我期望的那样的列表。

cd

有没有更好的方法来列出这些值?我可以用更蛮力的方式做到这一点,但我正在努力学习所有这些内置功能以及它们有什么用处。

或者有没有办法迭代我缺少的dictionairies值?

两种不同的方法来完成同样的事情,是吗?

    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

2 个答案:

答案 0 :(得分:1)

locals()的一个潜在问题是它返回一个字典,并且字典中的值的顺序没有定义,因此列出值可能会相对于它们传递的顺序进行置换到功能。如果您确实想要执行此类操作,则可以使用函数__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]

答案 1 :(得分:0)

>>> 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]