【012】Python全栈日记-模块
一个模块就是一个包含python代码的文件。一个文件就是一个模块
一、为什么要使用模块
1.现在程序开发文件比较大,都放在一个文件中维护不方便,拆分成多个文件方便维护与管理
2.模块可以增加代码的重用率
二、模块的导入方式
import 模块名
作用:直接导入模块
1、 import 模块 as 别名
作用:直接导入模块,并且为模块起一个别名
2、 from 模块 import 某个函数或者类
作用:直接导入模块中的某个方法或者某个类或变量
3、from 模块 import *
作用:直接导入模块中的所有方法和类和变量
4、当你导入一个模块,Python解析器对模块位置的搜索顺序是:
(1)、当前目录
(2)、如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
(3)、如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
可使用sys.path.append(自定义路径) 添加
三、__all__特殊变量的用法
格式:
__all__ = ['模块','模块','子包'。。。] #必须是列表
例子:
用import *调用会报错:
__all__限定import *对模块中函数的调用,列表中有的是可以调用的。
四、自定义模块
模块本身就是一个文件,所有py代码都可以在文件中直接书写。不过我们开发共用模块时,最好在模块中书写以下内容。
变量 模块中的属性值
函数 单独的功能
类 相似功能组合
模块测试代码 临时使用,被导入时不会执行
五、测试代码:
测试代码经常在开发模块时用于测试模块的功能,但是测试代码仅在开发和测试时使用,被当作模块导入时不希望测试代码运行。需要使用name特殊变量来操作。
六、包
包就是文件夹,他用于存放文件也就是模块。包中也可以存放包,
在pycharm里右键新建python Package
与普通新建文件不同,新建的包自带一个__init__.py文件
在包中新建个python文件a
同样可以调用:
或者:
1、包的结构
2、包中的__all__
如果包中这么输入:
文件关系:a是求和,b是求积
运行后会发现报错,这时候就需要在__init__文件中加入__all__
在__init__.py文件中,如果没有__all__变量,那么使用from 包 import * 仅导入__init__.py中定义的方法和类及其他内容
在__init__.py文件中,如果定义all变量,那么使用from 包 import * 则会导入all指定的所有模块,而忽略init.py文件中的信息
__all__ = ['模块','模块','子包'。。。] #必须是列表
七、常用模块
(一)数学模块
(1)引入模块:import math
(2)ceil()
向上取整操作
格式:math.ceil(数值)
返回值:整型
(3)floor()
向下取整操作
格式:math.floor(数值)
返回值:整型
(4)pow()
计算一个数值的N次方
格式: math.pow(底数,幂)
返回值:浮点类型 该操作相当于**运算但是结果为浮点型
(5)sqrt()
开平方
格式:math.sqrt(数值)
返回值:浮点数
(6)fabs()
对一个数值获取其绝对值操作
格式:math.fabs(数值)
返回值:浮点数
(7)modf()
将一个浮点数拆成整数和小数部分组成的元组
格式:math.modf(数值)
返回值:元组 (小数部分,整数部分)
(8)fsum()
将一个序列的数值进行相加求和
格式:math.fsum(序列)
返回值:浮点数
1、模块提供的常见值
pi
圆周率:3.141592653589793
2、内置函数
(1)round()
四舍五入操作
格式:round(数值)
返回值:整数
注意:此函数不在math模块当中!!!
(2)abs()
对一个数值获取其绝对值操作
格式:abs(数值)
返回值:可能是整数可以能浮点数
注意:abs() 他是内建函数 同时返回值根据原类型决定
(3)sum()
将一个序列的数值进行相加求和
格式:sum(序列)
返回值:数值类型
(4)max()
获取最大值
格式1:max(序列)
返回值:序列中的最大值
格式2:max(参数1,参数2...)
返回值:多个参数中的最大值
(5)min()
获取最小值
格式1:min(序列)
返回值:序列中的最小值
格式2:min(参数1,参数2...)
返回值:多个参数中的最小值
(6)pow()
获取一个数值的N次方
(二)time模块
必须导入 time 模块
import time
1、时间戳
时间戳是一种用于表示时间的方式。从1970年1月1日0时0分0秒0毫秒开始到指定时间的秒数。时间戳也叫做UNIX时间戳,1970年1月1日成为UNIX元年。
作用:是为了方便时间的统一运算。
(1).从1970年1月1日开始计算。
(2).能够使用到2038年的某一天
2、时间元组
时间元组就是一个用于表示时间格式的元组数据而已,他是time模块操作时间的主要方式。
(tm_year=2017, tm_mon=7, tm_mday=4, tm_hour=9, tm_min=4, tm_sec=21, tm_wday=1, tm_yday=185, tm_isdst=0)
格式:(年,月,日,时,分,秒,周几,一年中的第几天,是否是夏令时(0是 其他不是))
(1)time()
功能:获取当前本地的时间戳
格式:time.time()
返回值:浮点数时间戳
(2)localtime()
功能:获取当前时间元组
格式1:time.localtime()
返回值:本地时间元组
格式2:time.localtime(时间戳)
返回值:指定时间戳的本地时间元组
结果:
(3)gmtime()
功能:获取当前UTC时间元组
格式1:time.gmtime()
返回值:当前UTC时间元组
格式2:time.gmtime(时间戳)
返回值:指定时间戳的UTC时间元组
(4)mktime()
功能:使用时间元组制作时间戳
格式:time.mktime(时间元组)
返回值:时间戳
注意:按照本地时间来进行计算
输出结果为:
这是把现在时间转为秒。
(5)ctime()
功能:获取本地时间的字符串格式
格式1: time.ctime()
返回值:时间格式字符串 相当于 asctime(localtime())
格式2: time.ctime(时间戳)
返回值:时间格式字符串 相当于asctime(localtime(时间戳))
结果:
(6)asctime()
功能:返回一个正常的可读的时间字符串
格式:time.asctime(时间元组)
返回值:时间字符串
(7)sleep()
功能:程序睡眠,使得程序在此处等待指定的时间
格式:time.sleep(时间秒数)
返回值:无
(8)strftime()
功能:格式化输出时间字符串(str foramt time)
格式:time.strftime('字符串格式'[,时间元组])
返回值:格式化之后的哦字符串
结果:
格式 含义
%a 本地(locale)简化星期名称
%A 本地完整星期名称
%b 本地简化月份名称
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 一个月中的第几天(01 - 31)
%H 一天中的第几个小时(24 小时制,00 - 23)
%I 一天中的第几个小时(12 小时制,01 - 12)
%j 一年中的第几天(001 - 366)
%m 月份(01 - 12)
%M 分钟数(00 - 59)
%p 本地 am 或者 pm 的相应符
%S 秒(01 - 61)
%U 一年中的星期数(00 - 53 星期天是一个星期的开始)第一个星期天之前的所有天数都放在第 0 周
%w 一个星期中的第几天(0 - 6,0 是星期天)
%W 和 %U 基本相同,不同的是 %W 以星期一为一个星期的开始
%X 本地相应时间
%y 去掉世纪的年份(00 - 99)
%Y 完整的年份
%z 用 +HHMM 或 -HHMM 表示距离格林威治的时区偏移(H 代表十进制的小时数,M 代表十进制的分钟数)
%% %号本身
(9)strptime()
功能:解析时间字符串成一个元组,strftime的逆向操作(str parse time)
格式:time.strptime('时间字符串','时间字符串格式')
返回值:时间元组
结果:
3、时间模块的值
timezone
获取当前时区与格林尼治所在时区的相差的秒数(推荐)
altzone
获取当前时区与格林尼治所在时区的相差的秒数,在有夏令时的情况下
(三)String模块
(1)ascii_letters
获取所有ascii码中字母字符的字符串(包含大写和小写)
(2)ascii_uppercase
获取所有ascii码中的大写英文字母
(3)ascii_lowercase
获取所有ascii码中的小写英文字母
(4)digits
获取所有的10进制数字字符
(5)octdigits
获取所有的8进制数字字符
(6)hexdigits
获取所有16进制的数字字符
(7)printable
获取所有可以打印的字符
(8)whitespace
获取所有空白字符
(9)punctuation
获取所有的标点符号
时间模块练习题:
假设你有一张银行卡被冻结,冻结时间为7天,从2018年11月11日15点03分开始冻结,计算冻结还剩余时间,输出为年月日的格式,并每一秒减时间都会变化。
过程:
结果:
八、Python中包、模块、类的区别
先看一个面试标准错误答案:
你要这么回答真的可以回家洗洗睡了。
1、 类
类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。
2、 模块
模块,在Python可理解为对应于一个文件。在创建了一个脚本文件后,定义了某些函数和变量。你在其他需要这些功能的文件中,导入这模块,就可重用这些函数和变量。一般用module_name.fun_name,和module_name.var_name进行使用。这样的语义用法使模块看起来很像类或者名字空间,可将module_name 理解为名字限定符。模块名就是文件名去掉.py后缀。
模块属性__name__,它的值由Python解释器设定。如果脚本文件是作为主程序调用,其值就设为__main__,如果是作为模块被其他文件导入,它的值就是其文件名。
3、 包
通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。
在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。
作业:
第1题. 写个装饰器,修饰一个函数
函数的内容是输入一个数返回此数前面所有数的列表推导式
装饰器要求,计算此函数总共运行了多长时间
第2题. 用生成器实现,斐波那契数列。实现调用一次,打印一个数
第3题、文件管理系统 (尽量使用函数实现)
| 1、查看目录列表(列出目录下所有的文件和目录)
显示出是文件还是目录
| 2、创建目录
| 3、删除文件或目录
需要检查文件或目录是否存在
可以删除文件也可以删除目录
4、重命名文件或目录
需要检查文件或目录是否存在
| 5、为文件添加前缀
为当前目录下的所有文件,添加文件名前缀,前缀需要用户输入
| 6、删除文件前缀
删除当前目录下所有文件名的前缀,前缀需要用户输入
| 7、切换目录
切换目录后,显示目录下所有文件和目录
第4题、
一张银行卡 在2018年10月24日 10:10:10秒 因为三次密码被冻结了,冻结时间是7天,假设现在的时间是2018年10月25 日10:09:08秒,请写一个代码显示您还有多少天多少小时多少分多少秒解冻
要求(dongjie,normal)两个目录是同一目录下的两个目录
1、 函数写在目录:dongjie文件夹下的jiedong.py里
2、 调用的代码写在目录:normal 文件夹下的bank.py 里