2013-04-11 12 views
14

この質問は楽しいことです。私はその答えが役に立つとは思わない。Pythonに `and`や` or`の組み込み関数版がありますか?

私はreduce()でPythonで作業する人を見ると、しばしばoperatorモジュールからPythonの組み込み関数を利用することがよくあります。

これは動作します:

result = reduce(lambda a, b: a + b, range(5)) 

しかし、通常、あなたがこの参照になります。私には奇妙な何

from operator import add 
result = reduce(add, range(5)) 

operatorモジュールは、論理andする機能を持っているようには見えないということです。それはビット単位でのを持っていますが、論理的ではありませんandです。

ですから、これをやっているとします

result = reduce(lambda a, b: a and b, range(1, 6)) 

は、ここで使用することができ、組み込み関数はありますか?

orを置き換えることができる組み込み関数があるかどうかは疑問です。

あなたが最初のブール値に引数をマッピングする場合は、ビット単位を使用してoperatorから、あるいは単に直接そうように、bool.__and__を使用することができます。or操作のためのoperator.or_()またはbool.__or__

from operator import and_ 
result = reduce(and_, map(bool, range(1, 6))) 
result = reduce(bool.__and__, map(bool, range(1, 6))) 

と同様に。しかし、私はブール値にマップされた値を必要としない関数を探しています。

値がすべて整数であることが分かっていた場合はandにはoperator.mulorにはoperator.addを使用できます。これは粗雑なハックであり、私はこの答えを望まない...特に、多数の数字に遭遇し、どれもゼロでなかったら、乗算がどれほど高価であるかを考慮して!

注:私にはall()any()がありますが、これはreduce()の使用に適しています。私がトップで言ったように、私はこれを楽しみにしています。

注:すべての値をboolに強制するという副作用がある関数は、受け入れられる回答になります。

x = 3 and 5 # sets x to 5, not to True 

をしかし、この質問の目的のために、私は論理的andまたはor操作を行うためにreduce()と連携できる機能で、単に興味があります:ビルトインandキーワードはこれを行いません。

+1

でその仕事を作る方法見当がつかない'aとb'と' aとb'の 'all((a、b))'のようになります。もちろん、次にタプルを作る必要があります。短絡はありません。 – kindall

+1

'x = 3と5'は' x'を '5'に設定しますが、それをブール値にキャストすることもできますそれを使わない?ポイントは、 'x'を評価しようとする論理式が何であれ、ブール値として解釈されるということです。 – whatyouhide

+1

@steveha素敵な質問です。私はあなたが答えを得ることを願っていますが、あなたが答えの中のすべての選択肢を既に通り抜けたように思えます – jamylak

答えて

6

私はオペレータモジュールにはandorが、それは短絡形で関数の引数を評価することは不可能だということですありません、なぜ実際の理由を推測 - これはブール演算子の全体点です。あなたの質問への答えはいいえ、and/orを模倣することはできませんし、それを書くことも可能です。発電機に適用さ

all/any

def gen(): 
    yield 1 
    yield this_wont_be_evaluated 

print any(gen()) 

同様

短絡されているが、私は、実行時の引数あなたは `任意の((b)参照)を使用でき

+0

Aha!これが答えです。 –

+2

私は短絡が単に論理的な演算子の有用な特性であり、 "全体の点"ではないと考えました。 –

+3

これは正確に質問された質問に対する答えです。これらの関数を定義することはできないため、演算子モジュールには 'and'関数と' or'関数はありません。近くにあるが同じではない機能を持つことは、単に誤解を招くことになります。 –

0

注:すべての値を ブールに強制するという副作用がある関数は、受け入れられる回答になります。ビルトインとキーワードが この

を行いませんが、内蔵のnotキーワードはありません。

もちろんの
In : not 255 
Out: False 

In : not 0 
Out: True 

、あなたがして、後方あなたのロジックを取得する必要があります:

In : not (not 5 and not 0) # mimics: 5 or 0 
Out: True 

ので、これであなたはreduce経由all()map、およびoperator.*をエミュレートすることができます

In : not reduce(operator.or_,map(operator.not_,[1,2,3,4,5])) # mimics all(1,2,3,4,5) 
Out: True 

In : not reduce(operator.or_,map(operator.not_,[1,2,3,0,5])) # mimics all(1,2,3,0,5) 
Out: False 

は、あなたが達成したいと思っているものですか?私たちはもっと近づくことができないのではないかと心配しています。

+0

私は 'reduce()'文で上記のどれを使うことができるのか分かりません。私は呼び出し可能なものが必要です。もし私が 'lambda'を書く必要があるのであれば、' lambda'を書くだけで引数に 'and'または' or'を呼び出します。 – steveha

+0

'map()'を許可する場合、ラムダは必要ありません。編集を参照してください。 – ch3ka

+0

値をブール値にマップするには、「not」を使用することをお勧めしますが、ロジックを反転する必要があることに注意してください。論理を反転させる必要がないので、ブール値に値をマップするために 'bool()'を使うほうが簡単だろう。元の質問の例は、「引数をブール値に最初にマッピングする場合」のテキストから始まります。 – steveha

1

これは私が知っている内蔵機能はありません。ただし、事業者を包み込む些細な関数を定義することができます。

>>> def newand(a,b): 
... return a and b 
... 
>>> def newor(a,b): 
... return a or b 
... 
>>> reduce(newand, map(bool, range(5))) # Will return False, because bool(0) == False 
False 
>>> reduce(newand, map(bool, range(1,5))) # Now 0 is excluded 
True 
+0

これは 'lambda 'と同じですが、尋ねられたように組み込み関数ではありません – jamylak

+1

私の答えと他のものの両方にも答えがありました。つまりそれらは存在しません。私は彼らがそれの一部でなければならないと感じているので、私もちょっとバグだ。残念ながら、Pythonは完璧ではありません。これは、 'and'、' or'、 'not'は特別な条件付きの構造体であり、通常の演算子より' if'に近いため、それらを過負荷にする、別の悲しい事実)。 –

+0

@StjepanBakrac:なぜ '__bool__'と違う方法で'と 'や'や 'をオーバーロードしたいのですか? –

関連する問題