web-dev-qa-db-ja.com

foo = filter(...)がリストではなく<filter object>を返すのはなぜですか?

Python IDLE 3.5.0シェルでの作業。組み込みの「フィルター」関数の私の理解から、それはあなたがそれに渡すものに応じて、リスト、タプル、または文字列のいずれかを返します。したがって、なぜ以下の最初の割り当ては機能するが、2番目の割り当ては機能しないのか( '>>>' sは単なる対話型のPythonプロンプト)

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

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

フィルタは、関数とそれが反復できるものを取得することを期待しています。関数は、イテラブルの各要素に対してTrueまたはFalseを返す必要があります。あなたの特定の例では、あなたがやろうとしていることは次のようなものです:

In [47]: def greetings(x):
   ....:     return x == "hello"
   ....:

In [48]: filter(greetings, ["hello", "goodbye"])
Out[48]: ['hello']

Python 3では、list(filter(greetings, ["hello", "goodbye"]))を使用してこの同じ結果を得ることが必要な場合があることに注意してください。

6
Randy

Python 3での動作を理解するには、filterのこのサンプル実装を参照してください。

def my_filter(function, iterable):
    """my_filter(function or None, iterable) --> filter object

    Return an iterator yielding those items of iterable for which function(item)
    is true. If function is None, return the items that are true."""
    if function is None:
        return (item for item in iterable if item)
    return (item for item in iterable if function(item))

以下は、filterまたはmy_filterジェネレーターの使用例です。

>>> greetings = {'hello'}
>>> spoken = my_filter(greetings.__contains__, ('hello', 'goodbye'))
>>> print('\n'.join(spoken))
hello
2
Noctis Skytower

ドキュメントから

filter(function, iterable)[item for item in iterable if function(item)]と同等であることに注意してください

Python3では、リストを返すのではなく、フィルター、マップは反復可能を返します。あなたの試みはpython2では動作するはずですが、python3では動作しません

明らかに、フィルターオブジェクトを取得し、それをリストにします。

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

< filter object >を返す理由は、フィルターが組み込み関数ではなくクラスだからです。

help(filter)次を取得します:モジュール組み込みのクラスフィルターのヘルプ:

class filter(object)
 |  filter(function or None, iterable) --> filter object
 |  
 |  Return an iterator yielding those items of iterable for which function(item)
 |  is true. If function is None, return the items that are true.
 |  
 |  Methods defined here:
 |  
 |  __getattribute__(self, name, /)
 |      Return getattr(self, name).
 |  
 |  __iter__(self, /)
 |      Implement iter(self).
 |  
 |  __new__(*args, **kwargs) from builtins.type
 |      Create and return a new object.  See help(type) for accurate signature.
 |  
 |  __next__(self, /)
 |      Implement next(self).
 |  
 |  __reduce__(...)
 |      Return state information for pickling.
0
JordanChina