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

时间:2017-12-06 17:33:49

标签: python function

我有一个我想要多次使用的函数,在每次使用时我都希望函数外部的变量递增。沿着 -

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

3 个答案:

答案 0 :(得分:3)

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

  • 使用class classmethod和类属性
  • 使用Paul Panzer的answer
  • 中的装饰器
  • 返回x的值并将其影响到col
  • 使用global声明。

如果您不熟悉命名空间检查this link

首先使用带有classmethodclass和类属性:

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)