scikit-learn模型类参数中的星号有何含义,与示例省略号是否相关
类构造参数列表中独立*的作用
- 这个*是Python 3引入的函数签名特殊标记,*本身不接收任何传入参数,核心作用是将分隔符后的所有参数强制设为仅限关键字传参
- 结合
KNeighborsClassifier的构造定义实际举例:- *前面的
n_neighbors参数,同时支持位置传参和关键字传参:既可以写KNeighborsClassifier(n_neighbors=3),也可以写KNeighborsClassifier(3),两种写法效果完全一致 - *后面的
weights、algorithm、leaf_size等所有参数,一律不支持位置传参。如果尝试写KNeighborsClassifier(3, 'distance')按位置给weights传值,Python会直接抛出TypeError,必须严格按照「参数名=参数值」的格式传入,比如KNeighborsClassifier(n_neighbors=3, weights='distance') - 这种设计本质是避免长参数列表下的传值错位问题,适配参数多、默认值复杂的类构造函数场景
- *前面的
示例中
KNeighborsClassifier(...)的含义,及和*的关联 - 文档里写的
KNeighborsClassifier(...)不是需要手写的代码语法,是交互式环境下打印类实例的简化排版示意:- 如果在Python交互终端、Jupyter Notebook中跑完
neigh.fit(X, y),单独输入neigh回车,程序会自动输出当前分类器实例的完整配置信息。因为带默认值的参数太多、输出太长,文档排版时会把默认参数部分用...省略,避免内容冗余
- 如果在Python交互终端、Jupyter Notebook中跑完
- 两者不存在语法层面的直接绑定,只有很弱的间接联系:
- 哪怕类定义里没有那个强制关键字的*,只要类的参数列表足够长,scikit-learn类的
__repr__输出还是会用...省略冗余的默认参数内容 - 唯一的间接关联是:*的存在让所有参数必须靠关键字名称标识,不存在位置传参的顺序歧义,类的repr输出可以严格按照「参数名=值」的格式展示配置,不会出现位置参数和关键字参数混排的混乱,这也让文档里用...省略参数的排版可读性更高
- 哪怕类定义里没有那个强制关键字的*,只要类的参数列表足够长,scikit-learn类的
内容的提问来源于stack exchange,提问作者SecretIndividual
相关产品推荐
相关产品推荐

