2016-06-15 9 views
0

質問は、人気のPythonic関数のすべてについてです。Pythonの 'all'関数が* argsの代わりに配列を受け取るのはなぜですか?

a = True 
b = True 
print(all([a, b])) 

*argsを使用しない理由は?したがって、次のようになります:

a = True 
b = True 
print(all(a, b)) 

リストは* argsに引数を渡す機能を持っていると思われます。

+4

iterablesの各要素をチェックするように設計された関数が引数としてiterableを必要とするのはなぜですか?それはまあまあです。 –

+1

これは配列ではなく、リストです。 – wind85

+0

これは、Pythonで一般的なイディオムであるイテレータまたはiterableオブジェクトを受け取ります。とりわけ、コレクション全体が同時にメモリに常駐する必要はない – tdelaney

答えて

3

allは、既に反復可能な場合です。あなたは二つの個別のブール値を持っている場合、それはandの仕事です:

print(a and b) 

allFalse結果が早く返される可能性のケースでは、入力のマテリアを強制する、またはときでしょう代わりに反復可能なの*argsを取る作ります入力iterableには要素が多すぎるため、すべてをメモリに保持できません。

from itertools import repeat 

def starargs_all(*booleans): 
    return all(booleans) 

print(all(repeat(False, 10**10))) # prints immediately 
print(starargs_all(*repeat(False, 10**10))) # takes a while, uses lots of memory, awkward * 
+0

それは私が探している答えです。どうもありがとう。 –

0

all()ANYと動作しますので、リストだけでなく、例:

def makeGen(): 
    i = 1 
    while i <= 10: 
     yield i 
     i = i + 1 

all(makeGen()) 
+0

'* args'はジェネレータオブジェクトでも動作するので、この例は誤解を招きます。 'def all2(* args):すべてを返す(args)'だけを試してみてください。 – Markus

+0

それは私の質問にどのように関係していますか? –

+0

ジェネレータのポイントを完全に無意味にする@Markus –

関連する問題