python - python lambda/fn 可以代表任意调用者产生吗?

标签 python lambda generator yield

更新:示例现在列出了所需的结果(下面以粗体显示)

我发现自己写了很多函数来搜索一些数据,我想让调用者在找到匹配项时指定行为:他们可能会打印出一些东西或将其添加到他们的数据结构之一,但这也是非常可取的能够有选择地返回找到的数据以供进一步传输、存储或处理。

例子

def find_stuff(visitor):    # library search function
    for x in (1, 2, 3, 4, 5, 6):
        visitor(x)

第一次客户端使用:

def my_visitor(x):   # client visitor functions (also often use lambdas)
    if x > 3:
        yield x / 2   #>>> WANT TO DO SOMETHING LIKE THIS <<<#

results = find_stuff(my_visitor)   # client usage

结果 应该产生 4/2、5/2,然后是 6/2...即 2、2、3。/p>

第二个客户端用法:

def print_repr_visitor(x):
    print repr(x)

find_stuff(print_repr_visitor)     # alternative usage

应该打印 1 2 3 4 5 6(单独的行)但不产生任何结果

但是,yield 不会在“结果”中创建生成器(至少对于我坚持使用的 python 2.6.6)。


我尝试过的

我一直在破解它,经常像这样...

def find_stuff(visitor):
    for x in (1, 2, 3, 4, 5):
        val = visitor(x)
        if val is not None:
             yield val

...或者有时,当访问者参数列表输入太多次很痛苦时...

def find_stuff(visitor):
    for x in (1, 2, 3, 4, 5):
        val = visitor(x)
        if val == 'yield':
            yield x
        elif val is not None:
             yield val

问题/问题

这些“解决方案”不仅笨拙 - 需要来自“查找”例程的明确内置支持 - 它们从访问者可以返回给顶级调用者的结果集中删除标记值......

在简洁、直观、灵活、优雅等方面是否有更好的选择?

谢谢!

最佳答案

在 Python 3 中,您可以使用 yield from 从子生成器生成项目:

def find_stuff(visitor):
    for x in (1, 2, 3, 4, 5):
        yield from visitor(x)

在 Python 2 中,您必须遍历子生成器。这需要更多代码并且不能处理一些边缘情况,但通常已经足够好了:

def find_stuff(visitor):
    for x in (1, 2, 3, 4, 5):
        for item in visitor(x):
            yield item

边缘情况是诸如尝试发送 值或抛出 异常到子生成器。如果您不使用协程功能,您可能不需要担心它们。

关于python - python lambda/fn 可以代表任意调用者产生吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21276568/

相关文章:

python - 如何将其中没有的列表转换为 torch.tensor()?

python - 如何完成python时间元组中的信息?

python - 如何理解 Peter Norvig 的这段 Python 函数式代码?

lambda - 在 Web2py 中使用 lambda 作为模型默认值

python - 将yield语句转换为Python中的生成器表达式

c - 以正确的方式将熵源添加到随机数生成器

python - 如何使用 OpenCV VideoWriter 根据触发器开始和停止保存视频帧

python - python中是否有一个函数可以将[2011,2012,2013,204]等日期的值映射到2011-2014。其中 [2003,2006,2007,2008] 至 2003, 2006-2008

javascript - JSX 中的 lambda 是如何工作的?

javascript - ES6 已经有了生成器,为什么 ES2017 还要引入 async/await?