一、python的程序结构
1、组成
- package
- module
- function
2、模块
- 模块是在代码量变得相当于大了之后,为了将需要重复使用的有组织的代码放在一起,这部分可以被其他程序引用,从而使用该模块里的函数等功能,引用的过程叫做导入(import)
- 在python中,一个文件(以‘.py’为后缀的文件)叫做一个模块
- 导入模块的写法
- 方法一:import module1[,module2...[,moduleN]]
- 方法二:from module import<,name2,...[,nameN]>
3、模块分类
系统内置模块
- sys、time、json模块等等
第三方的开源模块
- 通过pip install进行安装,有开源的代码
自定义模块
- 自己写的模块,对某些逻辑或某些函数进行封装后供其他函数调用
4、如何使用模块
1)系统内置模块
- python 安装好之后自带的一些非常有用的模块(sys,os,time,json模块等)
import sys
print('调用了sys模块')
for i in sys.argv:
print(i)
- 注意点1:使用关键词‘import+模块名称’导入某一个模块
- 注意点2:同一个模块不管你执行了多少次‘import’,只会被导入一次
- import应该被放在代码的顶端
# 打印文件绝对路径
print(sys.argv)
# 3s后执行
time.sleep(3)
print('exit')
2)第三方开源模块
- 是通过包管理工具pip完成的,必须先知道该库的名称,可以在官网或者pypi上搜索,比如mysql驱动程序,web框架Flask,科学计算Numpy等
- NumPy(Numerical Python)是Python语言的一个扩展程序库,支持大量的唯度数组于矩阵运算,此外也针对数组运算提供大量的数学函数库
- pip install numpy
import numpy as np
# 生成一个3行5列的矩阵数组
a = np.arange(15).reshape(3, 5)
print(a)
打印出
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
3)自定义模块
- 自定义模块是自己写的模块,对某些逻辑某些函数进行封装后供其他函数调用
- 模块由变量,函数,或类组成
- 举例
创建一个模块 baidu.py
创建一个调用模块 index.py
# baidu.py
name_is_a_very_long_name = 'summer'
def add(a, b):
return a + b
class index():
def sub(self, a, b):
return a - b
# print(name_is_a_very_long_name)
# print(add(1, 4))
# i = index()
# print(i.sub(4, 2))
# index.py
import baidu
print(baidu.name_is_a_very_long_name)
print(baidu.add(1, 2))
i = baidu.index()
print(i.sub(2, 4))
# index.py
# 如果觉得每次调用的时候都要写模块名,会很麻烦,可以先把模块里面的变量,函数,或类先导入进行(多的时候可用*)
import baidu
from baidu import name_is_a_very_long_name, add, index
# from baidu import *
print(name_is_a_very_long_name)
print(add(1, 2))
i = baidu.index()
print(i.sub(2, 4))
- 注意:自定义模块对名字一定不能和系统内置对模块重名,否则将不能再导入系统对内置模块。例如,自定义一个sys.py模块后,那系统的sys模块就不能使用
5、模块的作用域
- 搜索模块
- 当你导入一个模块,python解析器对模块位置对搜索顺序是:
1、当前目录
2、如果不在当前目录,python则搜索在shell变量PYTHONPATH下的每个目录
3、如果都找不到,python会察看默认路径,unix下,默认路径一般为/usr/local/lib/python/
- 模块搜索路径存储在system模块都sys.path变量中,变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录
6、使用模块的总结
- 使用模块的好处——提高代码的可维护性
- 一个模块编写完毕之后,其他模块直接调用,不能再从零开始写代码了,节约了工作时间
- 避免函数名称和变量名称重复,在不同的模块中可以存在相同名字的函数名和变量名(不要和系统内置的模块名称重复)