Python 生成器的代理方法
我有一个生成器方法Python 生成器的代理方法,python,generator,Python,Generator,我有一个生成器方法下一项(数据) 我称之为循环: for count, item in enumerate(next_item(data)): # do something here 但是现在我想扩展我的程序-根据输入将next_item方法分成两个方法 因此,下一个_item()如下所示: if ...: # some condition here yield(next1(data)) # or return(next1(data)) ?? else: yield(next2
下一项(数据)
我称之为循环:
for count, item in enumerate(next_item(data)):
# do something here
但是现在我想扩展我的程序-根据输入将next_item
方法分成两个方法
因此,下一个_item()如下所示:
if ...: # some condition here
yield(next1(data)) # or return(next1(data)) ??
else:
yield(next2(data))
但是return不起作用(“SyntaxError:'return'在生成器内部带有参数”)
和yield
显然导致该项成为生成器,而不是此生成器的项
因此,我必须重构调用脚本,但我想知道是否有办法编写这样的代理生成器。从您的错误消息中,听起来您尝试了如下操作:
if ...: # some condition here
return (next1(data))
else:
yield (next2(data))
Python不会接受同时产生和返回的函数。如果你想让它发挥作用,你需要将两种收益率都转换为回报率
以下是在两个生成器之间进行选择的函数示例:
def squares():
i = 0
while True:
yield i * i
i += 1
def evens():
i = 0
while True:
yield i*2
i += 1
def next_item(switch):
if switch == 0:
return squares()
else:
return evens()
print "printing squares..."
for idx, item in enumerate(next_item(0)):
print idx, item
if idx > 10: break
print "printing evens..."
for idx, item in enumerate(next_item(1)):
print idx, item
if idx > 10: break
结果:
printing squares...
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
11 121
printing evens...
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
10 20
11 22
如果您愿意,您还可以将
下一个\u项
制作为生成器:
def next_item(switch):
if switch == 0:
for item in squares(): yield item
else:
for item in evens(): yield item
或者可能:
def next_item(switch):
for item in squares() if switch == 0 else evens():
yield item
如果您使用的是3.X,那么您可以使用
def next_item(switch):
yield from squares() if switch == 0 else evens()
从错误消息中,听起来您尝试了以下操作:
if ...: # some condition here
return (next1(data))
else:
yield (next2(data))
Python不会接受同时产生和返回的函数。如果你想让它发挥作用,你需要将两种收益率都转换为回报率
以下是在两个生成器之间进行选择的函数示例:
def squares():
i = 0
while True:
yield i * i
i += 1
def evens():
i = 0
while True:
yield i*2
i += 1
def next_item(switch):
if switch == 0:
return squares()
else:
return evens()
print "printing squares..."
for idx, item in enumerate(next_item(0)):
print idx, item
if idx > 10: break
print "printing evens..."
for idx, item in enumerate(next_item(1)):
print idx, item
if idx > 10: break
结果:
printing squares...
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
11 121
printing evens...
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
10 20
11 22
如果您愿意,您还可以将
下一个\u项
制作为生成器:
def next_item(switch):
if switch == 0:
for item in squares(): yield item
else:
for item in evens(): yield item
或者可能:
def next_item(switch):
for item in squares() if switch == 0 else evens():
yield item
如果您使用的是3.X,那么您可以使用
def next_item(switch):
yield from squares() if switch == 0 else evens()
“但返回不起作用”。您是否将第一个
收益率替换为退货?还是两个都换了?你能把产生那个错误的实际代码贴出来吗?我不清楚你想做什么。next1
和next2
是常规功能,还是生成器本身?如果要代理生成器,只需执行以下操作:If…:yield next1(data)。next()
等。。。或者返回发电机的输出,即如果…:返回next1(数据)
…凯文:我只更换了一个,是的,这就是问题所在。谢谢你的帮助!“但返回不起作用”。您是否将第一个收益率替换为退货?还是两个都换了?你能把产生那个错误的实际代码贴出来吗?我不清楚你想做什么。next1
和next2
是常规功能,还是生成器本身?如果要代理生成器,只需执行以下操作:If…:yield next1(data)。next()
等。。。或者返回发电机的输出,即如果…:返回next1(数据)
…凯文:我只更换了一个,是的,这就是问题所在。谢谢你的帮助!是的,这正是我所做的——我用回报率代替了两种收益率中的一种。我没有从错误中意识到这就是问题所在。谢谢是的,这正是我所做的——我用回报率代替了两种收益率中的一种。我没有从错误中意识到这就是问题所在。谢谢