Un mémo lorsque vous vous inquiétez du fonctionnement du filtre de fonction intégré
Je pensais que le filtre est une fonction de grande hauteur et prend une fonction comme argument, mais apparemment, il peut prendre None comme argument.
>>> a = [0,1,1.1,'a',None,False]
>>> b = filter(None,a)
>>> list(b)
[1, 1.1, 'a']
Quant à l'opération, il semble que 0, None et False, qui sont False en booléen, sont supprimés.
>>> b = filter(lambda x:bool(x),a)
>>> list(b)
[1, 1.1, 'a']
Confirmé avec l'aide
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).
|
| __next__(self, /)
| Implement next(self).
|
| __reduce__(...)
| Return state information for pickling.
|
| ----------------------------------------------------------------------
| Static methods defined here:
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
Quand None vient à la partie fonction, il semble se comporter comme filter (lambda x: x, list).
Quand j'ai essayé de le vérifier à partir du code source, c'était assez difficile.
La vérification de la source à l'aide d'inspect ne peut pas être effectuée avec la fonction intégrée.
>>> import inspect
>>> inspect.getsource(filter)
...
TypeError: <class 'filter'> is a built-in class
J'ai vérifié dans la [Documentation] de Github (https://github.com/python/cpython/blob/3.8/Doc/library/functions.rst#id63), mais la source n'est pas incluse. Ça devrait être ça, les fonctions intégrées sont écrites en C. Vous pouvez vérifier le code source de la fonction de filtrage à partir de Python2 avec builtin_filter dans Mercurial. Je me demande si cela n'a pas changé même après être devenu Python3 ...?
Recommended Posts