我有一个我想要多次使用的函数,在每次使用时我都希望函数外部的变量递增。沿着 -
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.我应该从函数返回一个值吗?
答案 0 :(得分:3)
您正在函数名称空间中递增临时变量x
,因此不会修改col
。如果您想更改col
,可以:
class
classmethod
和类属性x
的值并将其影响到col
global
声明。如果您不熟悉命名空间检查this link
首先使用带有classmethod
的class
和类属性:
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)
这将是我的首选选项,因为命名空间没有被污染,代码比返回值更清晰。
现在返回一个值:
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)
或使用global
:
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)
您可以创建一个函数属性来保存计数器。这是一个装饰器:
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
请注意,这里装饰者的目的有两个:(1)它增加了便利性;但更重要的是(2)它保护了函数或其包装器发现自身的命名空间。如果没有这种情况,可能会发生以下事故:
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
答案 2 :(得分:1)
两个选项,纯函数不会修改其范围之外的任何内容,大多数建议
正如我们的朋友Jacques Gaudin所补充的:https://stackoverflow.com/a/47680265/7579116
另一个,不那么花哨,不推荐,但你要求的是宣布x为全球
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)