使用另一个函数(Python3.x)更改生成器
我想更改下面生成器的行为,使其只生成偶数。我该怎么做 我知道有更简单、更聪明的方法可以做到这一点。这是一个人为的人力资源挑战 我编写的使用另一个函数(Python3.x)更改生成器,python,python-3.x,generator,python-decorators,Python,Python 3.x,Generator,Python Decorators,我想更改下面生成器的行为,使其只生成偶数。我该怎么做 我知道有更简单、更聪明的方法可以做到这一点。这是一个人为的人力资源挑战 我编写的change\u生成器函数没有产生所需的输出我只能更改更改生成器 我无法更改正整数\u生成器()或下面的for循环 我能和装修工一起解决这个问题吗 #can't change the body of this function def positive_integers_generator(): n = 1 while True:
change\u生成器
函数没有产生所需的输出我只能更改更改生成器
我无法更改正整数\u生成器()
或下面的for循环
我能和装修工一起解决这个问题吗
#can't change the body of this function
def positive_integers_generator():
n = 1
while True:
x = yield n
if x is not None:
n = x
else:
n += 1
# can only change this function
def change_generator(generator, n):
for i in generator:
if i%2 == 0:
yield(i)
# can't change this code either
# should print 1, 2, 4, 6, 8
g = positive_integers_generator()
for _ in range(5):
n = next(g)
print(n)
change_generator(g, n)
循环中不需要生成器上的参数,而且似乎也没有打印正确生成器的输出。适用于我的更新版本:
def正整数生成器():
n=1
尽管如此:
x=产量n
如果x不是无:
n=x
其他:
n+=1
def更换_发生器(发生器):
对于发电机中的i:
如果i%2==0:
产量一
g=正整数生成器()
#应该打印1,2,4
对于范围(5)内的uu:
n=下一个(更改发电机(g))
打印(n)
循环中不需要生成器上的参数,而且似乎也不需要打印正确生成器的输出。适用于我的更新版本:
def正整数生成器():
n=1
尽管如此:
x=产量n
如果x不是无:
n=x
其他:
n+=1
def更换_发生器(发生器):
对于发电机中的i:
如果i%2==0:
产量一
g=正整数生成器()
#应该打印1,2,4
对于范围(5)内的uu:
n=下一个(更改发电机(g))
打印(n)
您可以使用内置功能过滤器
even_numbers_generator = filter(lambda n: n % 2 == 0, positive_integers_generator())
或生成器表达式
even_numbers_generator = (n for n in positive_integers_generator() if n % 2 == 0)
或从标准库:
even_numbers_generator = itertools.count(start=2, step=2)
但是,如果您只能更改change\u generator
功能,那么对挑战的“正确答案”可能包括使用
您可以使用内置功能
过滤器
even_numbers_generator = filter(lambda n: n % 2 == 0, positive_integers_generator())
或生成器表达式
even_numbers_generator = (n for n in positive_integers_generator() if n % 2 == 0)
或从标准库:
even_numbers_generator = itertools.count(start=2, step=2)
但是,如果您只能更改change\u generator
功能,那么对挑战的“正确答案”可能包括使用
在您非常具体的问题中,如果您无法更改
print(n)
部分,那么您将陷入困境,因为您无法更改为正整数\u generator()创建的生成器g
实例
在这种情况下,您可能希望更新要重新分配给新的生成器的全局g
,然后:
def change_generator(generator, n):
def even_gen():
n = 2
while True:
if n % 2 == 0:
yield n
else:
yield
n += 1
global g # directly change the g referenced in main code
if not g.__name__ == 'even_gen': # change g if it is not even_gen
g = even_gen()
# output:
# 1
# 2
# None
# 4
# None
在您非常具体的问题中,如果您无法更改print(n)
部分,那么您将陷入困境,因为您无法更改为正整数\u generator()创建的生成器g
实例
在这种情况下,您可能希望更新要重新分配给新的生成器的全局g
,然后:
def change_generator(generator, n):
def even_gen():
n = 2
while True:
if n % 2 == 0:
yield n
else:
yield
n += 1
global g # directly change the g referenced in main code
if not g.__name__ == 'even_gen': # change g if it is not even_gen
g = even_gen()
# output:
# 1
# 2
# None
# 4
# None
关于括号你是对的。我添加了更多的上下文来澄清。我无法更改循环的内容。我猜这个问题可以由一个装饰师来解决。括号的问题你说得对。我添加了更多的上下文来澄清。我无法更改循环的内容。我猜这可以通过一个装饰器来解决。我很困惑,你不能更改循环调用代码,但是你在我假设的示例中添加了对change_generator的调用?@RyanWidmaier:我只能更改change_generator
函数。生成器的定义、它的创建和循环中的所有代码都应该保持不变。这是一个人力资源挑战问题。1,2,4之后应该打印什么?循环是5long@PatrickArtner:您是对的,应该是1、2、4、6、8。我很困惑,您不能更改循环调用代码,但您在我假设的示例中添加了对change_generator的调用?@RyanWidmaier:我只能更改change_generator
函数。生成器的定义、它的创建和循环中的所有代码都应该保持不变。这是一个人力资源挑战问题。1,2,4之后应该打印什么?循环是5long@PatrickArtner:没错,应该是1、2、4、6、8。挑战在于我只能更改change\u生成器
函数,而不能更改调用代码(for循环)。这些解决方案很好,但我不能使用它们。您可能应该在这个挑战中使用generator.send()
。请参阅我的最新答案。我添加了一个只更改change\u generator
function.generator.send()的解决方案。。。热确定什么是人力资源的挑战虽然-如果这是人力资源,我们帮助他在一些他应该解决的伟大的答案。。。没有想到send
方法这么有用。我确信必须更新global g
。挑战在于我只能更改change\u generator
函数,而不能更改调用代码(for循环)。这些解决方案很好,但我不能使用它们。您可能应该在这个挑战中使用generator.send()
。请参阅我的最新答案。我添加了一个只更改change\u generator
function.generator.send()的解决方案。。。热确定什么是人力资源的挑战虽然-如果这是人力资源,我们帮助他在一些他应该解决的伟大的答案。。。没有想到send
方法这么有用。我想肯定的是,必须更新global g
。