Python模块、包、库

  1. Python 程序由模块组成。一个模块对应 python 源文件,一般后缀名是:.py。
  2. 模块由语句组成。运行 Python 程序时,按照模块中语句的顺序依次执行
  3. 语句是 Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等。

模块化编程的一般流程:

  1. 设计 API,进行功能描述。
  2. 编码实现 API 中描述的功能。
  3. 在模块中编写测试代码,并消除全局代码。
  4. 使用私有函数实现不被外部客户端调用的模块函数。

help(模块名)

查看模块的API。

import math 
help(math)

__doc__

模块的第一行增加一个文档字符串,用于描述模块的相关功能,通过__doc__获得模块的文档字符串。

###Salary.py
#encoding:utf-8
"""本模块用于计算公司员工的薪资 """
company = "company"
def yearSalary(monthSalary):
    """根据传入的月薪,计算出年薪"""
    pass
def daySalary(monthSalary):
    """根据传入的月薪,计算出每天的薪资"""
    pass

###test.py
import Salary
print (Salary.__doc__)
print (Salary.daySalary.__doc__)

##print
本模块用于计算公司员工的薪资 
根据传入的月薪,计算出每天的薪资

__name__

仅有一个例外,就是当一个模块被作为程序入口时(主 程序、交互式提示符下),它的__name__的值为“__main__”。我们可以根据这个特点,将模块源代码文件中的测试代码进行独立的处理

#encoding:utf-8
"""本模块用于计算公司员工的薪资 """
company = "北京尚学堂"
def yearSalary(monthSalary):
    """根据传入的月薪,计算出年薪"""
    return monthSalary*12
def daySalary(monthSalary):
    """根据传入的月薪,计算出每天的薪资"""
    return monthSalary/30
if __name__ == '__main__':  #测试代码
    print (yearSalary(3000))
    print (daySalary(3000))

##print
36000
100

模块导入

import 语句导入

import本质上是使用了内置函数 __import__()

import 模块时被python 解释器生成一个模块对象

模块起别名,本质上,仅仅是新创建一个变量引用于加载的模块对象

import语法

import 模块名 #导入一个模块 
import 模块 1,模块 2#导入多个模块 
import 模块名 as 模块别名 #导入模块并使用新名字

import 加载的模块分为四个通用类别

a.使用 python 编写的代码(.py 文件); 
b.已被编译为共享库或 DLL 的 C 或 C++扩展; 
c.包好一组模块的包 
d.使用 C 编写并链接到 python 解释器的内置模块;

例子

#encoding=utf-8
import math
print(id(math))
print(type(math))
print(math.pi) #通过 math.成员名来访问模块中的成员

##print
43475448
<type 'module'>
3.14159265359

from…import 导入

from 模块名 import 成员 1,成员 2,…

#导入一个模块中的所有成员
from 模块名 import *

注:尽量避免from 模块名 import *”这种写法。* 它表示导入模块中所有的不是以下划线(_)开头的名字都导入到当前位置。 但你不知道你导入什么名字,很有可能 会覆盖掉你之前已经定义的名字。而且可读性极其的差。

import 语句和 from…import 语句的区别

import 导入的是“文件”,from...import 导入的是文件下的“内容

__import__()动态导入(不建议)

__import__()动态传递不同的的参数值,就能导入不同的模块。

#encoding=utf-8
s = "math"
m = __import__(s) #import math as m
print(m.pi)

##print
3.14159265359

注意:一般不建议自行使用__import__()导入,其行为在 python2 和 python3 中有差异,会导致意外错误。如果需要动态导入可以使用 importlib 模块

importlib模块

import importlib 
a = importlib.import_module("math") 
print(a.pi)

模块的加载问题

多次导入模块只会执行一次,保证了在整个解释器进程内有且仅有一个实例对象。

重新加载importlib.reload()

有时候我们确实需要重新加载一个模块,这时候可以使用:importlib.reload() 方法。

包 package

就是一个必须有__init__.py 的文件夹。包下面包含“模块(module)”,也可以再包含子包(subpackage)
典型结构如下
在这里插入图片描述

导入包操作

导入包的本质其实是“导入了包的__init__.py文件。

例如上图中的包结构,我们需要导入 module_AA.py。
1. import a.aa.module_AA使用时必须加完整名称来引用。
比如:a.aa.module_AA.fun_AA()
2. from a.aa import module_AA使用时直接可以使用模块名
比如:module_AA.fun_AA()
3. from a.aa.module_AA import fun_AA 直接导入函数 在使用时直接可以使用函数名
比如:fun_AA()


1. from package import item 这种语法中,item 可以是包、模块、函数、 类、变量
2. import item1.item2 这种语法中,item 必须是包或模块,不能是其他。

__init__.py三个核心作用
1. 作为包的标识,不能删除。
2. 用来实现模糊导入
3. 导入包实质是执行__init__.py 文件,可以在__init__.py 文件中做这个包的初始化、以及需要统一执行代码、批量导入。

