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