1 定义
模块是一个包含有一系列变量,函数,类等组成的程序组
模块是一个文件,模块文件名通常以.py结尾
2 作用
让一些相关的变量,函数,类等有逻辑的组织在一起,让逻辑结构更加清晰
模块中的变量,函数和类等可提供给其它模块或程序使用
3 分类
1)内置模块(builtins)
在解析器的内部可以直接使用(c语言,c#编写,python编写,java编写的解释器)
2)安装的标准库模块
通常在安装python时已安装具可以直接使用
3)第三方模块(通常开源)
需要自己安装
4)用户自己编写的模块
可以作为其他人的第三方模块
4 模块的导入
1) 语法:
import 模块1 [as 模块新名1],模块2[as 模块新名2],·····
2)示例
import math
import sys,os
3)作用:
将某模块整体导入到当前模块
4)import 语句用法
模块.属性名
math.sin(1)
math. Tab键
5)help(obj)函数
可以查看模块相关的文档字符串
6)dir(obj)函数
返回模块所有属性的字符串列表
5 另一种模块导入方式
from import 语句
1)语法
from 模块名 import 模块属性名1 [as 属性名1],模块属性名2 [as 属性名2],·········
2)作用
将某个模块内的一个或多个属性(变量,函数,类等)导入到当前模块
3)示例
from math import sin
from math inport pi
from math import factorial (阶乘)as fac
6第三种导入方式
fromimport * 语句
1)语法
from 模块名 import *
2)作用
将某个模块的所有属性导入当前模块中
3)示例
from math import *
sin(pi/2)
7 dir 函数
dir([对象]) 返回一个字符串列表
1)作用
如果没有参数调用,则返回当前作用域内的所有变量的列表,如果给定一个对象作为参数,则返回这个对象的所有变量列表。
对于模块,返回这个模块的所有变量
对于类,返回类对象的所有变量
对于其它对象,返回所有变量,类变量和基类变量???
8 内置模块
builtins,sys,time,itertools ·····,math
9 标准库模块
random,datetimes,os,xml········
10 获取内置模块/标准库模块
11 时间模块
此模块提供了时间相关的函数,且一直可用
1)导入方式
import time
from time import *
from time import xxxx
时间简介:
a)公元纪年是公元0000年1月1日开始
b)对于unix/linux系统,计算机元年是1970-1-1零时开始,此时间为0
c) UTC时间(Coordinated UniversalTime)是从GreenWich时间开始计算的 (中国东八区),减去8小时,得到英国时间
UTC不会因时区问题而产生错误
d)DST阳光节约时间(Daylight SavingTime),又称夏令时,是经过日照时间修正后的时间
3)时间元组
是一个9个整数组成的,这9个元素从前往后依次为
4位年
月(1-12)
日(1-31)
时(0-59)
分(0-59)
秒(0-59)
星期几(0-6,星期一是0)
元旦开始日(1-366)(距离上一个元旦时间)
夏令时修正时间(-1,0,+1)
注:如果年份小于100,则会自动转换为加上1900后的值
4)模块中的变量和函数
(1)变量
time.timezone 本地区时间与UTC时间差(秒为单位)
time.altzone 夏令时时间与UTC时间差(秒为单位)
alternate(间隔的,代替的) [‘ɔ: l’ tə: net]
time.daylight 夏令时校正时间
time.tzname 时区名称的元组
(2)函数
time.time() 返回计算机元年至当前时间的秒数的浮点数(UTC时间为准)
time.sleep(secs)让程序给定的秒数睡眠一段时间(以秒为单位)
time.gmtime([secs]) 将给定的秒数转换为UTC表达的时间元组
时间不填写,则显示当前时间
示例: time.gmtime(661190400.0) time.struct_time(tm_year=1990, tm_mon=12, tm_mday=14, tm_hour=16, tm_min=0, tm_sec=0, tm_wday=4, tm_yday=348, tm_isdst=0)
|
time.mktime(tuple) 将时间元组转换为新纪元秒数时间(UTC为准)
示例 time.mktime((1990, 12, 15, 0, 0, 0, 0, 0, 0)) 661190400.0
|
time.asctime([tuple]) 将时间元组转成字符串(字符串不是元组的字符串,而是转换成'Tue Oct 1716:28:39 2017')
示例: time.asctime() 执行结果 'Tue Oct 17 16:28:39 2017' |
time.localtime([secs])将UTC秒数转换为时间元组(以本地时间为准)
示例:
time.localtime()
time.struct_time(tm_year=2017, tm_mon=10,tm_mday=17, tm_hour=16, tm_min=13, tm_sec=49, tm_wday=1, tm_yday=290,tm_isdst=0)
time.localtime(3600)
time.struct_time(tm_year=1970, tm_mon=1,tm_mday=1, tm_hour=9, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
time.clock() 返回字cpu开始运行到现在的时间秒数的浮点数
time.ctime() 返回当前时间的字符串格式
注释:[]里的内容可以省略
strftime(...)
strftime(format[, tuple]) -> string
Convert a time tuple to a string according to a format specification.
See the library reference manual for formatting codes. When the timetuple
is not present, current time as returned by localtime() is used.
Commonly used format codes:
%Y Year with century as a decimalnumber.
%m Month as a decimal number[01,12].
%d Day of the month as a decimalnumber [01,31].
%H Hour (24-hour clock) as adecimal number [00,23].
%M Minute as a decimal number[00,59].
%S Second as a decimal number[00,61].
%z Time zone offset from UTC.
%a Locale's abbreviated weekdayname.
%A Locale's full weekday name.
%b Locale's abbreviated month name.
%B Locale's full month name.
%c Locale's appropriate date andtime representation.
%I Hour (12-hour clock) as adecimal number [01,12].
%p Locale's equivalent of eitherAM or PM.
12 数学模块
模块名称 math
注: linux下内建模块
Masos 为标准库模块
1)变量
math.e 自然对数e
math.pi 圆周率
2)函数
math.ceil(x) 把x向大的方向取整,
比如x=1.2 返回2
|
x=(-1.2) 返回-1 |
math.floor(x) 对x向0取整
x=1.2 返回1 |
x=(-1.2) 返回-2 |
比如x=1.2 返回1 x=(-1.2) 返回-2
math.sqrt(x) 返回x的平方根
math.factorial(x) 求x的阶乘
[fæ k’ t ɔ: r i ə l] 阶乘
math.log(x[,base]) 返回以base为底x的对数,如果不给出base,则以自然数对数e为底
math.log10(x) 求以10为底的x的对数
math.pow(x,y) 返回x**y
math.fabs(x) 返回浮点数x的绝对值 只适用于float int类型
#角度和弧度转换
math. degrees(x)将弧度x转换为角度 (0~360°)
【学位,度】
math.radians(x) 将角度x转换为弧度
[‘reidjənz] [弧度]
#三角函数
math.sin(x) 返回x的正弦(x为弧度)
math.cos(x) 返回x的余弦
math.tan(x) 返回x的正切
radians degrees alternate
recursion [ri’ kə: ʃn]
13 系统模块
系统模块 sys
与系统相关的信息
1) 变量:
sys.path 模块搜索路径,此变量为路径字符串列表path[0]是当前脚本程序的路径名,或是’’
sys.modules 已加载模块的字典
sys.version 版本信息
示例:
>>>sys.version
'3.5.2 (default, Nov 17 2016, 17:05:23)\n[GCC 5.4.0 20160609]'
sys.version_info 程序运行环境的版本信息的命名元组
示例:
>>>sys.version_info
sys.version_info(major=3(主版本), minor=5(次版本), micro=2(微版本),releaselevel='final', serial=0)
sys.platform 平台信息
示例
sys.platform
'linux'
sys.argv 命令行参数 argv[0] 代表当前脚本程序路径名
sys.stdin 标准输入文件
sys.stdout 标准输出文件
sys.stderr 标准错误输出文件
命令行 python3 abc.py 在此行python3是命令 命令行 python3 命令行语法 命令 [选项]
|
查看脚本程序路径名 示例:python3 abc.py cc.py a.txt ‘hello’ sys.argv 执行结果 abc.py cc.py a.txt ‘hello’ 注意之间是用英文’ ’空格隔开 |
命令行 python3 abc.py 在此行python3是命令
命令行 python3
命令行语法 命令 [选项]
sys.copyright 获取python版权相关信息
sys.builtin_module_names 获得python内建模块名称(字符串元组)
示例: >>> sys.builtin_module_names ('_ast', '_bisect', '_codecs', '_collections', '_datetime', '_elementtree', '_functools', '_heapq', '_imp', '_io', '_locale', '_md5', '_operator', '_pickle', '_posixsubprocess', '_random', '_sha1', '_sha256', '_sha512', '_signal', '_socket', '_sre', '_stat', '_string', '_struct', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', 'array', 'atexit', 'binascii', 'builtins', 'errno', 'faulthandler', 'fcntl', 'gc', 'grp', 'itertools', 'marshal', 'math', 'posix', 'pwd', 'pyexpat', 'select', 'spwd', 'sys', 'syslog', 'time', 'unicodedata', 'xxsubtype', 'zipimport', 'zlib')
不同系统中内建模块不同 注意其中的熟悉模块 |
2)函数
sys.exit([code]) 退出程序,正常退出时sys.exit(0)
sys.getrecursionlimit() 得到递归的层次限制值
sys.setrecursionlimit() 设置递归层次限制值
14 自定义模块的编写
1)调用模块和模块在一个路径下
自己编写的模块和内建模块,标准库模块,第三方模块一样导入,也是有三种方式
2)搜索路径(不在同一路径下 )
import 模块名(怎么寻找这个模块)
标准库模块,有自己的路径
内置模块不需要路径,每个模块可直接引入
自己编写模块需要路径了
(1)查询顺序
a) 搜索内置模块
sys.builtin_modules_name
b) sys.path提供的路径
c) 搜索程序运行路径
d) 后来添加的路径
例如:
编写新的模块需要调用别的模块时,需要把在编写的模块中添加,在引入模块前
importsys
sys.path.append('/home/tarena')
添加后就能导入并访问了
(2)PYTHONPATH环境变量
python3在linux系统中运行,则linux就是python3的运行环境
此环境变量的值会在python3的解析器启动时自动加载到sys.path列表中
linux/unix 查看环境变量的命令
printenv 命令行
export PYTHONPATH=$PYTHONPATH:/home/tarena(只适用于当前环境,例如在一个终端设置完后,在另一个终端是不能用的)
补充1: sys.path 和 PYTHONPATH的关系
sys.path搜索模块或包的路径包括 标准库模块和第三方模块
把模块放在主程序执行路径下(当前路径下)
sys.path搜索的现有路径下
内置模块
添加搜索模块路径的方式有两种
第一种:sys.path.append(‘/home/tarena/libs/’)
第二种:
python3启动时时会把pythonpath环境变量下的路径扫描并加载进sys.path中
补充2:
如何在终端启动时自动设置PYTHONPATH环境变量:
在~/.bashrc文件里面最下面加入:
exportPYTHONPATH = $PYTHONPATH:/home/tarena/libs
15模块的加载过程:
(1)在模块导入时,模块内的所有语句会执行(导入后即执行,也加载内存中)__pycache__包中
编译 解释执行
menu.py--------------->menu.pyc------------------>python3
(2)如果一个模块已经导入,则再次导入时,不会重新执行所有语句
16模块化编程的优缺点:
1有利于多人开发
2使代码更加易于维护
3提高代码的复用率
4模块化编程有助于解决函数名和变量名冲突问题
17 模块的属性
1)__name__属性
用来记录模块自身的名字,分两种情况
1.对于被导入的模块,模块名是去掉前面的路径和’.py’后缀的文件名
2.对于被执行的主模块,模块名为“__main__”
例如:
myadd.py
当直接执行madd.py时,__name__为 ‘__main__’
当myadd.py被其他模块使用时,__name为‘myadd’
示例 >>> import all__ >>> all__.__all__ ['name1', 'hello1'] >>> from all__ import * >>> __all__ Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name '__all__' is not defined |
(1)作用:
1 记录模块名
2 用来判断是否是主模块
2)__doc__属性
用来绑定模块的文档字符串
(1)模块文档字符串
它是模块中第一行出现的,没赋值给其它变量的字符串
myadd.__doc__ 文档字符串
myadd.function().__doc__ 函数字符串
3) __all__属性
(1)作用:
当用from import * 语句导入模块式,只是导入__all__列表内属性
__all__属性是用来存放可导出属性的列表
模块中设置__all__属性后,便可以规定哪些是可以导出的属性
__all__ = ['name1',"hello1"] #只有name1,’hello1’可以被导出 def hello1():pass def hello2():pass def hello3():pass
name1='aishushuishui' name2 = 'nidaye'
交互模式下的执行情况 >>> from all__ import * >>> dir() ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'hello1', 'name1'] |
yincang.py __all__ = ["_abc",'__abc','_name']
def _abc(): pass
def __abc(): pass
def abc(): pass
name1 = 'hello'
_name = 'hello1' __name = 'hello2' import yincang >>> yincang.__all__ ['_abc', '__abc', '_name'] >>> dir(yincang) ['__abc', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name', '__name__', '__package__', '__spec__', '_abc', '_name', 'abc', 'name1'] |
4)__file__属性
__file__用来记录模块对应的文件路径名
18 模块的隐藏属性
模块中以‘_’或’__’开头,不以‘__’结尾的属性,
在用from 模块名 import * 导入时,不会显示
# yincang.py def _abc(): pass
def __abc(): pass
def abc(): pass
name1 = 'hello'
_name = 'hello1' __name = 'hello2'
>>> from yincang import * >>> dir() ['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'abc', 'name1'] |
19 标准库模块
1)随机模块 random
假设导入:
import random as R
(1)函数
R.random() | 返回一个[0,1)之间的随机数 | 生成一个1000以内的数,可以将此扩大1000倍 |
R.getrandbits(nbit) | 以长整型的形式返回用nbite位来表示的随机数 | 如果nbite是8 则返回0~255之间的整数 因为2**8=256 |
R.uniform(a,b) uniform 随机,独立,制服 | 返回[a,b)区间内的随机数
| 生成浮点数或整数 |
R.randrange([start,]stop[,step]) | 返回range(start,stop,step中的随机数)
| 生成整数 |
randint(self, a, b) Return random integer in range [a, b], including both end points. | 没有步长 | 生成整数 |
序列的随机
R.choice(seq) | 从序列中返回任意1个元素
|
|
R.shuffle(seq) [‘ʃʌfl] 洗牌 曳步舞 | 随机指定序列的顺序(乱序序列) | #无返回值直接改变原有seq
|
R.sample(seq,n) | 从序列中选择n个随机元素且不重复的元素 | import random
l = [1,2,2,'bob','lucy']
print(random.sample(l,2)) #按照下标进行随机取出
#执行结果有可能是 [2,2] |
(2) 随机数生成算法
https://www.cnblogs.com/ECJTUACM-873284962/p/6926203.html
十一 包 package
1 包的定义
包是将模块以文件夹的组织形式进行分组管理的方法
2 包的作用:
将一系列模块进行分类管理,有利于防止名字冲突,可以在需要时加载一个或部分模块而不是全部模块
3 包的加载
第一种
import 包名 [as 包别名]
import 包名.模块名 [as 模块别名]
import 包名.模块名.函数名 [as模块别名]
import 包名.子包名.模块名 [as 模块别名]
·····
导入立即初始化
mypack/
__init__.py
menu.py
games/
__init__.py
contra.py
supermario.py
tanks.py
office/
__init__.py
exec.py
word.py
import mypack 导入整个包是包内的__init__.py被加载
importmypack.games.tanks 逐层寻找tanks.py模块 会初始化两个__init__.py,然后再加载tanks.py模块
第二种
from packageName import moduleName [as newmodule]
from packageName.packagesonName importmoduleName [as newmodule]
from packageName.moduleName import variableName [as newVariable]
from packageName import *
和上面加载的过程一样的,包被加载 [然后模块被加载]
4 __init__.py文件
建包时必须建的文件
1)作用
在包被加载时自动调用
1.在内部填写包的文档字符串
2 加载此包所依赖的一些模块或其他包???
2)__all__属性
(1)作用:
用来记录那些包需要导入
当用from 包 import * 语句导入模块时,只查找__all__属性所列出的模块
__all__ 属性只在from包 import *语句中起作用,也必须写在__init__.py中,加载子包,还有本包的模块
5 包的加载路径
同模块相同,设置方法:
1.可以设置sys.path
2.可以设置PYTHONPATH环境变量
6 包的的加载过程
模块加载过程如下
编译 解释执行
menu.py--------------->menu.pyc------------------>python3