Python之模块

模块

什么是模块

  • 模块是一个包含有一系列数据,函数,类等组成的程序组
  • 模块是一个文件,模块文件名通常以 .py 结尾

模块的作用

  • 让一些相关的数据,函数,类等有逻辑的组织在一起,使逻辑结构更加清晰
  • 模块中的数据,函数和类等可提供给其它模块或程序使用

模块的分类

  • 内置模块(builtins),在解析器的内部可以直接使用
  • 标准库模块,安装Python时已安装且可直接使用
  • 第三方模块(通常为开源),需要自己安装
  • 用户自己完的模块(可以作为其它人的第三方模块)

模块的导入

import 语句

import 模块名1[as 模块新名1][,模块名2 [as 模块新名2]], ...
# 作用:将某模块整体导入到当前模块
# 用法:模块.属性名

# 导入数学模块
import math
# 导入系统模块 sys 和 os 模块
import sys, os
  • dir(obj) 函数返回模块所有属性的字符串列表
  • help(obj) 可以查看模块相关的文档字符串

from import 语句

from 模块名 import 模块属性名1 [as 属性新名1][,模块属性名2[as 属性新名2], ...]
# 作用:将某模块内的一个或多个属性导入到当前模块的作用域

from math import pi
from math import pow, sqrt
from math import factorial as fac

from import * 语句

from 模块名 import *
# 作用:将某模块的所有属性都导入到当前模块

from math import *

dir 函数

dir([对象]) 返回一个字符串列表

  • 如果没有参数调用,则返回当前作用域内的所有变量的列表
  • 如果给定一个对象作为参数,则返回这个对象的所有变量的列表
    • 对于一个模块,返回这个模块的全部属性
    • 对于一个类对象,返回类对象的所有变量,亲递归基类对象的所有变量
    • 对于其它对象,返回所有的变量,类变量,基类变量

数学模块

变量

  • math.e 自然对数的底 e
  • math.pi 圆周率 pi

函数

  • math.ceil(x)x向上取整,比如x=1.2,返回2
  • math.floor(x)x向下取整,比如x=1.2,返回1
  • math.sqrt(x) 返回x的平方根
  • math.factorial(x)x的阶乘
  • math.log(x[, base]) 返回以base为底x的对数, 默认以自然对数e为底
  • math.log10(x) 求以10为底``x的对数
  • math.pow(x, y) 返回 x**y (x的y次方)
  • math.fabs(x) 返回浮点数x的绝对值
  • math.degree(x) 将弧度x转换为角度
  • math.radians(x) 将角度x转换为弧度
  • math.sin(x) 返回x的正弦(x为弧度)
  • math.cos(x) 返回x的余弦(x为弧度)
  • math.tan(x) 返回x的正切(x为弧度)
  • math.asin(x) 返回x的反正弦(返回值为为弧度)
  • math.acos(x) 返回x的反余弦(返回值为为弧度)
  • math.atan(x) 返回x的反正切(返回值为为弧度)

时间模块

时间简介

  • 公元纪年是从公元 0000年1月1日0时开始的
  • 计算机元年是从1970年1月1日0时开始的,此时时间为0,之后每过一秒时间+1
  • UTC 时间 (Coordinated Universal Time) 是从Greenwich时间开始计算的.
  • UTC 时间不会因时区问题而产生错误
  • DST 阳光节约时间(Daylight Saving Time),又称夏令时, 是一个经过日照时间修正后的时间

时间元组

时间元组是一个9个整型元素组成的,这九个元素自前至后依次为:

  • 四位的年(如: 1993)
  • 月 (1-12)
  • 日 (1-31)
  • 时 (0-23)
  • 分 (0-59)
  • 秒 (0-59)
  • 星期几 (0-6, 周一是 0)
  • 元旦开始日 (1-366)
  • 夏令时修正时间 (-1, 0 or 1)

如果年份值小于100,则会自动转换为加上1900后的值

变量

  • time.altzone 夏令时时间与UTC时间差(秒为单位)
  • time.daylight 夏令时校正时间
  • time.timezone 本地区时间与UTC时间差(秒为单位)
  • time.tzname 时区名字的元组, 第一个名字为未经夏令时修正的时区名,第一个名字为经夏令时修正后的时区名

函数

  • time.time() 返回从计算机元年至当前时间的秒数的浮点数(UTC时间为准)
  • time.sleep(secs) 让程序按给定秒数的浮点数睡眠一段时间
  • time.gmtime([secs]) 用给定秒数转换为用UTC表达的时间元组(缺省返回当前时间元组)
  • time.asctime([tuple]) 将时间元组转换为日期时间字符串
  • time.mktime(tuple) 将本地日期时间元组转换为新纪元秒数时间(UTC为准)
  • time.localtime([secs]) 将UTC秒数时间转换为日期元组(以本地时间为准)

系统模块

系统模块全部是运行时系统相关的信息

变量

  • sys.path 模块搜索路径 path[0] 是当前脚本程序的路径名,否则为 ''
  • sys.modules 已加载模块的字典
  • sys.version 版本信息字符串
  • sys.version_info 版本信息的命名元组
  • sys.platform 操作系统平台名称信息
  • sys.argv 命令行参数 argv[0] 代表当前脚本程序路径名
  • sys.copyright 获得Python版权相关的信息
  • sys.builtin_module_names 获得Python内建模块的名称(字符串元组)标准输入输出时会用到
  • sys.stdin 标准输入文件对象,多用于input()
  • sys.stdout 标准输出文件对象,多用于print()
  • sys.stderr 标准错误输出文件对象, 用于输出错误信息

