1. ホーム
  2. python

[解決済み] foo = filter(...) がリストではなく <filter object> を返すのはなぜですか?重複

2023-05-29 09:46:24

質問

Python IDLE 3.5.0シェルで作業しています。私の理解では、組み込みの "filter" 関数は、あなたがそれに渡すものに応じて、リスト、タプル、または文字列のいずれかを返します。では、なぜ以下の最初の代入はうまくいき、2番目の代入はうまくいかないのでしょうか (「>>> 」は Python の対話型プロンプトです)。

>>> def greetings():
    return "hello"

>>> hesaid = greetings()
>>> print(hesaid)
hello
>>> 
>>> shesaid = filter(greetings(), ["hello", "goodbye"])
>>> print(shesaid)
<filter object at 0x02B8E410>

どのように解決するのですか?

の python ドキュメントを見てください。 filter(function, iterable) (以下 ここで ):

の要素からイテレータを構成します。 イテラブル の要素で 関数 は真を返します。

つまり、リストを返すためには、リストクラスを使う必要があるのです。

shesaid = list(filter(greetings(), ["hello", "goodbye"]))

の結果を呼び出そうとしているので、これはおそらくあなたが望んだことではありません。 greetings() の結果を呼び出そうとするからで、それは "hello" であり、入力リストの値ではうまくいきません。ここでもイテレータの型が関係します。なぜなら、結果は使うまで生成されないからです(たとえば list() を呼び出すなどして)。そのため、最初はエラーが発生しませんが、何かしようとすると shesaid を使って何かしようとすると、動かなくなります。

>>> print(list(shesaid))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable


リストのどの要素が "hello" と等しいかをチェックしたい場合は、次のようなものを使用する必要があります。

shesaid = list(filter(lambda x: x == "hello", ["hello", "goodbye"]))

(私はあなたの関数をラムダに入れました。quot;通常の関数についてはRandy Cの答えを参照してください)