python实现自增的函数

我定义了一个函数,其中有一个变量num赋值为 1000,increment变量用于将 num 增加 1。当它第一次被调用时,它会增加一并显示值 1001,但是当它再次被调用时,它会显示相同的值 1001,但它应该在每次调用时显示 1002、1003

def number():

    num = 1000

    increment = num +1

    return increment

print(number())

def incrementor():

    info = {"count": 999}

    def number():

        info["count"] += 1

        return info["count"]

    return number

number = incrementor()

>>> number()

1000

>>> number()

1001

>>> number()

1002

(字典有点笨拙,但你不能用一个简单的变量名来做,至少不使用 Python 3 的nonlocal关键字,这对我来说更笨拙。我想这个特定的例子不会被认为是非常 Pythonic 的 -但这是一个选项,您将在其他 Python 代码中看到类似模式的真正用途。)

Python 允许将属性附加到函数(毕竟它是 class 的对象function)。

因此,您可以通过这种方式避免全局(或非局部)变量:

def number():

    if hasattr(number, "num"):

        number.num += 1           # increment if not first call

    else:

        number.num = 1000         # initialize on first call

    return number.num

演示:

>>> for i in range(10):

        print(number())

按预期显示:

1000

1001

1002

1003

1004

1005

1006

1007

1008

1009

并且没有与全局变量的另一种使用发生冲突的风险......

但要小心。一个晚上后,我意识到虽然这是你要求的,但这是一种反模式。这是 OOP 语言中的一个有状态函数,yerk ...

状态应该保存在对象中,函数应该是无状态的。你可以打破这个规则,但它可能会混淆该代码的未来读者(甚至你......)。所以请不要。

您应该num在number函数外部定义,并将其声明为函数内部的全局变量,以便您可以引用它并在递增后更新其值:

num = 1000

def number():

    global num

    num += 1

    return num

print(number())

print(number())

print(number())

这输出:

1001

1002

1003

或者,您可以定义一个具有保存当前值的实例变量和一个递增它的方法的类:

这个最好,可以自定义起始值,而且调用完自动归零。number = Number(1000)需要写在for外,print(number.increment())写在for内

class Number:

    def __init__(self, value):

        self.value = value

    def increment(self):

        self.value += 1

        return self.value

以便:

number = Number(1000)

print(number.increment())

print(number.increment())

print(number.increment())

也会输出:

1001

1002

1003

然而,这使得用法有些冗长。一个更简单的方法是创建value一个类变量并覆盖该类的__new__方法:

class number:

    value = 1000

    def __new__(cls):

        cls.value += 1

        return cls.value

以便:

print(number())

print(number())

print(number())

会输出:

1001

1002

1003