2009-08-28 8 views
0

私は、なぜPythonのextend/appendメソッドが結果リストへの参照を返さないのか疑問に思っています。 最後の要素をリストのすべての組み合わせの文字列を構築するために、私はシンプル書きたい:Pythonリストのスライスを改良する

for i in range(l, 0, -1): 
    yield " ".join(src[0:i-1].append(src[-1])) 

しかし、私は持っている:TypeErrorを。中間変数を持つ代わりに、次のコードが使用されている:

for i in range(l, 0, -1): 
     sub = src[0:i-1] 
     sub.append(src[-1]) 
     yield " ".join(sub) 

は私を修正して、私が間違って

答えて

7

フム、多分置き換える:

src[0:i-1].append(src[-1]) 

をして:ここで

def append_and_return(li, x): 
    """silly example""" 
    return (li.append(x) or li) 

src[0:i-1] + src[-1:] #note the trailing ":", we want a list not an element 
1

だ場合の一般的な理由はlistがその場で修正されていることを示しするNoneでの戻り値の型ということですしてください。

+0

はい。私はこれを理解していますが、質問は結合リストを処理するためのより短い方法です。 c/C++では、演算子 "、"を使用して、結果が計算される前に複数の演算を実行することができます。代わりにPythonは何を提供していますか? – Dewfy

0
for i in range(l-1, 0, -1): 
    yield ' '.join(src[:i] + src[-1:]) 

となります。

拡張/追加メソッドは、リストを所定の位置に修正するため、リストを返さない。

+0

私はエラーがあると思う - "+"演算子は2つのリストを結合し、リストに要素を追加しません。 –

+0

また、 "TypeError"が発生する – Dewfy

+0

ええ、あなたがコメントを投稿する前に修正されました。 – SilentGhost

-1

リスト上で動作し、それを返すには、あなたがor建設を使用することができますX or YはXを評価し、Xが真であればXを返し、そうでなければ評価してYを返します。 Xは常に負である必要があります。

ただし、一時的なリストでしか動作していない場合は、すでに提案されている連結操作と同じかそれ以上の効果があります。

編集:それはPythonで変異の方法は、彼らが変異してきたオブジェクトへの参照を返さない理由は、Command-Query Separation原則(略してCQS)で見つけることができ

>>> li = [1, 2, 3] 
>>> newli = append_and_return(li, 10) 
>>> li 
[1, 2, 3, 10] 
>>> newli is li 
True 
+0

appendは常に 'None'を返します。コードはむしろ無駄です。 – SilentGhost

+0

確かに、あなたがコードを変更すると*役に立たない*になります。 – SilentGhost

+0

SilentGhost、停止してください。私はコードを変更しなかった、私は思考を作ったので私のコメントを変更しました。それはXが常に真でなければならないと言いましたが、私はここでXは常に偽でなければならないということです(Yを返すので)。コードは変更されませんでした。 – u0b34a0f6ae

8

無価値ではありません。 Pythonは、MeyerのEiffel言語ほど徹底的にCQSを適用していません(PythonのZenによるとimport thisのように "実用性は純度を上回ります")。例えばsomelist.pop()はちょうどポップされた要素を返しますちょうど突然変異していた;-)、エッフェルでポップしている間、スタックには戻り値がありません(通常、トップエレメントをポップして使用する必要があります。トップを離れるようにする "コマンド")。

CQSの深い動機付けは、実際には「ミューテータは何も役に立たない」というよりも、むしろ「クエリは副作用がない」ということです。 (厳密に言えば、「ルールよりもガイドラインのほうが大きい」)、それを覚えておいてほしいと思っていますし、ある程度うまくいく(偶発的なエラーが発生する)あなたはスムーズに流れる "表現とステートメントは同じものです"という言葉に慣れています。

PythonのCQS(広義には...)のもう一つの側面は、文と表現の区別です。繰り返しますが、これは厳密には適用されていません。ステートメントはどこでも使用できます。誰かが関数を呼び出すことを忘れたときは、foo()が必要です。ただfoo ;-)ではありません。しかし、例えば、CやPerlなどとはまったく違って、同じテスト(if(a=foo())...)で何かを割り当てるのは簡単ではありませんが、ときどき不便ですが、他の種類の偶発的なエラーが発生します。

関連する問題