用作列表元素

时间:2018-10-16 06:08:29

标签: python python-3.x

我有以下代码。我想尝试不同的特征选择算法而不重复两次相同的代码,因此,我将函数名称放入列表中,并编写了以下代码以查看其是否有效。是的。

我的问题是,列表如何将函数名称作为其项,以及它如何在for循环中正常工作?

from sklearn.datasets import load_digits
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.feature_selection import mutual_info_classif
X, y = load_digits(return_X_y=True)

list=[mutual_info_classif,chi2]

for i in list:
    print(type(i))
    X_new = SelectKBest(i, k=20).fit_transform(X, y)
    print(X_new)
    print('hello')

*输出**

<class 'function'>
[[ 5. 13. 15. ...  6.  0.  0.]
 [ 0.  0.  9. ...  0. 10.  0.]
 [ 0.  3. 14. ...  0. 16.  9.]
 ...
 [ 1. 13.  2. ...  2.  6.  0.]
 [ 2. 14. 15. ...  5. 12.  0.]
 [10. 16.  1. ...  8. 12.  1.]]
hello
<class 'function'>
[[ 1.  0. 15. ...  6.  0.  0.]
 [ 5.  0.  9. ...  0. 10.  0.]
 [12.  0. 14. ...  0. 16.  9.]
 ...
 [ 1.  0.  2. ...  2.  6.  0.]
 [ 0.  0. 15. ...  5. 12.  0.]
 [ 1.  0.  1. ...  8. 12.  1.]]
hello

1 个答案:

答案 0 :(得分:2)

您并不是将函数的“名称”直接放入列表中。函数是对象,就像Python中的所有其他对象一样。当使用def语句创建函数对象时,将其绑定到名称,就像使用=一样,并设置对象的__name__属性。当您将这些名称放在列表中时,该列表包含对函数对象的引用,您以后可以调用它们。

for循环将引用与名称i绑定在一起。您可能还需要打印i.__name__type(i)来查看每次迭代将传递给SelectKBest的函数。

在Python中以这种方式处理函数是相当普遍的。函数和其他可调用对象可放入列表,字典,元组以及几乎任何其他数据结构中。自functions are hashable起,它们甚至可以用作字典键或放在集合中。您还可以仅通过分配属性来将其添加到功能对象。