如何在python中编程以在每个函数调用中自动递增数字

时间:2018-11-01 23:15:39

标签: python

我定义了一个函数,其中有一个变量num分配了1000,而increment变量用于将num递增1。首次调用时,它会增加一个并显示值1001,但是再次调用时,它会显示相同的值1001,但每次调用时都应显示1002、1003

def number():
    num = 1000
    increment = num +1
    return increment


print(number())

5 个答案:

答案 0 :(得分:2)

Python允许将属性附加到函数(毕竟它是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 ...

状态应该保存在对象中,而功能应该是无状态的。您可以违反此规则,但可能会使以后的代码读者(甚至您)感到困惑。所以请不要。

答案 1 :(得分:1)

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

num = 1000
def number():
    global num
    num += 1
    return num

print(number())
print(number())
print(number())

这将输出:

1001
1002
1003

或者,您可以定义一个带有实例变量的类,该实例变量可以保存当前值,并可以使用一个递增其值的方法:

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

答案 2 :(得分:0)

除了已经发布的出色答案之外,您还可以使用闭包来实现:

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代码中看到类似模式的真正用途。)

答案 3 :(得分:0)

sum

这将使字典变异。

或者

def increment(state):
    state['value'] += 1
    return state['value']

state = {'value': 1000}
print(increment(state))

答案 4 :(得分:0)

(很抱歉迟到了派对) 诸如此类的好选择是使用生成器。

一个例子:

def number():
    num = 1000
    while True:
        yield num
        num = num + 1

可能与您已经拥有的最相似。将生成器分配给变量,然后调用以从中获取递增值:

num = number()

for i in range(10):
    print(next(num))

输出:

output