0

私はPythonのリストの理解を学んでいて、使用法を見ていて、正式な文書で説明を見つけることができませんでした。私は、このように抽象この使用しようとしていますPython 'と/または'は式で何を意味し、 `(not i%2)`は何をテストしますか?

>>>[(not i%2)*'a' or str(i) for i in range(10)] 
>>>['a', '1', 'a', '3', 'a', '5', 'a', '7', 'a', '9'] 

[statement1 or statement2 for i in range(10)] 

と文1がfalseと評価された場合、その文2を使用し、私は右ですか?

また、私は、次のコマンドを実行した場合ことを発見:

>>> [(not i%2)*'a' and str(i) for i in range(10)] 

を出力は次のようになります。

>>> ['0', '', '2', '', '4', '', '6', '', '8', ''] 

私はこれらを理解する必要がありますどのように?

+0

これは次のとおりです。

>>> 'LH' or 'RH' 'LH' >>> '' or 'RH' 'RH' 

それは読みやすくなるためより良い条件式として述べられていますほぼ確実に既存のQ&Aと重複しています。 – smci

+0

'(not i%2)'は整数が奇数かどうかを調べるためのイディオムです。そこには少なくとも6つの既存の質問があります。より明確にするために、述語関数 'is_odd(n)'を宣言します。 – smci

+0

'true_valueとcondまたはfalse_value'は古い[Pythonの2.5より前の三項演算子(?またはifelse)を実装するためのイディオムです](https://stackoverflow.com/questions/394809/does-python-have-a-三項条件付き演算子)。 [新しい慣用句は 'true_value if else else false_value'](http://stackoverflow.com/a/394814/202229)です。これはリストの理解にあるのか他のところにあるのかは関係ありません。とにかく、これまでに何度も尋ねられてきました。また、["Pythonの条件演算子 'else else' not equal 'and' '](https://stackoverflow.com/questions/33780600/python-conditional-operator-if-else-not-equal-and-or) – smci

答えて

2

そうです。 iが奇数である場合、これは 'A' と評価さ

(不I%2)* ''

;奇妙な部分は最初の式でありますたとえそうであれば、それは偽です。これは、Pythonでブール型定義の暴力的な乱用(a.k.a. expert trick)です。

と真の場合を1とし、を偽とすると意味があります。製品が0の場合、またはの演算子はとなります。 またはの左の要素が、右1が全く評価されないであれば、その左の要素は、式の値になります:

これはまた、発現短絡を利用しています。

同様に、あなたの後の例では、短絡は、他の方法で動作します:左の要素は、で、それが結果になった場合。それ以外の場合は、正しい要素が結果になります。

+0

"そうでなければ、正しい要素が結果になります。" この場合、結果として正しい要素のみを取るのはなぜですか? –

+0

George Booleは** Trueとx ** ** ** ** ** ** ** ** **である必要があります。同様に、** Falseまたはx **はすべての** x **に対して** x **でなければなりません。 – Prune

0

ここでは、評価できる最初の値をTrueとして返します。 したがって、最初のステートメントの戻り値がTrueとして評価される場合は、それを使用するか、次の値を検索してください。 さらに追加してください「または」

[(not i%3)*'a' or (not i%5)*'b' or 'c' for i in range(10)] 
=> ['a', 'c', 'c', 'a', 'c', 'b', 'a', 'c', 'c', 'a'] 

、すべての値は、文が説明True

0

に評価できる場合にのみ、最後の値を返します。

not i%2i % 2でものため0と評価さ奇数の整数の場合は1です。 notは、次の式を否定するブール値になります。 not 1 =>Falseおよびnot 0 =>Trueです。

(True)*'a' =>1 * 'a' =>'a'

(False)*'a' =>0 * 'a' => boolean型にキャストする場合、False

False or str(i) =>str(i)

0

かのように評価され

''''、それをタプルのリストに変換します(bot H条件)が含まれ、起こっているかを確認することが容易である。

>>> [((not i%2)*'a', str(i)) for i in range(10)] 
[('a', '0'), ('', '1'), ('a', '2'), ('', '3'), ('a', '4'), ('', '5'), ('a', '6'), ('', '7'), ('a', '8'), ('', '9')] 

Iの任意の奇数の値がPythonの意味でFalseある''を生成します。 orは、右辺を評価して返すことはなく、左側より:

>>> ['a' if i%2==0 else str(i) for i in range(10)] 
['a', '1', 'a', '3', 'a', '5', 'a', '7', 'a', '9'] 
関連する問題