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

时间:2019-03-19 18:29:58

标签: python python-3.x

所以我有这个gen对象:

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

我只能这样使用:

u = 2  # some user given value
for i in yld123cu:
    print(i, end=' ')

有什么语法可以避免用u = ..赋值的多余行? 有什么办法将u值放入for语句中?

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

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

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

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

如果您需要一路更新u,而这就是要避免上述情况的原因,那么请知道您可以send为生成器提供一个值。

def yld123u(u):
    for i in range(1, 4):
        received = yield i * u # a sent value will be assigned to 'received'
        u = u if received is None else received

示例

如果不使用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: ')))

答案 2 :(得分:0)

您可以尝试这样。

  

注意:在这里,使用命名lambda函数没有问题。

mtcars %>%
    group_split(cyl) %>% 
    map(~  {
          data = .x
           map(c("cyl", "wt"), ~ lm(reformulate(.x, "mpg"), data = data))
        })

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

»输出

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