【问题标题】:Making a list of input variables within a funciton在函数中制作输入变量列表
【发布时间】:2017-03-27 07:27:16
【问题描述】:

我正在使用 locals 函数来创建一个可迭代对象,其中填充了我调用此函数时提供的 a、b、c 的值。当我遍历 locals 返回的字典时,我遍历变量名,而不是值。但是 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

【问题讨论】:

  • 尝试使用 l.values() 代替。好像 values() 是一个函数,所以调用它。
  • 哇,有时候真是太神奇了。 l.values 和 l.values() 之间的区别起到了作用。
  • 酷!有时,如果您不确定挂在对象上的属性是否可调用,则有一个 callable(l.values) 函数。

标签: python list dictionary local iterable


【解决方案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]

【讨论】:

    【解决方案2】:
    >>> 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]
    

    【讨论】:

    • 我以前从未见过产量。那可能会派上用场。谢谢你。
    • 是的,生成是 ilst 是我所追求的,但我可能不得不使用您的其他示例,只是为了让自己熟悉不同的操作方式。
    猜你喜欢
    • 2022-12-07
    • 2022-11-16
    • 1970-01-01
    • 2013-11-15
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2020-10-02
    相关资源
    最近更新 更多