2

関数内で定義されている関数から関数のローカル変数にアクセスする方法はありますか? Y は文字列を含むタプルであり、y の次の項目を使用して次の呼び出しを行うために、条件が満たされたときにキャップがどのようなものになるかを変更したくありません。組み込み関数グローバルを使用しようとしましたが、それはグローバルに対してのみ機能すると思います。

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

nonlocalPython 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 に答える