网站 后台 开发,不做网站做百家号,wordpress 展开,黑蒜东莞网站建设目录 Python基础#xff08;七#xff09;--模块和包
1 模块
1.1 什么是模块
1.2 模块的使用
1.3 模块的搜索路径
1.4 模块的缓存
2 包
2.1 什么是包
2.2 包的使用
3 常用模块
3.1 math
3.2 random
3.3 time
3.4 datetime
3.5 sys Python基础#xff08;七七--模块和包
1 模块
1.1 什么是模块
1.2 模块的使用
1.3 模块的搜索路径
1.4 模块的缓存
2 包
2.1 什么是包
2.2 包的使用
3 常用模块
3.1 math
3.2 random
3.3 time
3.4 datetime
3.5 sys Python基础七--模块和包
1 模块
1.1 什么是模块
模块是一个Python文件该文件包含相关的定义与语句类函数变量。模块具有名称名称与文件的名称一致。
使用模块的好处
①通过划分若干个模块将项目程序进行明确的划分从而将复杂问题简单化同时也能够进行更加合理的分工有利于协作式开发程序。
②模块提供独立的命名空间可以解决命名上的冲突。不同的模块中定义相同名称的变量不会产生命名冲突
③模块可以实现良好的重用性在多人间实现共享。
1.2 模块的使用
每个项目可以划分为多个模块。但模块与模块之间不可能都是完全孤立的。一个模块很可能需要与其他的一个或多个模块进行交互因此当需要在一个模块中使用其他模块定义的名称函数类变量等则需要首先导入该模块然后通过模块名.名称进行访问。
1导入模块
使用import对模块进行导入import 模块
我们还可以一次导入多个模块import 模块1模块2……
当导入模块时该模块内的语句就会得到执行但只会执行一次即重复导入模块不会多次执行。当模块作为脚本执行时使用python命令在命令行执行模块中的语句也会得到执行。按照惯例模块导入语句写在模块的最上方。
当导入模块后我们就可以使用模块中所定义的名称格式为模块名.名称
①访问模块可以将其他模块中定义的名称全局命名空间中的名称直接导入到当前模块的命名空间这样我们就可以直接通过名称访问而无需使用模块名限定。格式如下from 模块 import 名称1名称2……
注意这种导入方式要稍加留意因为如果当前模块中也存在同样名称的定义就会造成名称的冲突也就是名称会重新绑定后来的对象。
②模块冲突假设不考虑名称的冲突只考虑访问的便捷性使用from import的方式确实是不错的选择。但是如果我们要使用该模块中定义的很多名称一个个的导入可能会有些繁琐此时我们可以使用批量导入from 模块 import *
这样就会将模块中除了以_开头的所有名称导入到当前模块的命名空间。然而这种方式会导入很多名称容易造成命名冲突尽可能少用。
注意在Python中一切都是对象模块也是一个对象 。使用import导入模块的时候模块定义的语句就会执行
2模块别名
当导入模块或模块中的名称时我们可以使用as为模块或模块中的名称指定别名。语法如下 import 模块名 as 模块别名 from 模块名 import 名称 as 名称别名
这样我们就可以通过别名来访问模块或模块中的名称。但是一旦指定别名后原模块名或原模块中的名称将不再可用。
别名的好处①解决名称冲突②使用简短的别名减少输入量。
3隐藏模块数据
因为使用import *的语法会在当前命名空间增加很多名称为了减少import *所造成的影响名称冲突我们可以有选择性的隐藏模块的数据进而限制使用import *时名称的导入。
隐藏模块数据可以采用两种方式①将名称以下划线_开头。②定义__all__变量。
上面两种隐藏方式仅是限制使用import *语法导入的名称并不是表示该名称无法在模块外访问。使用import其他方式导入还是能够在模块外进行访问的。他们的顺序为会首先检查__all__变量如果存在会将__all__中指定的名称导入到当前的命名空间。如果不存在则会将除下划线_开头的名称导入到当前的命名空间。即__all__中即使指定以下划线_开头的名称该名称依然可以成功导入到当前的命名空间中。
①将名称以下划线_开头如果模块中定义的名称以_开头则在使用import *语法时这些名称不会导入到当前模块的命名空间中即当前模块无法直接访问该名称。
②定义__all__变量如果使用from 模块 import *的语法则默认情况下会导入模块中除_开头的所有名称这容易与当前模块的命名造成冲突。我们可以定义__all__变量来限制导出名称的数量。当在模块中定义__all__变量时该变量的值为一个字符串列表只有列表中指定的名称才会导入到当前命名空间。
# 为了减少命名冲突可以限制from 模块名 import * 的导入模块
# 显示的方式有两种1.名称前使用_ 2.在模块内定义__all__关联一个str类型的列表列表中指定所有能用*导入的名称
# 它们的顺序为先查看__all__名称如果该名称存在则导入列表中所有的元素指定的名称如果不存在则导入
# 该模块下所有未使用_开头的名称这意味着如果__all__中指定了_开头的名称一样可以导入
from lead import *
print(a,b,_c)
print(__name__)
print(lead模块执行了)
# 指定可以由from import * 导入的名称
__all__ [a,b,_c]
a 在lead模块中定义的变量
def b():print(在lead模块中定义的函数)
_c 不会被from import * 语法导入
d 不在__all__列表内print(lead模块的__name__名称: __name__) 4__name__
在编写模块时我们可能需要对当前模块的功能进行测试。当我们在其他模块中导入当前模块时测试内容就会得到执行这并不是期望的。因此我们不得不将其去掉或者注释。可是以后还需要再写入新的测试代码来验证新增功能的正确性如此反复非常不方便。
解决方法是我们可以通过__name__属性来获取模块的名称。模块会在两种情况下执行①当模块由其他模块导入时②当模块作为脚本在命令行使用python 文件名.py执行时。两种执行方式通过__name__获取的模块名称是不一致的。当模块由其他模块导入时模块的名称就是文件的名称而模块作为脚本执行时模块的名称为__main__。因此我们可以据此获取模块执行的方式。
# __name__名称
# 作为脚本运行的模块__name__固定返回__name__
# 作为被其他模块导入而运行时__name__返回的就是当前模块的名称
# 为了方便测试我们可以将测试语句写在if __name__ __name__中
def is_even_number(number):return number % 2 0
# 如果当前模块是作为脚本而执行没说明在测试该模块的功能测试语句得到执行
if __name__ __name__:print(is_even_number(5))print(is_even_number(6)) 1.3 模块的搜索路径
当我们导入模块时解释器会按照如下顺序搜索
①内置与解释器中的模块如sysmath等
②作为脚本执行的模块所在路径
③PYTHONPATH环境变量指定的路径如果该环境没有设置则忽略
④Python安装相关路径这包含Python语言的内建模块os, random模块以及安装的第三方模块beautifulsoupnumpy模块所在的路径等。
可以通过sys模块的path属性获得路径信息。path的值列表类型就是由后三项按顺序组成的后三项路径的并集。解释器会在这些路径中寻找模块名.py文件。
解释器会按顺序进行查找以先找到的为准。因此如果在不同的路径中都存在满足条件的模块会以先找到的为准。
1.4 模块的缓存
导入模块时Python会缓存所加载模块编译后的版本。从实现的角度就是将导入模块的文件*.py编程成字节码文件*.pyc。这样在下次运行时就会检查字节码所对应的源文件在编译过后是否经过修改即字节码文件是否是对应源文件的最新版本。如果不是最新版本则会对源文件重新进行编译。如果已经是最新版本则会从字节码文件中读取信息这样可以加快模块的加载速度。
编译的字节码*.pyc文件是平台无关的即不管在什么平台只要Python源文件的内容相同编译过后的字节码文件也相同。字节码文件会保存在与作为脚本运行文件相同路径下的__pycache__目录中。格式为“模块名.解释器-版本.pyc”例如假设导入的模块为test解释器为CPython3.6则字节码文件名为“test.cpython-36.pyc”。
注意①缓存字节码文件只是可以提供模块加载的速度并不会提高模块运行的速度。
②只有导入的模块才会生成字节码文件作为脚本运行的文件不会生成字节码文件。
③字节码文件可以脱离源文件而运行。
2 包
2.1 什么是包
包类似于操作系统中的文件夹目录路径
包的作用①提供对模块的分类管理
②提供独立的命名空间可以解决模块的命名冲突
2.2 包的使用
1导入包
目录与子目录目录与文件之间使用特定的分隔符进行分隔。例如Windows操作系统使用“\”Linux系统使用“/”。同样包也可以含有子包包与包包与模块之间使用“.”来分隔。可以通过import来导入包或者是导入包中的模块。与之前导入模块的语法是相同的例如
import 包名
import 包名.模块名
from 包名 import 模块名
from 包名.模块名 import 名称
上面导入包的方式我们称为绝对导入此外我们也可以进行相对导入。我们使用“.”来表示当前模块所在的包使用“..”来表示当前模块所在包的父包上级包。例如
from . import 名称
2__init__.py
在每一个包中应该同时配有一个__init__.py文件模块。它的作用如下
①该文件用来标记当前的路径是一个包而不是普通的目录以避免目录名与模块名造成混淆
②该文件为包的初始化模块当导入包或者导入包的子包子模块时该模块会自动执行。因此我们可以在__init__.py中编写一些包的初始化语句
③在__init__.py中定义的具有全局作用域的名称可以使用包名.名称进行访问这些名称就会成为包对象的属性
3__all__
我们可以在__init__.py中定义__all__变量来控制导入哪些名称这与模块中的定义的__all__变量意义相同也是一个字符串的列表类型指定能够导入的名称。 3 常用模块
3.1 math
math模块提供了与数学计算相关的功能。常用的功能如下
名称描述pi返回圆周率的值e返回数学常数 ceil(x) 返回大于等于x的最小整数向上取整floor(x)返回小于等于x的最大整数向下取整exp(x)返回e的x次幂相当于math.e**xpow(x,y)返回x的y次幂相当于x**ylog(x[,base])返回基于base为底x的对数。base默认为efabs(x)返回x视为float类型的绝对值factorial(x)返回x的阶乘x需要是int类型或者是小数点为0的浮点类型并且不能为负。fmod(x,y)返回x与y取余的结果。注意x % y是取模二者结果可能是不同的。fsum(itreable)返回可迭代对象中每个值累计求和后的结果。gcd(x,y)返回x与y的最大公约数。x与y需要是整数类型sqrt(x)返回x的平方根
3.2 random
random模块提供生成随机数的功能伪随机数。常用功能如下
名称描述random()返回一个0~1之间的浮点数包括0不包括1randint(a,b)返回一个a~b之间的整数包括a与b randrange(stop)/ randrange(start,stop[.step]) 参数与range函数的意义相同相当于从相同参数的range函数可能产生的值中随便选择一个uniform(a,b)返回a与b之间的浮点数包括端点choice(seq)从seq可迭代对象中随机选择一个元素如果序列为空则产生错误choices(population, weightsNone, *, cum_weightsNone, k1)从population可迭代对象中选择k个元素放入一个列表并返回。如果提供了weights权重或cum_weights累积权重则元素的选择概率会根据权重累积权重决定。权重与累积权重不能同时指定因为权重内部会转换成累积权重这样会造成不一致。如果没有指定权重与累积权重则各个元素的选择概率相同。sample(population, k)从population可迭代对象中选择k个不同的元素返回元素组成的列表。shuffle(x[, random])对x序列进行洗牌随机分配每个元素的位置。random是一个可选的生成随机数的函数函数的返回值为[0, 1)默认使用random模块的random函数。
3.3 time
time模块提供关于时间的操作
名称描述timezone返回与UTC时间世界标准时间相差的秒数。正数表示晚于UTC时间负数表示早于UTC时间。time()返回从新纪元1970-01-01 00:00:00到当前时间走过的秒数。localtime([seconds])返回从新纪元走过seconds秒数后的时间。返回类型为time.struct_time类型tuple的子类如果seconds没有指定则默认表示当前时间。该时间显示的是本地时间要考虑对应的时区。例如北京时间为东八区比UTC时间早8小时因此需要在最后转换的时间上加上8小时。struct_time是一个命名元组可以通过属性名访问也可以通过索引访问gmtime([seconds])与localtime([seconds])的用法相同只是返回的是UTC时间而不是本地时间。mktime(tuple)将tuple本地时间的元组转换为从新纪元到元组指定时间走过的秒数。与localtime([seconds])函数正好是相反的asctime([tuple])将tuple时间元组转换成字符串str的表示形式。如果没有提供tuple参数则使用localtime()函数返回的元组当前的本地时间。ctime([tuple])将从新纪元走过的毫秒数转换为本地时间。该函数相当于这样调用asctime(localtime(seconds))。如果seconds参数没有指定则使用time()函数返回的秒数。sleep(seconds)使当前程序暂停执行参数指定的时间。seconds可以是小数。clock()在Unix / Linux系统该函数返回CPU的计算时间。在Windows操作系统该函数第一次调用返回CPU的计算时间从第二次调用开始返回距离第一次调用该函数所经历的时间。CPU的计算时间不包括调用sleep暂停的时间因为在暂停时CPU没有工作。因为该函数在不同操作系统上行为的不一致性从Python3.3起已经不建议使用取而代之的是使用perf_counter()函数或者是 process_time()函数。perf_counter()返回精准的性能计数器可以用来测试短时间的时间差。该时间包含调用sleep函数暂停的时间。该函数返回值所基于的时间点是不确定的我们不能当成系统时钟来使用但是可以多次调用该函数计算一段程序执行的时间差。process_time()返回当前进程下系统以及用户的CPU计算时间。该时间不包含调用sleep函数暂停的时间。strftime(format[, tuple]) - string将tuple时间元组转换成format参数指定的格式的字符串。如果tuple没有指定则使用localtime()函数返回的元组。format中可以含有特殊占位符将使用元组中特定值进行替换非特殊占位符会原样显示。strptime(string, format) - struct_time按照format指定的格式将string时间格式字符串解析为时间的元组。format的格式与strftime函数的format格式相同
struct_time类的格式 索引 属性名 说明 0 tm_year 年四位数表示。 1 tm_mon 月份1 ~ 12。 2 tm_mday 日1 ~ 31。 3 tm_hour 小时0 ~ 23。 4 tm_min 分0 ~ 59。 5 tm_sec 秒0 ~ 6160用来表示闰秒跳秒是对世界时间的一种调整。61因为历史原因所保留。 6 tm_wday 星期0 ~ 6周一为0周日为6。 7 tm_yday 年度的第几天1 ~ 366。 8 tm_isdst 是否支持DSTdaylight saving time即夏令时日光节约时间。部分国家在天亮早的夏季将时钟向前调整一小时从而可以节约照明资源。可能值为0不生效、1生效或-1未知。
占位符 占位符 说明 %Y 年份四位数字。 %y 年份两位数字。 %m 月份01 ~ 12。 %d 日01 ~ 31。 %H 24小时制00 ~ 23 %I 12小时制00 ~ 12 %M 分钟00 ~ 59。 %S 秒00 ~ 61。 %w 周期几0 ~ 6周日为0。注意与tm_wday的表示不一致。 %j 年度的第几天001 ~ 366。 %W 年度的第几周00 ~ 53星期一视为一周的第一天。在年度第一个周一之前的天视为第0周。 %U 年度的第几周00 ~ 53星期日视为一周的第一天。在年度第一个周日之前的天视为第0周。 %z 当前时区与UTC的时间差。格式为HHMM当前时区早于UTC或-HHMM当前时区晚于UTC。 %Z 时区名称。 %a 本地星期的简写名。 %A 本地星期的全名。 %b 本地月份的简写名。 %B 本地月份的全名。 %c 本地日期与时间的恰当表示。 %x 本地日期的恰当表示。 %X 本地时间的恰当表示。 %p 显示AM或PM或其本地等效的其他表示方式。 %% %的转义。
3.4 datetime
datetime模块提供datetimedatetimetimedelta等类供我们对日期与时间进行操作。与time模块相比datetime模块还额外增加了日期的加减与比较运算。
1date类
date类提供针对日期不含时间的操作。
构造器date(year, month, day)用来创建参数指定日期的date对象。year指定年month指定月day指定日。实例属性year / month / day返回年 / 月 / 日类属性 max / min最早的 / 最晚的date对象 resolution类属性两个不同date对象的最小差距值 实例方法ctime()返回特定格式的字符串来表示日期 replace(yearself.year, monthself.month, dayself.day)返回新的date对象值为使用当前参数替换之后的结果。year指定要替换的年month指定要替换的月day指定要替换的日 timetuple ()返回time.struct_time对象类似于time.localtime()返回的结果 weekday()返回当前日期是星期几0 ~ 6。星期一返回0星期日返回6。 toordinal()返回当前日期的序数。1年1月1日序数为11年1月2日序数为2以此类推 strftime(format)根据format指定的格式显示当前的日期对象。 类方法today()类方法返回当前的日期。 fromtimestamp(timestamp)从参数指定的timestamp时间戳即从新纪元走过的秒数中创建date对象。 fromordinal(ordinal)根据参数指定的ordinal序数创建date对象。
2time类
time类提供针对时间的操作
构造器 time(hour0, minute0, second0, microsecond0)创建参数指定的time对象。hour指定小时minute指定分钟second指定秒micorsecond指定微秒。 实例属性 hour / minute / second / microsecond返回小时 / 分钟 / 秒 / 微秒 类属性 max / min最早的 / 最晚的time对象 resolution类属性两个不同time对象的最小差距值 实例方法 replace(hourself.hour, minuteself.minute, secondself.second, microsecondself.microsecond)创建一个新的time对象值为参数指定的值替换之后的结果。hour指定要替换的小时minute指定要替换的分钟second指定要替换的秒microsecond指定要替换的微秒。 strftime(format)根据format指定的格式显示当前的时间对象。
3datetime类
datetime类提供针对日期与时间的操作相当于是date与time两个类功能的并集。
构造器 datetime(year, month, day, hour0, minute0, second0, microsecond0)用来创建参数指定日期的datetime对象。yearmonth与day三个参数是必须的。 实例属性 year / month / day返回年 / 月 / 日 hour / minute / second / microsecond返回小时 / 分钟 / 秒 / 微秒。 类属性 max / min最早的 / 最晚的datetime对象 resolution类属性两个不同datetime对象的最小差距值 实例方法 date()返回date对象年月日与datetime对象的年月日相同。 time()返回time对象时分秒微秒与datetime对象的时分秒微秒相同。 ctime()返回特定格式的字符串来表示日期时间。 replace(yearself.year, monthself.month, dayself.day, hourself.hour, minuteself.minute, secondself.second, microsecondself.microsecond)返回新的datetime对象值为使用当前参数替换之后的结果。 timetuple ()返回time.struct_time对象类似于time.localtime()返回的结果。 weekday()返回当前日期是星期几0 ~ 6。星期一返回0星期日返回6。 toordinal()返回当前日期的序数。1年1月1日序数为11年1月2日序数为2以此类推。 strftime(format)根据format指定的格式显示当前的日期时间对象。 类方法 today()返回当前的日期与时间。 now()返回当前的日期与时间与today方法类似。 utcnow()返回当前的日期与时间转换为UTC之后的结果。 fromtimestamp(timestamp)从参数指定的timestamp时间戳即从新纪元走过的秒数中创建datetime对象。 utcfromtimestamp(timestamp)从参数指定的timestamp时间戳即从新纪元走过的秒数中创建UTC datetime对象。 fromordinal(ordinal)根据参数指定的ordinal序数创建datetime对象。 strptime(date_string, format)根据给定的date_string日期时间字符串按照format指定的格式进行解析返回datetime对象。
4timedelta类
timedelta对象用来表示持续时间可以用来进行日期与时间的加减。
构造器;timedelta(days0, seconds0, microseconds0, milliseconds0, minutes0, hours0, weeks0)根据给定的参数创建timedelta对象表示持续时间。持续时间为各参数累计相加。
两个datetime.datetime类型相减 或两个 datetime.date类型相减 的结果就是datetime.timedelta类型
3.5 sys
sys模块提供一些与解释器相关的功能。sys提供的属性很多不过多数并不常用常见属性如下
名称描述 argv 返回一个列表列表的第一个元素为命令行运行的文件名称往后的每个元素为命令行在文件名称后面传递的每一个参数。当我们要进行一些全局性系统相关的配置时就可以使用命令行来传递参数。所传递的参数就可以通过argv来进行获取。 version 返回Python的版本信息 copyright 返回Python的版权信息 path 返回模块的搜索路径 float_info 返回浮点类型float的相关信息 platform 返回操作系统信息 exit() 退出Python解释器终止程序的执行 getsizeof(object) 返回object对象的大小以字节为单位 setrecursionlimit(n) 设置最大递归的深度