自动增量可赎回?

Tim*_*ony 7 python counter auto-increment

我有一个方法,我需要将一个不断增加的整数传递给另一个函数.

我可以这样做:

def foo(i):
    print i

def bar():

    class Incrementer(object):
        def __init__(self, start=0):
            self.i = start

        def __get__(self):
            j = self.i
            self.i += 1
            return j

    number = Incrementer()
    foo(number)
    foo(number)
    foo(number)
Run Code Online (Sandbox Code Playgroud)

这是正确的输出,0 1 2 ...但我觉得我忽略了一个更容易(或内置)的方式这样做?

Sve*_*ach 15

尝试itertools.count()- 它完全符合您的需求:

>>> c = itertools.count()
>>> next(c)
0
>>> next(c)
1
>>> next(c)
2
Run Code Online (Sandbox Code Playgroud)


kin*_*all 7

通常,如果您需要在对函数的一次调用和下一次调用之间保持状态,那么您想要的是对象(您的解决方案)还是生成器.在某些情况下,一个会比另一个更简单,但原则上你如何做到这一点并没有(尽管你似乎在实现上有一些问题).

斯文的建议,itertools.count()是一个发电机.它的实现是这样的:

def count():
    i = 0
    while True:
        yield i
        i += 1
Run Code Online (Sandbox Code Playgroud)

现在,如果你希望它像函数一样可调用,而不是必须这样做next(c),你可以定义一个包装器来实现它:

 def count(c=itertools.count()):
     return next(c)
Run Code Online (Sandbox Code Playgroud)

或者不可避免的单线lambda:

count = lambda c=itertools.count(): next(c)
Run Code Online (Sandbox Code Playgroud)

然后count()每次调用它时返回下一个整数.

当然,如果你想能够创建任意数量的可调用函数,每个函数都有自己的计数器,你可以为它编写一个工厂:

def counter():
    return lambda c=itertools.count(): next(c)
Run Code Online (Sandbox Code Playgroud)

那就是:

c = counter()
print c()   # 0
print c()   # 1
# etc
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎比一个对象更简单,但不是很多.如果您的状态或逻辑更复杂,那么对象的封装可能会胜出.