2016-07-01 7 views
3

評価された関数から特定の要素にアクセスするには非常に簡単な方法があるはずです。私が達成しようとしているものの非常に単純な例では関数からオブジェクトとタプルにアクセスする

def func(x): 
    a = 2*x 
    b = x*x 
    return 1, 10, 100, (a,b) 

である私は、xの値を定義し、関数は値の集合とタプルを返します。私は(例えば)最初の要素とタプルを取得したいと思います。コード

hello, cello = func(2)[[0,3]] 

エラーを返します。しかし、私はこれらの要素に個別にアクセスできます。

bello = func(2)[3] 

たとえば、

私が使用している機能は評価するのに時間がかかり、2回実行するのは望ましい選択肢ではありません。さらに、可能であれば、私はタプルの個々の要素ごとに変数の山を作成したくありません(たくさん含む)。私はのラインに沿っているソリューションたい本質的には

hello, cello = func(2)[[0,3]] 

hello = 1 
cello = (4,4) 

感謝を

+3

「hello、_、_、cello = func(2)」 – AChampion

+0

あなたが求めているものは本当に理解できません。これは関数とは関係ありません。 '[[0,3]]'は単にPythonでは無効な構文です。関数をそのまま残して '(1、10、100、(2、3)) 'のタプルを扱うと、どちらもうまくいきません。 –

+0

ナンシーアレイでは、 'x [[0,3]]'のようなインデックス付けはできますが、リストやタプルはできません。 – hpaulj

答えて

3

だから、解凍して無視することができます:

hello, _, _, cello = func(2) 

しかし、 Eの結果は、あなたがoperator.itemgetterを使用することができ、より複雑である:

冗長に
from operator import itemgetter 
hello, cello, bello = itemgetter(0, 3, 15)(func(2)) 

以上:

my_results = itemgetter(0, 3, 15) 
hello, cello, bello = my_results(func(2)) 
+0

私は 'itemgetter'が' * args'を取るこ​​とができるか分からなかった。また、辞書やリスト/タプルでもそうすることができます。リストの理解よりもずっと速いのだろうか。私はこれが追加される前に私のPythonのほとんどを学びました(そして 'numpy'はそれを必要としません)。 – hpaulj

+0

'itemgetter'をチェックしました。それはPythonコードです。 'itemgetter([1,2,3])(foo())'は 'obj = foo();と等価です。タプル([1,2,3]の中の[obj [i]) ')。潜在的に便利ですが、速度の向上はありません。 – hpaulj

0

は、標準溶液は、辞書や使用にリターンを詰めることであろう

hello, cello = [func(2)[i] for i in [0,3]] 
+0

しかし、これは 'i'の反復ごとに' func'を実行します。 – hpaulj

+0

'itemgetter'は' func(2) 'が一度だけ評価されるようにこれを書き換えます。 – hpaulj

0

をお試しください結果を分離すること。あなたが自分で_のカウントとコードを保存しているように

は、より読みやすいです

リターン{反復:ITER、結果:RES ....}

エルグ= FUNC(... 。)

そして

エルグ[反復]を使用後に

関連する問題