2 csdn black CSDN_Black 于 2018.03.09 10:40 提问

python import 和from import 区别 10C

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

假设有一个包名字叫 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

9个回答

hkm73107
hkm73107   2018.03.09 10:40

数据库里面可以保存页面的html,图片在里面也只是以src存在,是网络路径,所以其实数据库里面没必要保存图片。只需要保存图片的地址即可。

qq_38651686
qq_38651686   2018.03.09 11:03

module和package是不一样的,sklearn是package,一般导入是采用‘from sklearn import xxx',module是采用import module,这是因为package是单个或多个module组合而成,所以如果直接采用import package,终端会混乱导致error

xiaolinc
xiaolinc package里面可以有子包,package 与 package 是通过点的形式访问。本来这样设计的目的就是形成有层次的组织结构,把有联系的模块组合到一起。
3 个月之前 回复
xiaolinc
xiaolinc 回复CSDN_black: package里面可以有子包,package 与 package 是通过点的形式访问。本来这样设计的目的就是形成有层次的组织结构,把
3 个月之前 回复
daniaokuye
daniaokuye 可以查看库函数的文件结构,除非是自己写的,不然不会有太多文件夹的嵌套
4 个月之前 回复
CSDN_Black
CSDN_Black 多谢回答,就是还有一个问题,是不是package里有可能还有package,我怎么区分呢?假设sklearn里还包括一个package B,B里面有module C,我是①from sklearn.B import C吗?若是的话,就是说明在from时候,package与package之间可以通过点的形式访问,是这样吗?感觉python这样弄好混乱,不好分清module与package。十分期望您的回答,万分感谢
4 个月之前 回复
xiaobin0517
xiaobin0517   2018.03.09 10:45

显然sklearn引用不正确

daniaokuye
daniaokuye sklearn可以看成一个文件夹,dataset是里面的一个py文件
4 个月之前 回复
weixin_41812046
weixin_41812046 能不能说的再详细点。。。sklearn不能直接improt吗??
4 个月之前 回复
Chuang_Viss
Chuang_Viss 回复CSDN_black: sklearn是一个包,datasets是一个类, loaddigit是类里的一个函数,你要使用函数loaddigit就需要调用datasets而不是sklearn
4 个月之前 回复
CSDN_Black
CSDN_Black 回复CSDN_black: sklearn 不能直接import,为什么可以from sklearn import *?感觉好奇怪啊
4 个月之前 回复
CSDN_Black
CSDN_Black 能不能说的再详细点。。。sklearn不能直接improt吗??
4 个月之前 回复
zyhyg_123
zyhyg_123   2018.03.09 14:00

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)

vikingsz
vikingsz   2018.03.09 14:52

import 是导入整个模块,from import是从模块中导入指定的符号等内容

weixin_39298671
weixin_39298671   2018.03.09 15:03

**import socket 的话要用socket.AF__INET

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

oyljerry
oyljerry   Ds   Rxr 2018.03.09 15:07

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

zmb2011
zmb2011   2018.03.09 20:51

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

itguangzhi
itguangzhi   2018.03.10 21:07

引包有这两种形式是有原因的

主要目的是为了防止内存溢出,也就是说你调的东西太多了都加载进来了,但是运行状态却不好,很多东西都没有用到

为什么会报错

其实原理很简单,拿工具箱来做比方,工具箱里有很多工具,我们想用一个特定的扳手,有两种方式,一种是把工具箱带上,工具箱里用,直接拿来用,另一种是我们只带上工具箱里的扳手,用到它的时候直接用了。
两者的主要区别是,前者带的东西多,里面内容丰富,想用什么拿什么,但是你带的工具箱也很重,后者只能用这个扳手,如果你还想用另一个型号的扳手,就需要把另一个扳手也带上。

从代码层面上说,后者写的代码多,前者写的代码少
在内存层面说,后者较前者能减少内存占用,运行不会出现内存溢出的情况。

如何解决

用到什么方法,就调什么包好了,如果一个包里只用几种方法,可以通过from 方法 import 方法1,方法2,方法3的形式来引用
##注意
如果在方法名的后面写上空格,则代表给这个方法起了一个别名,在程序里用的时候,既可以使用原名,也可以使用别名。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!