对这个嵌套函数感到困惑

时间:2016-12-25 23:18:57

标签: function python-3.x closures nested-function

我正在阅读Python Cookbook第3版,并遇到了2.6“搜索和替换不区分大小写的文本”中讨论的主题,其中作者讨论了嵌套函数,如下所示:

          plain array              stl vector
frame # elapsedtime deltatime   elapsedtime deltatime
0,  0.000000000,    0.000002000,    0.000000000,    0.000002000
1000,   0.001533000,    0.000001000,    0.001551000,    0.000002000
2000,   0.003061000,    0.000002000,    0.003096000,    0.000002000
3000,   0.004589000,    0.000001000,    0.004771000,    0.000002000
4000,   0.006255000,    0.000001000,    0.006433000,    0.000002000
5000,   0.007785000,    0.000002000,    0.007975000,    0.000001000
6000,   0.009326000,    0.000002000,    0.009494000,    0.000001000
7000,   0.010893000,    0.000002000,    0.011012000,    0.000001000
8000,   0.012435000,    0.000002000,    0.012650000,    0.000002000
9000,   0.014024000,    0.000002000,    0.014273000,    0.000001000

如果我有一些如下文字:

def matchcase(word):
  def replace(m):
    text = m.group()
    if text.isupper():
      return word.upper()
    elif text.islower():
      return word.lower()
    elif text[0].isupper():
      return word.capitalize()
    else:
      return word
  return replace

我在前后打印'text'的值,替换正确发生:

text = 'UPPER PYTHON, lower python, Mixed Python'  

最后一个“print”命令显示替换正确发生但我不确定这个嵌套函数如何“获取”:

x = matchcase('snake')
print("Original Text:",text)

print("After regsub:", re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE))

作为需要替换的词:

PYTHON, python, Python

内部函数如何替换它的值'SNAKE, snake, Snake '? 当调用matchcase('m')时,word采用值“snake” 不清楚'snake'的价值是什么。

在这种情况下,任何人都可以帮助我清楚地理解这一点吗?

感谢。

1 个答案:

答案 0 :(得分:0)

当您将函数作为第二个参数传递给re.sub时,根据the documentation

  

为模式的每个非重叠事件调用它。该函数接受一个匹配对象参数,并返回替换字符串。

matchcase()函数本身返回replace()函数,所以当你这样做时:

re.sub('python', matchcase('snake'), text, flags=re.IGNORECASE)

matchcase('snake')返回replace会发生什么,然后作为匹配对象的模式'python'的每个非重叠事件都会传递给replace函数作为m论点。如果这让你感到困惑,请不要担心;这通常令人困惑。

这是一个交互式会话,它具有更简单的嵌套函数,可以使事情变得更加清晰:

In [1]: def foo(outer_arg):
    ...:     def bar(inner_arg):
    ...:         print(outer_arg + inner_arg)
    ...:     return bar
    ...: 

In [2]: f = foo('hello')

In [3]: f('world')
helloworld

所以f = foo('hello')正在为变量f分配一个类似于下面的函数:

def bar(inner_arg):
    print('hello' + inner_arg)
然后可以像f一样调用{p> f('world'),就像调用bar('world')一样。我希望这能让事情更加清晰。