所以我有这个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=' ')
答案 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=' ')