コールバックを備えたpythonの任意の()関数
-
19-09-2019 - |
質問
Python標準ライブラリはAnを定義します any()
その機能
反復可能な要素がtrueである場合、trueを返します。反復可能が空の場合は、falseを返します。
要素が評価するかどうかのみをチェックします True
. 。私がそれができるようにしたいのは、コールバックを指定して、要素が法案に適合しているかどうかを判断します。
any([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0)
解決
どうですか:
>>> any(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
True
また機能します all()
もちろん:
>>> all(isinstance(e, int) and e > 0 for e in [1,2,'joe'])
False
他のヒント
どれか 条件が真の場合、関数はtrueを返します。
>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 1])
True # Returns True because 1 is greater than 0.
>>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 0])
False # Returns False because not a single condition is True.
実際、の概念 どれか 関数はLISPからもたらされるか、関数プログラミングアプローチから言うことができます。それと正反対の別の関数があります 全て
>>> all(isinstance(e, int) and e > 0 for e in [1, 33, 22])
True # Returns True when all the condition satisfies.
>>> all(isinstance(e, int) and e > 0 for e in [1, 0, 1])
False # Returns False when a single condition fails.
これらの2つの機能は、適切に使用すると非常にクールです。
「ジェネレーター式」、つまり、イテレーターを消費し、フィルターと式を単一行に適用できる言語構造を使用する必要があります。
例えば (i ** 2 for i in xrange(10))
最初の10の自然数(0〜9)の平方の発電機です
また、「if」句が「for」句でitensをフィルタリングすることを許可するため、例では以下を使用できます。
any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)
アントワーヌPの答えのわずかな改善
>>> any(type(e) is int for e in [1,2,'joe'])
True
為に all()
>>> all(type(e) is int for e in [1,2,'joe'])
False
他の人は良いpythonicの答えを与えましたが(ほとんどの場合、受け入れられた答えを使用するだけです)、私はあなたが本当にそれを好むなら、あなた自身のユーティリティ機能を自分で行うのがどれほど簡単かを指摘したかっただけです。
def any_lambda(iterable, function):
return any(function(i) for i in iterable)
In [1]: any_lambda([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0
Out[1]: True
In [2]: any_lambda([-1, '2', 'joe'], lambda e: isinstance(e, int) and e > 0)
Out[2]: False
ただし、Map()やFilter()などの既存の組み込み関数とより密接に一致するため、少なくとも関数パラメーターでそれを定義することはできません。
def any_lambda(function, iterable):
return any(function(i) for i in iterable)
フィルターは機能し、さらに一致する要素を返します
>>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
[1, 2]
の組み合わせを使用できます any
と map
あなたが本当にあなたのラムダの表記をそのように保持したいなら:
any(map(lambda e: isinstance(e, int) and e > 0, [1, 2, 'joe']))
ただし、ジェネレーター式を2回ビルドしないため、ジェネレーター式を使用する方が良いでしょう。
もし、あんたが 本当 これを行うことができる()
>>> any((lambda: isinstance(e, int))() for e in [1,2,'joe'])
True
>>> any((lambda: isinstance(e, int))() for e in ['joe'])
False
名前のないラムダをまとめて、Appendingで各パスで呼び出されることを確認する必要があります。 ()
ここでの利点は、最初のintにヒットしたときに、任意の評価を短絡することを引き受けることができることです