Python:传递参数给生成器对象由生成器表达式创建?

2024-07-04 07:25:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个gen对象:

yld123cu = (x * u for x in range(1, 4))

我只能这样使用:

^{pr2}$

有没有语法可以避免u=。。任务? 有没有办法把u值放在for语句中?在

我想要类似于下面的,但使用gen表达式,而不是函数:

def yld123u(u):
    for i in range(1, 4):
        yield i * u

for i in yld123u(2):
    print(i, end=' ')

Tags: 对象函数infor表达式def语法range
3条回答

你可以这样试试。在

Note: Here, we don't have a problem of using named lambda function.

for i in (lambda u: (x * u for x in range(1, 4)))(u=2): 
    print(i, end=' ')

或者

^{pr2}$

» Output

2 4 6 

由于生成器表达式不能有自己的作用域,因此最好的方法是按照您的建议定义生成器函数。在

def yld123u(u):
    for i in range(1, 4):
        yield i * u

如果您需要在这个过程中更新u,并且这是您希望避免上述情况的原因,那么就知道您可以^{}将值赋给生成器。在

^{pr2}$

示例

如果不使用send,生成器的行为仍然相同。在

for x in yld123u(4):
    print(x)

输出

4
8
12 

您可以使用send来更新u的值。在

gen = yld123u(4)
v0 = next(gen)
v1 = gen.send(0)
v2 = gen.send(4)
print(v0, v1, v2)

输出

4 0 12

输入回路

如果您需要生成器与用户输入进行交互,下面是我以前的回答,它建议了一种实现yield-receive generator usable in a for-loop的方法。在

class YieldReceive:
    stop_iteration = object()

    def __init__(self, gen):
        self.gen = gen
        self.next = next(gen, self.stop_iteration)

    def __iter__(self):
        return self

    def __next__(self):
        if self.next is self.stop_iteration:
            raise StopIteration
        else:
            return self.next

    def send(self, value):
        try:
            self.next = self.gen.send(value)
        except StopIteration:
            self.next = self.stop_iteration

用法

it = YieldReceive(yld123u(4))
for x in it:
    print(x)
    it.send(int(input('Enter next u value: ')))

您可以使用lambda。这对我有用:

yld123cu = lambda u: (x * u for x in range(1, 4))

for i in yld123cu(2):
    print(i, end=' ')

相关问题 更多 >

    热门问题