如何找到第一次调用该函数的位置以及相应的 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
有人问我以下问题:
编写一个函数 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