如何用python编程,在每次函数调用时自动递增一个数字

如何用python编程,在每次函数调用时自动递增一个数字,python,Python,我定义了一个函数,其中有一个赋值为1000的num变量和一个递增的num变量。当它第一次被调用时,它会增加1并显示值1001,但当它再次被调用时,它会显示相同的值1001,但每次调用时它都会显示1002,1003 def number(): num = 1000 increment = num +1 return increment print(number()) 您应该在number函数外定义num,并将其声明为函数内的全局变量,以便在递增后可以引用它并更新其值:

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

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


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

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())
print(number())
print(number())
print(number())
还将输出:

1001
1002
1003
然而,这使得使用有点冗长。一种更简单的方法是将value设为类变量,并重写类的_unew_u方法:

class number:
    value = 1000
    def __new__(cls):
        cls.value += 1
        return cls.value
以便:

number = Number(1000)
print(number.increment())
print(number.increment())
print(number.increment())
print(number())
print(number())
print(number())
将输出:

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

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())
print(number())
print(number())
print(number())
还将输出:

1001
1002
1003
然而,这使得使用有点冗长。一种更简单的方法是将value设为类变量,并重写类的_unew_u方法:

class number:
    value = 1000
    def __new__(cls):
        cls.value += 1
        return cls.value
以便:

number = Number(1000)
print(number.increment())
print(number.increment())
print(number.increment())
print(number())
print(number())
print(number())
将输出:

1001
1002
1003

Python允许将属性附加到函数,毕竟它是类函数的对象

因此,可以通过以下方式避免全局或非局部变量:

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
演示:

按预期显示:

1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
并且没有与全局变量的另一种用法发生冲突的风险

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


状态应该保存在对象中,函数应该是无状态的。你可以打破这条规则,但它可能会让那些代码的未来读者感到困惑,即使你。。。。所以请不要这样做。

Python允许将属性附加到函数,毕竟它是类函数的对象

因此,可以通过以下方式避免全局或非局部变量:

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
演示:

按预期显示:

1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
并且没有与全局变量的另一种用法发生冲突的风险

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


状态应该保存在对象中,函数应该是无状态的。你可以打破这条规则,但它可能会让那些代码的未来读者感到困惑,即使你。。。。所以请不要这样做。

除了已经发布的优秀答案外,您还可以使用闭包:

def incrementor():
    info = {"count": 999}
    def number():
        info["count"] += 1
        return info["count"]
    return number

number = incrementor()

>>> number()
1000
>>> number()
1001
>>> number()
1002

dict有点笨拙,但是你不能用一个简单的变量名,至少不使用python3的nonlocal关键字,我觉得这更笨拙。我想这个特定的示例不会被认为是非常Pythonic的,但它是一个选项,您将在其他Python代码中看到类似模式的真正用途。

除了已经发布的优秀答案,您还可以使用闭包:

def incrementor():
    info = {"count": 999}
    def number():
        info["count"] += 1
        return info["count"]
    return number

number = incrementor()

>>> number()
1000
>>> number()
1001
>>> number()
1002
def increment(state):
    state['value'] += 1
    return state['value']

state = {'value': 1000}
print(increment(state))
dict有点笨拙,但是你不能用一个简单的变量名,至少不使用python3的nonlocal关键字,我觉得这更笨拙。我想这个特定的示例不会被认为是非常Pythonic的,但它是一个选项,您将在其他Python代码中看到类似模式的真正用途

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

state = {'value': 1000}
print(increment(state))
这将使字典发生变异

或者

def increment (number):
    global number
    number += 1
    return number

number = 1000
print(increment(number))  # 1001
print(increment(number))  # 1002
print(increment(number))  # 1003
这将使字典发生变异

或者

def increment (number):
    global number
    number += 1
    return number

number = 1000
print(increment(number))  # 1001
print(increment(number))  # 1002
print(increment(number))  # 1003

抱歉来晚了 对于这种情况,一个好的选择可能是使用发电机

例如:

def number():
    num = 1000
    while True:
        yield num
        num = num + 1
这可能是你已经拥有的最相似的。将生成器分配给一个变量,然后调用next以从中获取递增值:

num = number()

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


抱歉来晚了 对于这种情况,一个好的选择可能是使用发电机

例如:

def number():
    num = 1000
    while True:
        yield num
        num = num + 1
这可能是你已经拥有的最相似的。将生成器分配给一个变量,然后调用next以从中获取递增值:

num = number()

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


将num=1000移出函数,否则num总是会被重置,increment总是会在函数外返回1001Write num=1000。函数外的num=1000也会在每次函数调用时给出输出1001,但不是在函数外声明num=1000时自动递增,在使用它之前,还要使用全局num在内部声明它。将num=1000移出函数,否则num总是会被重置,并且increment总是会在函数外部返回1001Write num=1000。在函数外部,num=1000也会给出输出 ut 1001,但它不是自动递增的,在函数外部声明num=1000,在使用它之前也在函数内部声明global num。