模块和包
模块
什么是模块?
定义:逻辑上就是一组功能的组合;实质上一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py后缀。
import加载的模块分为四个通用类别:
使用python编写的代码(.py文件)
已被编译为共享库或DLL的C或C++扩展;
包好一组模块的包;
使用C编写并链接到python解释器的内置模块;
如何使用模块?
想要使用模块,必须先要将模块加载进来,可以通过关键字 import 或 from进行加载;需要注意的是模块和当前文件在不同的命名空间中。
模块的构成
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,为了避免同一个模块重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句)
模块导入的过程
import 语句
想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:
导入整个模块,这种导入方式比较占用内存
import moduels (模块名字) as XX
这里是导入整个模块的同时给它取一个别名,因为有些模块名字比较长,用一个缩写的别名代替在下次用到它时就比较方便
from modules(模块名字) import func(方法)
从一个模块里导入方法,你要用到模块里的什么方法就从那个模块里导入那个方法,这样占用的内存就比较少
也可以用别名表示 : from modules(模块名字) import func(方法)as XX
from package.modules import func(方法)
从一个包的模块里导入方法 这个方法跟上面那种基本一样,占用的内存也比较少
也可以用别名表示,from modules(模块名字) import func(方法)as XX
from…..import *
表示导入模块中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。
还有一点要说的是,如果使用* 的方式进行了导入,这时只想使用里面的某个或某些功能时,可以使用__ all__来进行约束;
注意:__ all__只是用来约束* 方式的,其他方式导入的话,不会生效;
#直接导入
import pandas
#加别名
import pandas as pd
# #看一下from.....import 的使用
from sys import modules
print(modules)
# #再看一下使用as引用这个模块的某个功能;
from matplotlib import pyplot as plt
#这样在之后我们要调用这个模块只需要用plt即可,相当于起别名。
包
包是一种组织管理代码的方式,包里放着模块
用于将模块包含在一起的一个文件夹
假如一个模块的名称是 A.B,那么他表示一个包 A中的子模块B 。
包的结构
/— 包 #顶层包
/—/— init.py 包的 #初始化顶层包
/—/— 模块1
/—/— 模块2
/—/— 子包
/—/—/— init.py 包的标志文件
/—/—/— 子包的模块1
包的导入操作
包的导入分为import和from…import…两种,但是无论哪种方式,在导入时必须都遵循一个原则:凡是在导入时带点的,点的左边必须是一个包,否则非法。在导入后使用时,就没有这些规则了,点的左边可以是包、模块、函数等(他们可以用点的方式调用自己的属性)。
包的本质就是文件夹,导入包就相当于导入包下的__ init__.py文件
下面我们具体看下包的导入有哪些方式
import package_name
直接导入一个包,可以直接使用__ init__.py的内容
eg.import time, 用import直接导入python的time模块
import package name as p
具体用法跟作用方法,跟上面一致,相当于起别名
注意的是此方法默认是对 __ init__.py的内容进行导入
from … import …导
from package import module,module2…..
eg. from random import randint 即导入random包中的randint函数
from time import time,localtima 即从time包导入time函数和localtime函数
from package import *
导入指定包的所有内容
包和模块区别
包是比模块更高层的概念,模块一般是一个文件,包是一个目录,一个包中可以包含很多个模块。
包的all 定义在init.py文件中,模块的all定义在模块文件的开头
以下包用P表示,模块用M表示,方法用F表示
#在Python中引入模块可以用
import M
from M import *
from M import F
#引入包的方式可以是
import P
from P import M
from P import *
from P.M import F
from P1.P2.M import F
另外,包的init.py文件不能少。
概念说明
这里理清python中模块、库、包之间的概念差异
模块(module)其实就是py文件,里面定义了一些函数、类、变量等。
包(package)是多个模块的聚合体形成的文件夹,里面可以是多个py文件,也可以嵌套文件夹。
库是参考其他编程语言的说法,是指完成一定功能的代码集合,在python中的形式就是模块和包。