gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:18:43 25 4
gpt4 key购买 nike

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

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

例子

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com