【问题标题】:Functions as list elements作为列表元素的函数
【发布时间】:2018-10-16 14:38:07
【问题描述】:

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

我的问题是,列表如何将函数名称作为其项,以及它在 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

【问题讨论】:

  • @bunbun 此代码有效...我已将代码的输出也放入了
  • 哎呀是误读了你的问题
  • 从问题中删除与sklearn相关的所有内容可能是个好主意,因为很多人对此并不熟悉。无论如何,这个问题与sklearn 无关。

标签: python python-3.x


【解决方案1】:

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

for 循环将引用一一绑定到名称 i。除了 type(i) 之外,您可能还需要打印 i.__name__ 以查看每次迭代将哪个函数传递给 SelectKBest

在 Python 中以这种方式处理函数是很常见的。函数和其他可调用对象可以放入列表、字典、元组以及几乎任何其他数据结构中。由于functions are hashable,它们甚至可以用作字典键或放在集合中。您还可以通过分配属性来为函数对象添加属性。

【讨论】:

  • 那么列表中的项类型不应该是指针或内存地址吗?它的返回函数类型
  • @ubuntu_noob。在引擎盖下,它是一个指向对象的指针。 type 也恰好接受一个指针。在那个层面上,一切都是指针。例如,3 是指向 Python 中的 int 对象的指针。
  • 这是迭代多个函数的正确方法吗?..是否有内存问题的可能性?
  • @ubuntu_noob。出错的可能性不大,除非是专业但在您的 Python 解释器中或一些灾难性故障。函数在很大程度上意味着要像 Python 中那样传递。这是他们成为一流对象的原因之一。有很多工具可以帮助您做到这一点。
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 2020-04-18
  • 2020-09-27
  • 2013-12-12
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多