python中引用局部变量的匿名函数

2024-10-01 09:15:46 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在python中定义匿名函数呢?在python中,bahaviour应该在定义时依赖于局部变量的值,并且还接受参数

示例:

def callback(val1, val2):
   print "{0} {1}".format(val1, val2)

i = 0
f0 = lambda x: callback(i, x)
i = 1
f1 = lambda x: callback(i, x)

f0(8) # prints "1, 8: but I'd like "0, 8" (value of 'i' when f0 was defined)
f1(8) # prints "1, 8"

如果不将我的回调打包到它自己的一个类中,这样的事情是可能的吗?在


Tags: lambda函数示例参数定义defcallbackprints
3条回答

你可以通过functools.partial公司名称:

f0 = partial(callback, i)

你可以创建一个函数来创建一个函数。partial是另一个选项,正如其他人提到的那样。在

def repeater(s):
  def anon():
      print s
  return anon

greet = repeater("Hello, World")
greet()

python中使用functools.partial的闭包

from functools import partial

i = 0
f0 = partial(callback, i)
i = 1
f1 = partial(callback, i)

f0()
# 0
f1()
# 1

{cdda>在这个时刻,就像是一个的值。当它被调用时不评估它。在

仅包装部分参数

Yes partial将允许您包装任意数量的参数,剩余的arg和kwarg可以传递给结果partial对象,这样它的行为就像调用原始包装函数一样。。。在

^{2}$

实际上,您已经将callback(val1, val2)包装成callback(val2),其中val1已经作为闭包包含。在

使用lambda

如果您真的想知道如何使用lambda闭包来实现这个目的,那么您可以看到为什么它变得难看并且更倾向于使用部分闭包。。。在

f0 = (lambda val1: lambda val2: callback(val1, val2))(i)

必须将scope变量包装到外部函数作用域中,然后在内部lambda函数中引用该范围。大笑。在

异常的回溯:部分函数与lambda函数与嵌套函数

内因与外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因外因。请记住,我指的是函数闭包。functools.partial修复了当包装函数引发异常时将得到的回溯。。。在

考虑一下这个版本,它将除法提高到零:

def callback(val1, val2):
    return val1 / val2

正常外部/内部关闭

def wrapper(fn, val1):
    def wrapped(val2):
            return fn(val1, val2)
    return wrapped

f0 = wrapper(callback, i)
f0(0)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in wrapped
  File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero

lambda闭包

f0 = (lambda val1: lambda val2: callback(val1, val2))(i)
f0(0)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
  File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero

现在是functools.partial

f0 = partial(callback, i)
f0(0)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in callback
ZeroDivisionError: integer division or modulo by zero

相关问题 更多 >