実際の問題については、ジェネレータを使用することをおすすめします。ジェネレータは、通常の関数とは大きく異なる動作をする関数です。これらの違いの1つは、ジェネレータ関数が単一の関数呼び出しのみで複数の結果(1つずつ)を生成できることです。
ジェネレータを作成するには、return
という単語を使用する代わりに、yield
を使用します。 *strings
構文は関数が複数の引数を受け入れることを可能にすることを
a = 'bats bear'
b = 'cats pear'
def sub_string_gen(*strings):
for s in strings:
yield re.sub('\\b.ear\\b', '', s)
a, b = sub_strings(a, b) # generator is "unpacked" here
注:ここでは一例です。これらの引数は関数内で、strings
という名前のリストの下にあります。
上記のコードが動作する理由は、最後の行が自動的に実行されたジェネレータをアンパックすることです。つまり、各結果は一度に1つずつ生成され、対応する提供された名前に一度に1つずつ解凍されます。
は、あなたがこれを行うにしようとしないこと、しかし、注意してください:
a = sub_strings(a) # BAD!
これは、あなたが期待するように動作しません。 a = sub_strings(a)
がないので動作しません発電機;代わりにはジェネレータを作成し、はをa
に割り当てます。発電機は開梱されていない。用語解説:sub_strings
はジェネレータ関数です。 sub_strings(a,b,c)
は、ジェネレータを使用して、ジェネレータ機能を作成します。
が単一の名前に発電機を解凍するには、代わりに次の操作を行います。は a, = sub_strings(a) # Note the comma
余分なコンマではなくシングルトンのシンボルのタプルにa
になります。これにより、ジェネレータを孤立シンボル「a
」に「解凍」することを通訳者に知らせることができます。
私はこの構文がとても好きです。なぜなら、必ずしも見た目が簡単ではないエラーを防ぐからです。たとえば、あなたがsub_strings
ではなく、十分な変数にあまりにも多くの引数を指定した場合、それはあなたにエラーを与えるだろうし、あなたは問題がある知っている:あなたの発電機を使用する
>>> a, b = sub_strings(a, b, c) # extra c argument
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
もう一つの方法は、単に結果を詰め込むことですリストに、反復可能なオブジェクト(発電機は反復可能です)受け入れタプル、または何か他のもの:
>>> results = list(sub_strings(a, b, c, d, e, f))
は、同じことを別の非常に素晴らしい代替構文もあります。ここで私達は星を再び見る(それは "吹奏"と呼ばれる人もいる)。あなたも発電機を作るための関数を定義する必要はありません。最後に
>>> results = [*sub_strings(a, b, c, d, e, f)]
:スプラットは前にそれが自動的に解凍したとほぼ同じ、一度ジェネレータつの値を「アンパック」。代わりにgenerator expressionと呼ばれるものを使用することもできます。
>>> a, b = (re.sub('\\b.ear\\b', '', s) for s in (a, b))
あなたは私たちが上に私たちの発電機を使用する場所のいずれかで、このような表現を使用することができます。
>>> results = list((re.sub('\\b.ear\\b', '', s) for s in (a, b)))
>>> results = [*(re.sub('\\b.ear\\b', '', s) for s in (a, b))]