increment value outside of function for every use in python
我有一个函数要多次使用,每次使用时,我都希望函数外部的变量递增。沿着-
1 2 3 4 5 6 7 8 9 10 11 | def funtion1(mylists,x): row=1 for elm in mylists: ws.write(row,x,elm) row+=1 x += 1 col=0 function1(mylist1,col) function1(mylist2,col) function1(mylist3,col) |
等
我以为每使用一次col都会增加,但它保持在0。我应该从函数返回一个值吗?
您正在函数命名空间中增加一个临时变量
- 使用带有
classmethod 和class属性的class 。 - 使用一个装饰师,就像保罗·潘泽的答案一样。
- 返回EDOCX1的值〔0〕,并影响到
col 。 - 使用
global 语句。
如果您不熟悉名称空间,请检查此链接
首先使用带有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class functions: col = 0 @classmethod def function1(cls, mylists): row=1 for elm in mylists: ws.write(row, cls.col,elm) row+=1 cls.col += 1 functions.function1(mylist1) functions.function1(mylist2) functions.function1(mylist3) |
这是我的首选选项,因为名称空间没有受到污染,代码比返回值更干净。
现在返回一个值:
1 2 3 4 5 6 7 8 9 10 11 | def funtion1(mylists,x): row=1 for elm in whichlist: ws.write(row,x,elm) row=row+1 return x + 1 col = 0 col = function1(mylist1,col) col = function1(mylist2,col) col = function1(mylist3,col) |
或使用
1 2 3 4 5 6 7 8 9 10 11 12 | def function1(mylists): global col row=1 for elm in mylists: ws.write(row,col,elm) row+=1 col += 1 col=0 function1(mylist1) function1(mylist2) function1(mylist3) |
您可以创建一个函数属性来保存计数器。这里有一个装饰师可以做到这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import functools as ft def I_can_count(f): @ft.wraps(f) def wrapper(*args, **kwds): wrapper.times_called += 1 return f(*args, **kwds) wrapper.times_called = 0 return wrapper @I_can_count def f(x): print x print(f.times_called) f(100) print(f.times_called) f(100) print(f.times_called) # 0 # 100 # 1 # 100 # 2 |
请注意,这里的decorator的目的是双重的:(1)它增加了便利性;但更重要的是(2)它保护函数所在的名称空间,或者更确切地说,它的包装器所在的名称空间。如果不这样做,可能会发生以下事故:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def f(x) f.times_called += 1 print(x) f.times_called = 0 f(100) # 100 f.times_called # 1 g = f del f g(100) # Traceback (most recent call last): # File"<stdin>", line 1, in <module> # File"<stdin>", line 2, in f # NameError: name 'f' is not defined |
两个选项,纯函数,不修改其范围之外的任何内容,最推荐
正如我们的朋友Jacques Gaudin所说:https://stackoverflow.com/a/47680265/7579116
另一个,不那么花哨,也不推荐,但你要求的是将x声明为全局
1 2 3 4 5 6 7 8 9 10 11 12 | x = 0 def funtion1(mylists,x): global x row=1 for elm in whichlist: ws.write(row,x,elm) row=row+1 x += 1 function1(mylist1,col) function1(mylist2,col) function1(mylist3,col) |