2016-10-20 8 views
1

要素がある場合はiterateをコンパクトにする方法がありますか?"要素があればiterate iterable、そうでなければ..."のような構造体がありますか?

私の "問題"はPythonにありますが、他の言語にも興味があります。現在

Iは、第一の要素の数をテスト:

In [1]: l=[] 

In [2]: if l: 
    ...:  for e in l: 
    ...:   print(e) 
    ...: else: 
    ...:  print("else") 
    ...: 
else 

for statement has an else

In [2]: for e in []: 
    ...:  print(e) 
    ...: else: 
    ...:  print("else") 
    ...: 
else 

その "スイート" の反復が完了すると(ブロック)も実行される:

In [1]: for e in [1,2,3]: 
    ...:  print(e) 
    ...: else: 
    ...:  print("else") 
    ...: 
1 
2 
3 
else 

ここではあまり得られないことが分かります(1行とインデントレベル)が、私はこのようなものがあれば好奇心が強い。

+2

ほとんどの場合、長さをテストして早期に終了することがほとんどです。「そうでなければ、#空の場合、戻ります。 –

+0

編集前に指摘した問題を再確認する最初の例でテスト出力を含めました。 – handle

+1

* "私は他の言語にも興味があります" * - これには大きく異なるアプローチがありますさまざまな言語で、ここでそれらすべてについて話すのは多分範囲外です。 – deceze

答えて

4

長さと終了のためのあなただけのテスト初期のほとんどの時間:任意のレートで

if not l: 
    # empty case 
    return # or raise exception 

、反復は空のリストに行わを取ることはありませんので、次も十分であり、何のelseは必要ありません:

if not l: 
    # empty case 
for i in l: 
    # only ever executed if there are any elements 

for ... elseスイートは出口が早期にそのループに対してのみ有効です。 elseスイートは、が完了したすべてのループに対して実行されます。です。 breakが使用された場合、elseはスキップされます。これにより、空のシーケンスを検出するのには不向きです。breakステートメントがないと、要素の数に関係なく、それらの繰り返しが正常に完了するためです。

+0

あまりにも明白な:-) – handle

0

あなたが他の言語を求めるのでパラダイムは、Pythonに十分に接近していることから、ここではSqueakの/ファーロSmalltalkのは、次のとおりです。

あなたのような何かを記述します。

aCollection 
    ifEmpty: [Transcript cr; show: 'else'] 
    ifNotEmpty: [aCollection do: [:each | Transcript cr; show: each printString]]. 

あなたが同様に作成することができますコレクション内の新しい方法:

ifNotEmptyDo: aBlock elseDo: elseBlock 
    self isEmpty ifTrue: [^elseBlock value]. 
    ^self do: aBlock 

次に、このようにそれを使用します。

0123おそらく怠惰や無限コレクションの異端であるのisEmptyがデフォルトで ^self size = 0として定義されていることを

ノート、...だから私はこの新しい定義を提案:ちょうどそのテストの空要素を基底を見るために

isEmpty 
    self do: [:each |^false]. 
    ^true 

をまたは実行しますループは多かれ少なかれ同じタスクです)

結論では、構文トレンドが非常に低いです。
ブロッククロージャは、異なる評価、条件付き評価、または繰り返し評価を有効にします。
したがって、ブランチやループ、これらの組み合わせなどのすべての構文は、ブロッククロージャをパラメータとして使用する通常のメッセージに過ぎず、自由に独自の構文を追加できます。
この施設は、非常に小さな付加価値のために過剰選択セレクターで濫用されることが多いので、新しいコンストラクトの必要性は、常にメンテナンスコストとバランスを取るべきです(新規の方法を実装、テスト、 )。 「小は綺麗です」と覚えておきましょう。

関連する問題