質問は、人気のPythonic関数のすべてについてです。Pythonの 'all'関数が* argsの代わりに配列を受け取るのはなぜですか?
a = True
b = True
print(all([a, b]))
*args
を使用しない理由は?したがって、次のようになります:
a = True
b = True
print(all(a, b))
リストは* argsに引数を渡す機能を持っていると思われます。
質問は、人気のPythonic関数のすべてについてです。Pythonの 'all'関数が* argsの代わりに配列を受け取るのはなぜですか?
a = True
b = True
print(all([a, b]))
*args
を使用しない理由は?したがって、次のようになります:
a = True
b = True
print(all(a, b))
リストは* argsに引数を渡す機能を持っていると思われます。
all
は、既に反復可能な場合です。あなたは二つの個別のブール値を持っている場合、それはand
の仕事です:
print(a and b)
all
もFalse
結果が早く返される可能性のケースでは、入力のマテリアを強制する、またはときでしょう代わりに反復可能なの*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 *
それは私が探している答えです。どうもありがとう。 –
all()
はANYと動作しますので、リストだけでなく、例:
def makeGen():
i = 1
while i <= 10:
yield i
i = i + 1
all(makeGen())
'* args'はジェネレータオブジェクトでも動作するので、この例は誤解を招きます。 'def all2(* args):すべてを返す(args)'だけを試してみてください。 – Markus
それは私の質問にどのように関係していますか? –
ジェネレータのポイントを完全に無意味にする@Markus –
iterablesの各要素をチェックするように設計された関数が引数としてiterableを必要とするのはなぜですか?それはまあまあです。 –
これは配列ではなく、リストです。 – wind85
これは、Pythonで一般的なイディオムであるイテレータまたはiterableオブジェクトを受け取ります。とりわけ、コレクション全体が同時にメモリに常駐する必要はない – tdelaney