Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成器的代理方法_Python_Generator - Fatal编程技术网

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(数据)
…凯文:我只更换了一个,是的,这就是问题所在。谢谢你的帮助!是的,这正是我所做的——我用回报率代替了两种收益率中的一种。我没有从错误中意识到这就是问题所在。谢谢是的,这正是我所做的——我用回报率代替了两种收益率中的一种。我没有从错误中意识到这就是问题所在。谢谢