更新:示例现在列出了所需的结果(下面以粗体显示)
我发现自己写了很多函数来搜索一些数据,我想让调用者在找到匹配项时指定行为:他们可能会打印出一些东西或将其添加到他们的数据结构之一,但这也是非常可取的能够有选择地返回找到的数据以供进一步传输、存储或处理。
例子
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/