首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python:向生成器表达式创建的生成器对象传递参数?

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

Stack Overflow用户
提问于 2019-03-20 02:29:58
回答 2查看 4.4K关注 0票数 7

所以我有这个gen对象:

代码语言:javascript
复制
yld123cu = (x * u for x in range(1, 4))

我只能像这样使用它:

代码语言:javascript
复制
u = 2  # some user given value
for i in yld123cu:
    print(i, end=' ')

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

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

代码语言:javascript
复制
def yld123u(u):
    for i in range(1, 4):
        yield i * u

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

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-20 03:39:57

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

代码语言:javascript
复制
def yld123u(u):
    for i in range(1, 4):
        yield i * u

如果您需要在此过程中更新u,这就是您想要避免上述情况的原因,那么要知道您可以将一个值send到生成器。

代码语言:javascript
复制
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,生成器的行为仍然是一样的。

代码语言:javascript
复制
for x in yld123u(4):
    print(x)

输出

代码语言:javascript
复制
4
8
12 

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

代码语言:javascript
复制
gen = yld123u(4)
v0 = next(gen)
v1 = gen.send(0)
v2 = gen.send(4)
print(v0, v1, v2)

输出

代码语言:javascript
复制
4 0 12

输入循环

如果你需要生成器与用户输入交互,这里是我过去的答案,它建议了一种实现yield-receive generator usable in a for-loop的方法。

代码语言:javascript
复制
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

用法

代码语言:javascript
复制
it = YieldReceive(yld123u(4))
for x in it:
    print(x)
    it.send(int(input('Enter next u value: ')))
票数 9
EN

Stack Overflow用户

发布于 2019-03-20 02:35:30

您可以使用lambda。这对我来说很有效:

代码语言:javascript
复制
yld123cu = lambda u: (x * u for x in range(1, 4))

for i in yld123cu(2):
    print(i, end=' ')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55247806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档