sklearn.datasets中()的作用:load_digits调用返回差异原因解析
这个差异和sklearn本身的特殊设计没关系,是Python最基础的函数调用语法规则,两种写法拿到的根本是完全不同的对象,dir()结果自然差得远。
两种写法的本质区别
写
data = load_digits不带括号时,你根本没有执行加载数据集的操作,只是把「加载数据集的函数本身」赋值给了变量data。
你跑的验证结果也能佐证:type(data)返回值是function,说明这时候data就是个普通的Python函数对象,调用dir()拿到的自然是所有Python函数都自带的内置属性和方法——比如__call__、__code__这些,全是函数对象的通用属性,和手写数字数据集没有任何关系。
对应验证代码:from sklearn.datasets import load_digits data = load_digits type(data) # 执行返回:function dir(data) # 返回全是函数内置属性,无任何数据集相关字段写
data2 = load_digits()带括号时,才是真正触发了函数执行:load_digits函数内部跑完整套数据集读取、封装的逻辑,最后返回存好手写数字数据的sklearn.utils.Bunch对象(可以理解为sklearn自定义的类字典结构化数据容器),赋值给data2。
这时候你拿到的才是真正加载完成的数据集对象,type(data2)返回sklearn.utils.Bunch,调用dir()拿到的自然是数据集本身的属性:比如data存特征矩阵、target存分类标签、images存原始8*8像素的手写数字图像、DESCR存数据集说明文档。
对应验证代码:data2 = load_digits() type(data2) # 执行返回:sklearn.utils.Bunch dir(data2) # 执行返回:['DESCR', 'data', 'feature_names', 'frame', 'images', 'target', 'target_names']
括号()在调用中的作用
这个括号不是sklearn.datasets模块专属的特殊写法,是Python通用的可调用对象执行语法:
只要是可调用对象(普通函数、类、实现了
__call__方法的自定义对象都算),后面跟()才会触发内部执行逻辑,你可以在括号里传入对应参数,最后拿到执行后的返回值;如果不写(),你只是拿到了这个可调用对象本身,不会运行任何内部逻辑,相当于给对象起了个别名——比如你前面定义了data = load_digits,后面写data()和直接写load_digits()的效果完全一样。
举个最直白的普通例子就能懂:
def get_number(): return 666 var1 = get_number var2 = get_number()
这里var1是函数本身,类型是function;var2是函数运行后返回的整数666,类型是int,两者的属性、用法完全不同,和你遇到的load_digits场景逻辑完全一致。
内容的提问来源于stack exchange,提问作者aleeeena

