0

モジュールからインポートする場合string、解析関数で使用します。

from string import punctuation


def parsing_func(data):
    if not any(i==v for i in data for v in punctuation.replace('_', '')):
        print data

上記のこの関数でstringのように使用すると、すべて正常に動作します。punctuation

次に、句読点をいくつか減らしてデータをチェックしたいと思いました。だから私はこれに変更parsing_funcしました:

def parsing_func(data):
    punctuation = punctuation.replace('_', '')
    punctuation = punctuation.replace('()', '')
    if not any(i==v for i in data for v in punctuation):
        print data

しかし、これは次を返します:

Traceback (most recent call last):
  File "parser.py", line 58, in <module>
    parsing_func(data)
  File "ex.py", line 8, in parsing_func
    punctuation = punctuation.replace('_', '')
UnboundLocalError: local variable 'punctuation' referenced before assignment

したがって、チェックするテスト関数を作成しますpunctuation

def test_func1():
    print type(punctuation), punctuation

>>> <type 'str'> !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

これは正常に出力され、エラーはなく、表示されますtype strprint最後に、文字列操作を次々とまとめてみます。

def test_func2():
    print type(punctuation), punctuation
    punctuation = punctuation.replace('_', '') 

しかし、printステートメントはエラーを返します。

Traceback (most recent call last):
  File "parser.py", line 9, in <module>
    test_func2()
  File "parser.py", line 5, in test_func2
    print type(punctuation), punctuation
UnboundLocalError: local variable 'punctuation' referenced before assignment

これはエラーですか? 文字列操作の代わりに印刷しようとするとエラーnamespaceが返されるのはなぜですか?test_func2

4

3 に答える 3

1

punctuation2 番目の関数には、ローカルとグローバルの両方がありpunctuationます。名前を変更することもできます:

def parsing_func(data):
    punct = punctuation.replace('_', '')
    punct = punctuation.replace('()', '')

    if not any(i == v for i in data for v in punct):
        print data

または、punctuation明示的にグローバルにします:

def parsing_func(data):
    global punctuation

    punctuation = punctuation.replace('_', '')
    punctuation = punctuation.replace('()', '')

    if not any(i==v for i in data for v in punctuation):
        print data

punctuationこれはグローバルに変更されることに注意してください。

セットでもこれを行うことができます:

def has_punctuation(data):
    punct = set(punctuation) - set('_()')

    return punct & set(data)  # Intersection of the two sets
于 2013-04-20T20:21:52.323 に答える
1

関数内で代入してpunctuationいるため、Python はそれをローカル変数として扱います。したがって、グローバル名はまったく使用しません。割り当てには別の名前を使用してください。

于 2013-04-20T20:21:56.773 に答える
1

punctuationここでの問題は、Python では許可されていないグローバル名 - に割り当てようとしているため、代わりにローカル変数 を作成することですpunctuation。この時点でpunctuation、右側を検索して、まだ存在しないローカル変数を取得しようとします。

これを解決するには、 を使用globalしてグローバル変数を変更するか (これは悪い考えであり、おそらくあなたが望むものではありません)、単にローカル名に割り当てることができます。

def parsing_func(data):
    less_punctuation = punctuation.replace('_', '')
    less_punctuation = less_punctuation.replace('()', '')
    if not any(i in less_punctuation for i in data):
        print data

inまた、メンバーシップを確認するために を使用することも注目に値します。これは、より読みやすく、高速です。一般に、メンバーシップ テストはセットの方が高速であり、セットを使用することで、より読みやすい方法で値を削除することもできます。

def parsing_func(data):
    less_punctuation = set(punctuation) - set("_()")
    if not any(i in less_punctuation for i in data):
        print data
于 2013-04-20T20:21:58.137 に答える