Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.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
使用另一个函数(Python3.x)更改生成器_Python_Python 3.x_Generator_Python Decorators - Fatal编程技术网

使用另一个函数(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