import *(不建议用)

理论上是希望文件系统找出包中所有的子模块,然后导入它们。 这可能会花长时间等。Python 解决方案是提供一个明确的包索引。这个索引由 __init__.py 定义 __all__ 变量,该变量为一列表,如上例 a 包下的 __init__.py 中,可定义 __all__ = ["module_A","module_A2"] 这意味着, from sound.effects import * 会从对应的包中导入以上两个子模块;

包内引用

子包内的引用,可以按相对位置引入子模块。
以 aa 包下的 module_AA 中导入 a 包下内容为例:

from .. import module_A #..表示上级目录 .表示同级目录 
from . import module_A2 #.表示同级目录

sys.path 和模块搜索路径

导入某个模块文件时, Python 解释器去哪里找这个文件呢?一般按照如下路径寻找模块文件(按照顺序寻找,找到就不在往下找
1. 内置模块
2. 当前目录(当前程序目录)
3. 程序的主目录(程序所在项目的根目录)
4. pythonpath目录(如果已经设置了 pythonpath 环境变量)
5. 标准链接库目录
6. 第三方库目录(site-packages 目录)
7. .pth 文件的内容(如果存在的话)
8. sys.path.append()临时添加的目录

当任何一个 python 程序启动时,就将上面这些搜索路径(sys.path包括除内置模块以外的路径)进行收集, 放到 sys 模块的 path 属性中(sys.path)。

pythonpath 环境变量

window中高级系统设置→环境变量,设置完要重启IDE

.pth 文件的写法

在这里插入图片描述
我们可以在 site-packages 目录下添加.pth 文件。并在文件中增加内容:

#一行一个目录! 
g:\a 
g:\b 
g:\c

注:
1. 需确保 g:\a,g:\b,g:\c 对应的目录真实存在
2. 在 windows 系统中建立**.pth** 文件,由于没有文件名不能直接建立。需要输入:“.pth.”才能正常建立.pth 文件。

使用 sys.path 查看和临时修改搜索路径

在这里插入图片描述

#test_path.py文件内容
#encoding=utf-8
import sys
sys.path.append("d:/")
print(sys.path)

##print
[
#当前目录
'D:\\PythonStudy\\PythonProject\\pythonProject\\music\\music_name', 
#程序的主目录
'D:\\PythonStudy\\PythonProject\\pythonProject', 
#pythonpath 目录(如果已经设置了 pythonpath 环境变量)
'D:\\pythonmodel', 
#标准链接库目录
'C:\\Users\\12784\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip', 
'C:\\Users\\12784\\AppData\\Local\\Programs\\Python\\Python310\\DLLs', 
'C:\\Users\\12784\\AppData\\Local\\Programs\\Python\\Python310\\lib', 
'C:\\Users\\12784\\AppData\\Local\\Programs\\Python\\Python310', 
#第三方库目录site-packages(如果 pycharm 项目建立了 venv 虚拟环境,则是 venv 目录)
'D:\\PythonStudy\\PythonProject\\pythonProject\\venv', 
'D:\\PythonStudy\\PythonProject\\pythonProject\\venv\\lib\\site-packages', 
#.pth 文件中列出的目录
'D:\\PythonStudy\\.pthtest\\a', 
'D:\\PythonStudy\\.pthtest\\b',
#sys.path.append()临时添加的目录
'd:/']

库(Library)

Python 中库是借用其他编程语言的概念,没有特别具体的定义。库强调的是功能性,而不是代码组织。我们通常将某个功能的“模块的集合”, 称为库。

标准库(Standard Library)

Python 标准库的主要功能有:
1. 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode 支 持,二进制数据处理等功能
2. 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
3. 操作系统功能,包含线程与进程支持、IO 复用、日期与时间处理、调用系统函数、 日志(logging)等功能
4. 网络通信,包含网络套接字,SSL 加密通信、异步网络通信等功能
5. 网络协议,支持 HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC 等多种网络协议,并提供了编写网络服务器的框架
6. W3C 格式支持,包含 HTML,SGML,XML 的处理 7. 其它功能,包括国际化支持、数学运算、HASH、Tkinter 等

第三方扩展库

PyPI官网:https://pypi.org
PyPI(Python Package Index)是 python 官方的第三方库的仓库,所有人都可以下载第三 方库或上传自己开发的库到 PyPI。PyPI 推荐使用 pip 包管理器来下载第三方库。
pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安 装、卸载的功能。
python 2.7.9 和 3.4 以后的版本已经内置pip 程序。

第三方库安装方式

1.命令行安装

pip install 库名   #安装
pip show 库名	#安装后确认
  1. Pycharm 中直接安装到项目中
    在 Pycharm 中,依次点击:file–>setting–>Project 本项目名–>Project Interpreter。点击“+”,然后输入要安装的第三方库“pillow”,再点击按钮“Install Package”,等待 安装即可,几秒种后,即提示安装成功:
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值