python import 和from import 区别

上网查了一下,貌似是一个简单问题,网上都是这么说的,我之前也是这么理解的:

假设有一个包名字叫 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是从模块中导入指定的符号等内容

**import socket 的话要用socket.AF__INET

from socket import*是把socket下所有名字引入当前名称空间**

用点号访问的时候,需要用module,而sklearn 是包,datasets是模块。

import numpy是引入numpy模块包,from numpy import * 是从numpy中引入这个numpy的一部分