2

有没有办法从所述函数中定义的函数访问函数的局部变量?Y 是一个带有字符串的元组,我希望满足条件时的任何大写字母在下一次调用时与 y 中的下一个项目保持相同。我尝试使用内置函数 global,但我想这仅适用于全局。

def cap_sentence(y):  
    caps = "on"  
    def func(x):  
        if caps == "on"
            caps = "off"
            return x.capitalize()
        elif "." in x:
            caps = "on"
    return tuple(map(func, y))
4

2 回答 2

7

nonlocal在 Python 3.x 中使用:

def cap_sentence(y):  
    caps = "on"  

    def func(x):  
        nonlocal caps 
        if caps == "on":
            caps = "off"
            return x.capitalize()
        elif "." in x:
            caps = "on"

    return tuple(map(func, y))

在 python 2.7 中:

def cap_sentence(y):  
    cap_sentence.caps = "on"  

    def func(x):  
        if cap_sentence.caps == "on":
            cap_sentence.caps = "off"
            return x.capitalize()
        elif "." in x:
            cap_sentence.caps = "on"

    return tuple(map(func, y))
于 2012-07-05T11:08:51.713 回答
0

虽然 usingnonlocal是您问题的直接答案,但我鼓励您考虑在此处使用可调用类。这避免了每次cap_sentence调用时都重新定义一个函数,并且它以一种更明显的方式处理状态(无论如何对我来说)。我冒昧地在最后添加了一个 return 语句,这样你就不会得到一串值None

class _CapSentence(object):
    def __init__(self):
        self.caps = 'on'
    def capitalize(self, x):
        if self.caps == 'on':
            self.caps = 'off'
            return x.capitalize()
        elif '.' in x:
            self.caps = 'on'
        return x
    def __call__(self, y):
        return tuple(map(self.capitalize, y))

cap_sentence = _CapSentence()

print cap_sentence("my feet are cold. my toes are sandwiches.".split())

# output: ('My', 'feet', 'are', 'cold.', 'My', 'toes', 'are', 'sandwiches.')
于 2012-07-05T12:02:28.767 回答