1

私はPythonで小さな一連のスクリプトに取り組んでおり、これにたどり着きました:

line = "a b c d e f g"
a, b, c, d, e, f, g = line.split()

これらは実装中に行われる決定であるという事実を十分に認識していますが、python は次のようなものを提供すべきではありません (または提供します)。

_, _, var_needed, _, _, another_var_needed, _ = line.split()

Prolog が提供するのと同様に、有名なsingleton variables.

よくわかりませんが、不要な割り当てを避けることはできませんか? または、split呼び出しの結果への参照を作成しても、オーバーヘッドとしてカウントされませんか?

編集:

申し訳ありませんが、ここでの私のポイントは次のとおりです。プロローグでは、私に関する限り、次のような表現で:

test(L, N) :-
    test(L, 0, N).
test([], N, N).
test([_|T], M, N) :-
    V is M + 1,
    test(T, V, N).

_リストに存在する値への参照が作成されていないと思われるため、によって表される変数にはアクセスでき[_|T]ません。

しかし、Python では、 を使用する_と、 に最後に割り当てられた値を使用できます。_また、変数ごとに割り当てが行われると思いますが、_これはオーバーヘッドと見なされる可能性があります。

ここでの私の質問は、そのような不必要な属性を回避するための構文があってはならないかどうか (またはある場合) です。

4

3 に答える 3

7

_は完全に有効な変数名です。はい、アンパック操作で変数を複数回使用できるため、記述した内容が機能します。_行で最後に割り当てられた値になります。一部の Python プログラマーは、この方法で使用しています。

_一部の Python 対話型シェルで特別な目的で使用され、一部の読者を混乱させる可能性があるため、一部のプログラマーはこの理由でそれを使用しません。

で割り当てを回避する方法はありませんstr.split()。常に行全体を分割し、結果の文字列が常に割り当てられます。この場合、それらのいくつかはあまり長生きしないというだけです。しかし、もう一度、誰がしますか?

たとえば、次のようにして、いくつかの割り当てを回避できます。re.finditer()

import re

fi = re.finditer(r"\S+", line)
next(fi)
next(fi)
var_needed = next(fi).group()
next(fi)
next(fi)
another_var_needed = next(fi).group()
# we don't care about the last match so we don't ask for it

ただしnext()、オブジェクトを返すMatchため、割り当てられます (どこにも保存していないため、すぐに破棄されます)。したがって、実際には最終割り当てのみを保存します。文字列が長い場合、文字列ではMatchなくオブジェクトを取得しているという事実により、メモリと時間を節約できると思います。一致した文字列は、要求されるまでソース文字列から切り出されないと思います。確実にプロファイリングできます。

上記を、文字列から目的のトークンのみを返す関数に一般化することもできます。

import re

def get_tokens(text, *toknums):
    toknums = set(toknums)
    maxtok = max(toknums)
    for i, m in enumerate(re.finditer(r"\S", text)):
        if i in toknums:
            yield m.group()
        elif i > maxtok:
            break

var1, var2 = get_tokens("a b c d e f g", 2, 5)

しかし、それはまだ完全にきれいではありません。

于 2012-12-19T22:11:26.677 に答える
3

実際、_は Python で有効な識別子であり、再び必要とされない値を受け入れるためにこれを使用することがよくあります。そのため、コードはすでに優れた Python です。

Python には_、Prolog の に正確に対応する構文はありません。Python で使用する場合_、値への参照を実際に保持するのは実際の変数です。

とはいえ、Python プログラムを実行すると、非常に多くのオブジェクトが割り当てられ、割り当てが解除されます。あなたが示したようにいくつかの場所を制御できたとしても、それはバケツのドロップであり、プログラムのリソース使用に問題になるほど影響しません.

于 2012-12-19T22:11:52.067 に答える
2

構文に関する限り

_, _, var_needed, _, _, another_var_needed, _ = line.split()

有効な python です。少し変わっていますが、それは慣用的でさえあると思います。

于 2012-12-19T22:10:58.123 に答える