【问题标题】:How do you apply a list of lambda functions to a single element using an iterator?如何使用迭代器将 lambda 函数列表应用于单个元素?
【发布时间】:2011-12-01 15:42:35
【问题描述】:

我想使用一个必须用 yield 创建的可迭代对象将 lambda 函数列表应用于单个元素。

lambda 函数的列表如下:

[<function <lambda> at 0x1d310c8>, <function <lambda> at 0x1d355f0>]

我想将每个函数(从左到右)应用到单个元素,使用 yield 构造一个迭代器来迭代列表

【问题讨论】:

  • 必须用 yield 来创建 - 为什么?
  • 嘿...4 个几乎相同的答案 - 我认为这是一个很好的例子,有时我们在 Python 中确实有“一种明显的做法”
  • @jsbueno:这并不奇怪——毕竟yield 的使用是强制性的。否则,肯定也会有(f(x) for f in func_list)
  • @jsbueno:在大多数语言中,“使用循环”是对“我如何为列表中的所有元素做某事”这个问题的一个明显答案......

标签: python list lambda iterator yield


【解决方案1】:
def apply_all(functions, item):
    for f in functions:
        yield f(item)

示例用法:

functions = [type, id, hex]
for result in apply_all(functions, 55):
    print result

给予

<type 'int'>
20326112
0x37

【讨论】:

    【解决方案2】:

    试一试:

    def lambda_apply(unnamed_funcs, element):
        for unnamed in unnamed_funcs:
            yield unnamed(element)
    
    >>> l = [lambda x: x**2, lambda x: 2*x]
    >>> el = 5
    
    >>> for y in lambda_apply(l, el):
    ...     print y
    ... 
    25
    10
    

    请注意,这不仅适用于未命名函数列表,还适用于arity 1 的任何函数列表。这是因为所有函数,无论是否命名,都是 python 中的第一类对象。您可以将它们存储在列表中,并在以后使用它们,如上所示。

    【讨论】:

    • 你的函数中有一个错字:它应该是yield而不是yeild
    • 是的,刚刚发现。语法高亮不是很棒吗? (说真的,这是最好的)。
    【解决方案3】:

    答案可以表述为

    import numpy as np
    
    def apply_funcs( funcs, val ):
        for func in funcs:
            yield func(val)
    
    my_funcs = [lambda x: np.cos(x), np.sin, np.tan]
    my_val = 0.1
    
    for res in apply_funcs( my_funcs, my_val ):
        print res
    

    apply_funcs 函数的作用在于,其余的仅用于演示目的。

    【讨论】:

      【解决方案4】:

      您一定需要yield 声明吗?

      因为还有另一种创建生成器的方法:使用()

      applied_it = (f(item) for f in functions)
      

      【讨论】:

        【解决方案5】:
        def apply(value, lambda_list):
            for function in lambda_list:
                  yield (function(value))
        

        【讨论】:

          猜你喜欢
          • 2017-09-03
          • 2012-05-20
          • 2020-11-20
          • 1970-01-01
          • 1970-01-01
          • 2014-09-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多