2016-12-25 56 views
1

我读了Python食谱第三版和跨在2.6中讨论的话题来了“搜索和替换不区分大小写的文本”,其中作者讨论嵌套函数,象下面这样:困惑这个嵌套函数

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 = 'UPPER PYTHON, lower python, Mixed Python' 

和我之前和之后打印“文本”的价值,替代正确执行:

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

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

最后的“打印”命令显示替代正常情况发生,但我不知道该嵌套函数如何“获得”了:

SNAKE, snake, Snake 

PYTHON, python, Python 

如需要的话与被取代

内部函数如何取代其值'm'?
当调用matchcase('snake')时,单词取值'snake'。
不清楚'm'的价值是什么。

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

感谢。

回答

0

当传递函数作为第二个参数,以re.sub,根据the documentation

它被称为为每个非重叠发生模式的。该函数采用单个匹配对象参数,并返回替换字符串。

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

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

什么情况是,matchcase('snake')回报replace,然后将模式'python'的每个非重叠发生的匹配对象作为m参数传递给replace函数。如果这让你感到困惑,不要担心;它通常是令人困惑的。

下面是一个简单得多的嵌套功能的交互式会话,应该让事情更清晰:

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然后可以像这样调用f('world'),这就像调用bar('world')一样。我希望这会让事情更清楚。