2017-11-30 11 views
3

私はNorvig's BASIC interpreter implemented in Pythonを使って作業しています。リストの理解の中で 'if'を使用する

私には関係のないようなコードがありますが、この男は私のレベルを100レベル上回っているようですので、何か不必要な文章を書くのではなく、理解できない可能性が高くなります。

def lines(text): 
    "A list of the non-empty lines in a text." 
    return [line for line in text.splitlines() if line] 
    #return [zaa for zaa in text.splitlines()] 

リスト内包 - なぜそれがif lineで終了していますか?

代わりに[zaa for zaa in text.splitlines()]を使用してその句を削除した場合でも、テキストまたは空白行を渡すと関数が機能すると思います。

foo ="""mike\nnew\nbar""" 
bar ="\n\n" 
print lines(foo) 
print lines(bar) 
what = lines(bar) 
print(type(what)) 

['mike', 'new', 'bar'] 
[] 
<type 'list'> 

私は何かmisundersatndingしなければならない - そのif lineをしても評価されたときに、私は理解できない、ましてや適切に入力を処理中にその必要性を。

編集:

bar ="""one 
two 
three 

five 

seven""" 
#bar = "" 
print lines(bar) 

['one', 'two', 'three', '', 'five', '', 'seven'] 

それはリストのメンバーとして、これら2つの空の文字列が含まれていますif lineの欠如は悪い結果が得られます例を見つけました。

+1

空でない要素をフィルタ処理します。 –

+1

ifを満たす要素のみがリストに入れられます。これは、任意の解説チュートリアルでカバーする必要があります。 – Carcigenicate

+0

@Carcigenicate 'ifライン'が実際の状態を持つようには見えないので、彼らは混乱していると思います。この混乱の原因は「真実」の価値です。私はあなたがこれを読むことをお勧めします:https://docs.python.org/2.4/lib/truth.htmlこれは理解しやすく、簡単です 'truthy'値は非常に便利です –

答えて

8

if lineは、「truey」の値をチェックしています。この値は、チェックするとFalseまたはTrueと判定された文字です。たとえば、空の文字列''は、空リスト([])、辞書({})、タプル(())、0、およびNoneと共に、Falseとみなされます。

return [line for line in text.splitlines() if line != ''] 
2

短い答え:それフィルタアウト空の文字列結果のうちを基本的に、if lineは短いバージョンです。 Pythonのリスト内包で

の形式は:

<filters-and-iterators>は、一連のある
[<expr> for <vars> in <iterable> <filters-and-iterators>] 

:フォームfor <vars> in <iterable>

  1. イテレータ。
  2. if <expr>の形式のとなる。

Pythonはtruthinessにのを評価します。式が真実Trueの場合にのみ、その要素を渡します。最後のステップであれば、それはリストに追加されます。フィルタが最後のステップでない場合は、さらに処理します(たとえば、次のイテレータまたはフィルタを処理するなど)。それ以外の場合、その項目は無視されます。INGの

strtruthiness文字列は、少なくとも一つの文字が含まれている場合にのみ場合Trueを持っています。つまり、ここでは、空でない文字列を除外します。

マジック関数__bool__をオーバーライドすることでカスタムクラスの真実性を実現することができます。もし見つからない場合は、__len__がゼロ以外の値を返すかどうかを調べます。

NoneFalse常にtruthiness Falseを持って、Trueはtruthiness True、リストのようなコレクション、セット、辞書、タプルや文字列があればtruthiness Trueを持っており、これらは、少なくとも一つの要素が含まれている場合にのみ持っています。数値が真でない場合は、真理値Trueを持ちます(負の数値は真実度がTrueなので)。

プログラマは、(上記のように)カスタムクラス自体に対して真実性を実装することは自由ですが、ここでの例を考慮に入れて、空でないことをコレクションの正当性と考えるのは良い考えです。

関連する問題