函数

  • sys.exit([arg]) 退出程序,正常退出时 sys.exit(0)
  • sys.getrecursionlimit()
  • sys.getrecursionlimit() 得到递归嵌套层次限制(栈的深度)
  • sys.setrecursionlimit(n) 得到和修改递归嵌套层次限制(栈的深度)

自定义模块

  • 开发人员自定义的模块
  • 自定义的模块的模块名必须符合"标识符"的命名规则(同变量名)
  • 模块有各自独立的作用域,模块内的变量不会冲突
# mymod1.py
def myfun():
    print('我是mymod1中myfun')

name= 'audi'

# mymod2.py
def myfun():
    print('我是mymod2种的myfun')

name= 'tesla'

# test1.py
import mymod1
# from mymod1 import *

mymod1.myfun()     # 我是mymod1中myfun
print(mymod1.name) # audi

# 以下演示模块内的变量不会冲突
# test2.py
import mymod1
import mymod2

mymod1.myfun()     # 我是mymod1中myfun
mymod2.myfun()     # 我是mymod2中myfun
print(mymod1.name)  # audi
print(mymod2.name)  # tesla

# 以下演示模块内的变量会冲突
# 后倒入的会覆盖前导入的
# test3.py
from mymod1 import *
from mymod2 import *

myfun()      # 我是mymod2中myfun
print(name)  # tesla

模块化编程的优点

  • 有利于多人合作开发
  • 使代码更易于维护
  • 提高代码的复用率
  • 有利于解决变量名冲突问题

模块的加载与导入

import 语句搜索模块的路径顺序

  • 搜索程序运行时的路径(当前路径)
  • sys.path 提供的路径
  • 搜索内置模块

sys.path 是一个存储模块搜索路径的列表

  • 可以把自定义的模块放在相应的路径下可以导入
  • 可以把自己模块的路径添加在 sys.path 列表中

模块的加载过程

  • 在模块导入时,模块的所有语句会执行
  • 如果一个模块已经以导入,则再次导入时不会重新执行模块内的语句

模块的重新加载

import mymod3
import imp
imp.reload(mymod3)    # 重新加载 mymod3模块

模块导入和执行的过程

  • 先搜索相关的路径找模块 .py
  • 判断是否有此模块对应的 .pyc 文件,如果存在 pyc 文件且比 .py 文件新,则直接加载 .pyc 文件
  • 否则用 .py 文件生成 .pyc 后再进行加载

模块的属性

属性的实质是变量(是模块内的全局变量)

模块内预置的属性

  • __doc__ 用来绑定模块的文档字符串
  • __file__ 绑定模块对应的文档路径名
    • 对于内建模块,不绑定路径(没有 __file__ 属性)
    • 对于其它模块,绑定路径名的字符串
  • __name__ 用来记录模块的自身名字
    • 记录模块名
    • 用来判断是否为主模块(最先运行的模块)
    • 当此模块为主模块时,__name__ 绑定 __main__
    • 当此模块不是主模块时,此属性绑定模块名
  • __all__ 用来存放可导出属性的 字符串列表
    • 当用 from import * 语句导入时,只导入 __all__ 列表内的属性

模块的隐藏属性

模块中以 _ 开头的属性,在 from import * 语句导入时,将不被导入,通常称这些属性为隐藏属性

随机模块

  • R.random() 返回一个[0, 1) 之间的随机实数
  • R.uniform(a,b) 返回[a,b) 区间内的随机实数
  • R.randrange([start,] stop[, step]) 返回range(start,stop,step)中的随机数
  • R.choice(seq) 从序列中返回随意元素
  • R.shuffle(seq[, random]) 随机指定序列的顺序(乱序序列)
  • R.sample(seq,n) 从序列中选择n个随机且不重复的元素
  • R.getrandbits(nbit) 以长整型的形式返回用nbit位来表示的随机数
  • R.seed(a=None) 用给定的数a设置随机种子,不给参数a则用当前时间设置随机种子

包(模块包)

包是将模块以文件夹的组织形式进行分组管理的方法

包的作用

  • 将一系列模块进行分类管理,有利于防止命名冲突
  • 可以在需要时加载一个或部分模块而不是全部模块
  • 一个包内可以有多个子包和模块
  • 包可以当做模块来使用
包的示例

__init__.py 文件

常规包内必须存在的文件,__init__.py 会在包加载时被自动调用

  • 编写此包的内容
  • 在内部填写文档字符串
  • __init__.py 内可以加载此包所依懒的一些其它模块
  • 只有当存在 __init__.py 时,文件夹才能被当做一个包
  • __init__.py 内的 __all__ 列表
    • 用来记录此包中有哪儿些子包或模块在用from 包 import *
    • 语句导入时是否被调导入
    • __all__列表只对 from import *语句起作用
    • 可以选择性得加载一些子包和模块

包的导入

用三条import语句可以导入包(同模块的导入规则)

import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名

from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]

from 包名 import *
from 包名.模块名 import *

# 示例
import mypack # 导入mypack包
import mypack.menu # 导入mypack下的menu模块
import mypack.games.tanks # 导入mypack下的games包下的tanks模块

from mypack import menu # 导入mypack下的menu模块
from mypack.office import excel # 导入mypack下的offie包下的excel模块

包的相对导入

包的相对导入是指包内模块的相互导入

from 相对路径包或模块 import 属性或模块名
from 相对路径包或模块 import *

相对路径

  • . 代表当前目录
  • .. 代表上一级目录
  • ... 代表上二级目录
  • .... 以此类推
    相对导入时不能超出包的外部

包的加载路径

  • 当前文件夹
  • sys.path 给出的路径

你可能感兴趣的:(Python之模块)