多个发电机

时间:2012-06-28 06:31:44

标签: python generator

我正在尝试为棒球程序编写一个程序,该程序将使用多个发生器来获得罢工和球。我的发电机看起来像这样:

k = (strike(x) for x in range(3) if x%1 ==0)  
w = (ball(n) for n in range(4) if x%1 == 0)

到目前为止我的程序是这样的:

def count(pitch):
    if pitch == 'strike':
        return next(k),w
    elif pitch =='ball':
        return next(w),k

我希望我的代码返回下一个结果以进行攻击,并返回当前的球,反之亦然。请帮忙我很难过。

2 个答案:

答案 0 :(得分:3)

在没有推进发电机的情况下,无法获得发电机的“当前”值。如果要跟踪“当前”值,则需要自己存储。这意味着您必须重构代码,因为count函数将在下次调用时“忘记”其任何值。以下是使用类进行此操作的一种方法:

class Count(object):
    def __init__(self):
        self.k = (x for x in range(3))
        self.w = (x for x in range(4))
        self.strikes = next(self.k)
        self.balls = next(self.w)

    def count(self, pitch):
        if pitch == "strike":
            self.strikes = next(self.k)
        elif pitch == "ball":
            self.balls = next(self.w)
        return self.strikes, self.balls

我删除了对strikeball函数的引用,因为您没有提供有关这些函数的信息,但您可以添加它们。然后:

>>> c = Count()
>>> c.count("strike")
(1, 0)
>>> c.count("strike")
(2, 0)
>>> c.count("ball")
(2, 1)

正如@gnibbler在评论中指出的那样,您还应该考虑一下您正在尝试对x%1业务做些什么。

答案 1 :(得分:0)

更简单的方法:

k = [x for x in range(3)]
w = [n for n in range(4)]
i=0
j=0

def countt(pitch):
    global i
    global j
    if pitch == 'strike':

        if i==len(k)-1:
            i=0
        else:i=i+1
        return k[i],w[j]

    elif pitch =='ball':
        if j==len(w)-1:
            j=0
        else:j=j+1    
        return w[j],k[i]    

<强>输出:

>>> countt('strike')
(1, 0)
>>> countt('strike')
(2, 0)
>>> countt('ball')
(1, 2)
>>> countt('ball')
(2, 2)
>>> countt('ball')
(3, 2)
>>> countt('strike')
(0, 3)