python中每次使用时函数外的增量值

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。我应该从函数返回一个值吗?


您正在函数命名空间中增加一个临时变量x,因此不修改col。如果您想更改col,您可以:

  • 使用带有classmethod和class属性的class
  • 使用一个装饰师,就像保罗·潘泽的答案一样。
  • 返回EDOCX1的值〔0〕,并影响到col
  • 使用global语句。

如果您不熟悉名称空间,请检查此链接

首先使用带有classmethod和class属性的class

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)

或使用global

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)