上网查了一下,貌似是一个简单问题,网上都是这么说的,我之前也是这么理解的:
假设有一个包名字叫 numpy, 里面有一个函数 zeros
1、 from numpy import zeros
那么你可以直接调用 zeros()函数
2、import numpy.zeros
那么你只能使用全名 numpy.zeros
但今天遇到了问题了。
from sklearn import datasets
a=datasets.load_digits()
print(a)
这个代码没问题
但是下面这个代码居然提示错误
import sklearn
a=sklearn.datasets.load_digits()
print(a)
提示错误是:AttributeError: module 'sklearn' has no attribute 'datasets'
什么鬼,看不懂,不是说import sklearn 后应该可以通过点.来访问sklearn里的所有内容吗,就像numpy中那样。初学者,不懂,求大神解释下,不胜感激!!
这样也报错
import sklearn.datasets
a=datasets.load_digits()
print(a)
NameError: name 'datasets' is not defined
module和package是不一样的,sklearn是package,一般导入是采用‘from sklearn import xxx',module是采用import module,这是因为package是单个或多个module组合而成,所以如果直接采用import package,终端会混乱导致error
主要目的是为了防止内存溢出,也就是说你调的东西太多了都加载进来了,但是运行状态却不好,很多东西都没有用到
其实原理很简单,拿工具箱来做比方,工具箱里有很多工具,我们想用一个特定的扳手,有两种方式,一种是把工具箱带上,工具箱里用,直接拿来用,另一种是我们只带上工具箱里的扳手,用到它的时候直接用了。
两者的主要区别是,前者带的东西多,里面内容丰富,想用什么拿什么,但是你带的工具箱也很重,后者只能用这个扳手,如果你还想用另一个型号的扳手,就需要把另一个扳手也带上。
从代码层面上说,后者写的代码多,前者写的代码少
在内存层面说,后者较前者能减少内存占用,运行不会出现内存溢出的情况。
用到什么方法,就调什么包好了,如果一个包里只用几种方法,可以通过from 方法 import 方法1,方法2,方法3的形式来引用
##注意
如果在方法名的后面写上空格,则代表给这个方法起了一个别名,在程序里用的时候,既可以使用原名,也可以使用别名。
数据库里面可以保存页面的html,图片在里面也只是以src存在,是网络路径,所以其实数据库里面没必要保存图片。只需要保存图片的地址即可。
显然sklearn引用不正确
1.当模块test.py中没有类,只有方法add,此方法实现传入的数字+1功能
(1)如果使用import导入:import test
调用方法:test.add(1)
(2)使果用form...import导入:from test import *
调用方法:add(1)
2.当模块test.py中有类,类名为cal,类中有方法add,此方法实现传入数字+1功能
(1)如果使用import导入:import test
调用方法:test.cal().add(1)
(2)如果使用from...import导入:from test import *
调用方法:cal().add(1)
import 是导入整个模块,from import是从模块中导入指定的符号等内容
用点号访问的时候,需要用module,而sklearn 是包,datasets是模块。
import numpy是引入numpy模块包,from numpy import * 是从numpy中引入这个numpy的一部分