如何找到第一次调用该函数的位置以及相应的 return None?

How do I find where the first call of the function was and return None accordingly?

有人问我以下问题:

编写一个函数 last_in(x),returns 是上一次调用中使用的 x 的值。第一次调用该函数时,它将 return None.

我做了一些工作,但缺少一些东西。这是我的尝试:

def last_in(x):
    def inner():
        return x

    return inner()

以及

的输出
print(last_in(3),last_in(4),last_in(5), last_in("a"),last_in("12"))

3 4 5 a 12

但预期需要

None 3 4 5 a

我错过了什么?

谢谢!

您正在创建一个函数 inner 并立即调用它。所以这个:

def last_in(x):
    def inner():
        return x

    return inner()

大致相当于:

def last_in(x):
    return x

您可以做的是,定义一个变量并使用 global 关键字访问它:

last_x = None

def last_in(x):
    global last_x
    return_value, last_x = last_x, x
    return return_value


print(last_in(3), last_in(4), last_in(5), last_in("a"), last_in("12"))
None 3 4 5 a

您可以为您的函数创建一个属性来存储以前的值,例如last_in.prev_val。这有点类似于其他语言中的static variables。您只需要确保正确处理初始化属性。 getattr 正如@Feodoran 提到的那样很有用。

def last_in(x):
    return_val = getattr(last_in, 'prev_val', None)
    last_in.prev_val = x
    return return_val

print(last_in(3), last_in(4), last_in(5), last_in("a"), last_in("12"))

输出:

None 3 4 5 a

您可以维护传递给函数的输入的全局列表。

valueList=[]
def last_in(x):
    def inner():
        valueList.append(x)
        if(len(valueList)!=1):
            return valueList[len(valueList)-2]
        else:
            return None

    return inner()

print(last_in(3),last_in(4),last_in(5), last_in("a"),last_in("12"))

输出: None 3 4 5 一个

不用全局变量也可以:

def last_in(x, last = [None]):
    v, last[0] = last[0], x
    return v

print(last_in(3),last_in(4),last_in(5), last_in("a"),last_in("12"))

打印:

None 3 4 5 a

另一种方法是使用 Mutable Default Argument:

def last_in(x, prev=[None]):
    prev.append(x)
    return prev[-2]

print(last_in(3),last_in(4),last_in(5), last_in("a"),last_in("12"))

这将产生:

None 3 4 5 a

函数是对象,可以有属性。因此,您可以将之前的数字存储为属性。

def last_in(x):
    if hasattr(last_in, 'last_num'): curr_num = last_in.last_num   
    else: curr_num = None        
    last_in.last_num = x
    return curr_num


print(last_in(2))
print(last_in(3))
print(last_in(4))

输出:

None
2
3