python模块
在Python里一个py文件,就可以理解为模块(module)。如果要让一个py文件能够被导入,模块名字必须遵守命名规则。
导入模块的几种方式:
-
import 模块名
-
from 模块名 import 功能名
-
from 模块名 import *
-
import 模块名 as 别名
-
from 模块名 import 功能名 as 别名
在Python中用关键字import来引入某个模块,比如要引入系统模块math,就可以在文件最开始的地方用import math来引入。
import 模块1,模块2,... #导入方式 模块名.函数名() #使用模块里的函数
如果多个模块中有相同的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用谁?所以导入函数的时候要加上模块名。
import math print(math.sqrt(2)) #正确 print(sqrt(2)) #报错
2、from...import
如果只需要调用模块中的某个或某些指定的函数,只需要引入该函数即可,此时可以用以下方法实现:
from 模块名 import 函数名1、函数名2...
不仅可以引入函数,还可以引入一些全局变量、类等。
注意通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当导入两个模块的时候如果含有相同的函数名,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function(),模块B中也有函数function(),如果导入A中的function()在先,B中的function()在后,那么当调用function()函数的时候,是去执行模块B中的function()函数。
from fib import fibonacci
此时不会把整个模块(fib)导入到当前的命名空间中,它只会将fib里的fibonacci单个函数引入。
把一个模块的所有内容全部导入到当前的命名空间也是可行的,只需使用如下声明:
from 模块名 import *
这提供了一个简单的方法来导入一个模块中所有的项目。然而这种声明不该被过多的使用。
4、from 模块名 import 功能名 as 别名
import time as ti #导入模块设置别名为ti,ti代替的是模块名time time.sleep(2) #报错 ti.sleep(2) #使用别名才能调用方法
from time import sleep as sp #导入方法时设置别名sp,sp代替的是方法名
sleep sleep(1) #报错
sp(1) #使用别名才能调用方法
为了方便程序员开发代码,Python提供了很多内置的模块给程序员用来提高编码效率。
本文浅谈os模块/sys模块/math模块/random模块/datetime模块/time模块/calendar模块/hashlib模块/hmac模块/copy模块/uuid模块/
1、OS模块
import os os.getcwd() #获取当前的工作目录,即当前python脚本工作的目录 os.chdir('test') #改变当前脚本的工作目录,相当于shell下的cd命令 os.rename('abc.txt','cba.txt') #文件重命名 os.remove('cba.txt') #删除文件 os.rmdir('demo') #删除空文件夹 os.removedirs('demo') #删除空文件夹 os.mkdir('demo') #创建一个文件夹 os.chdir('c:\') #切换工作目录 os.listdir('c:\') #列出指定目录里的所有文件和文件夹 os.name #nt(windows) posix(其他) os.environ #获取到环境配置 os.environ.get('PATH') #获取指定的环境配置 os.path.abspath(path) #获取path规范化的绝对路径 os.path.exists(path) #如果path存在,则返回True os.path.isdir(path) #如果path是一个存在的目录,返回True,否则返回False os.path.isfile(path) #如果path是一个指定的文件,返回True,否则返回False os.path.splitext(path) #用来将指定路径进行分离,可以获取到文件的后缀名
2、sys模块
import sys sys.path #模块的查找路径 sys.args #传递给Python脚本的命令行参数列表 sys.exit(code) #让程序以指定的退出码结束 sys.stdin #标准输入。可以通过它来获取用户的输入 sys.stdout #标准输出。可以通过修改它来来改变默认输出 sys.stderr #错误输出。可以通过修改它来改变错误删除
3、math模块
import math print(math.fabs(-100)) #取绝对值 print(math.ceil(3.24)) #向上取整 print(math.factorial(5)) #计算阶乘 print(math.floor(34.123)) #向下取整 print(math.pi) #π的值,约等于3.1415926 print(math.pow(2,10)) #2的10次方 print(math.sin(math.pi/6)) #正弦值 print(math.cos(math.pi/3)) #余弦值 print(math.tan(math.pi/2)) #正切值
4、random模块
random.random() #生成[0,1)的随机浮点数 random.uniform(20,30) #生成[20,30]的随机浮点数 random.randint(10,30) #生成[20,30]的随机整数 random.randrange(20,40) #生成[20,30)的随机整数 random.choice('abcde') #从列表里随机取出一个元素 random.sample('abcdefg',3) #从列表里随机取出指定个数的元素
5、datetime模块
import datetime datetime.date(2020,4,28) #创建一个日期 datetime.time(15,22,19) #创建一个时间 datetime.datetime.now() #获取当前的日期时间 datetime.datetime.now()+datetime.timedelta(3) #计算三天后的日期时间
6、time模块
time.time() #获取从1970-01-01 00:00:00 UTC到现在时间的秒数 time.strftime("%Y-%m-%d %H:%M:%S") #按照指定格式输出时间 time.asctime() #Mon Apr 15 20:02:22 2020 time.ctime() #Mon Apr 15 20:02:22 2020 print('hello') print(time.sleep(6)) #让线程暂停6秒 print('world')
7、calendar模块
calendar.setfirstweekday(calendar.SUNDAY) #设置每周起始日期码。周一到周日分别对应 0-6 calendar.firstweekday() #返回当前每周起始日期的设置。默认情况下,首次载入calendar模块时返回0,即星期一 c=calendar.calendar(2020) #生成2020年日历,并且以周日为起始日期码 print(c) #打印2020年日历 calendar.isleap(2020) #True 闰年返回True 否则返回False calendar.leapdays(1990,2020) #获取1990年至2020年一共有多少个闰年 calendar.month(2020,3) #2020年3月的日历
8、hashlib模块
import hashlib str='这是一个测试' #待加密信息 h1=hashlib.md5('hello'.encode(encoding='utf8')) print('MD5加密后为:'+h1.hexdigest()) # MD5加密后为:5d41402abc4b2a76b9719d911017c592 h1=hashlib.sha1('12345'.encode()) print(h1.hexdigest()) #8cb2237d0679ca88db6464eac60da96345513964 h2=hashlib.sha224('12345'.encode()) print(h2.hexdigest()) #a7470858e79c282bc2f6adfd831b132672dfd1224c1e78cbf5bcd057 h3=hashlib.sha256('12345'.encode()) print(h3.hexdigest()) #5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5 h4=hashlib.sha384('12345'.encode()) print(h4.hexdigest()) #0fa76955abfa9dafd83facca8343a92aa09497f98101086611b0bfa95dbc0dcc661d62e9568a5a032ba81960f3e55d4a
9、hmac模块
import hmac h=hmac.new('h'.encode(),'你好'.encode()) #随机key:h 加密字符串:‘你好’ result=h.hexdigest() print(result) #获取加密后的结果
10、copy模块
- copy.copy 是将父对象的值复制了一份,但是子对象指向同一内存地址
- copy.deepcopy 将父子对象的值全部复制一份,和原对象已没有任何关系
import copy a = [1,2,3,4,['a','b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) d = copy.deepcopy(a) a.append(5) a[4].append('c') print('a=',a) #a= [1, 2, 3, 4, ['a', 'b', 'c'], 5] print('b=',b) #b= [1, 2, 3, 4, ['a', 'b', 'c'], 5] print('c=',c) #c= [1, 2, 3, 4, ['a', 'b', 'c']] print('d=',d) #d= [1, 2, 3, 4, ['a', 'b']]
11、uuid模块
方法
|
作用
|
uuid.uuid1()
|
基于MAC地址,时间戳,随机数来生成唯一的uuid,可以保证全球范围内的唯一性。
|
uuid.uuid2()
|
算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。不过需要注意的是python中没有基于DCE的算法,所以python的uuid模块中没有uuid2这个方法。
|
uuid.uuid3(namespace,name)
|
通过计算一个命名空间和名字的md5散列值来给出一个uuid,所以可以保证命名空间中的不同名字具有不同的uuid,但是相同的名字就是相同的uuid了。【感谢评论区大佬指出】namespace并不是一个自己手动指定的字符串或其他量,而是在uuid模块中本身给出的一些值。比如uuid.NAMESPACE_DNS,uuid.NAMESPACE_OID,uuid.NAMESPACE_OID这些值。这些值本身也是UUID对象,根据一定的规则计算得出。
|
uuid.uuid4()
|
通过伪随机数得到uuid,是有一定概率重复的
|
uuid.uuid5(namespace,name)
|
和uuid3基本相同,只不过采用的散列算法是sha1
|
import uuid print(uuid.uuid1()) #根据时间戳和机器码生成uuid,可以 print(uuid.uuid4()) #随机生成uuid,可能会有重复 ''' 使用命名空间和字符串生成uuid。 注意两点: 1、命名空间不是随意输入的字符串,它也是一个uuid类型的数据 2、相同的命名空间和相同的字符串,生成的uuid是一样的。 ''' print(uuid.uuid3(uuid.NAMESPACE_DNS,'hello')) print(uuid.uuid5(uuid.NAMESPACE_OID,'hello'))
三、自定义模块
创建一个模块非常简单,安装标识符的命名规则创建一个py文件就是一个模块。但是问题是,我们需要把创建好的这个py文件放在哪个位置,在代码中使用import语句才能找到这个模块呢?
import sys print(sys.path) # ['E:\cblog_essay', # 'E:\cblog_essay', # 'D:\anaconda\python38.zip', # 'D:\anaconda\DLLs', # 'D:\anaconda\lib', # 'D:\anaconda', # 'D:\anaconda\lib\site-packages', # 'D:\anaconda\lib\site-packages\win32', # 'D:\anaconda\lib\site-packages\win32\lib', # 'D:\anaconda\lib\site-packages\Pythonwin']
2、__all__的使用
a='hello' def fn(): print('我是test1模块里的fn函数')
test2.py:模块里有__all__属性
x='你好' y='good' def foo(): print('我是test2模块里的foo函数') __all__=('x','foo')
导入test1.py和test2.py
from test1 import * from test2 import * print(a) fn() print(x) #print(y) 会报错,test2的__all__里没有变量y foo()
3、模块里的私有成员
m='早上好' _n='下午好' def _bar(): print('我是test3里的bar函数')
导入test3.py
from test3 import *
print(m)
#print(_n) 会报错,导入test3时,_n不会被导入
import test3
print(test3._n) #也可以强行使用,但是强烈不建议
4、__name__使用
在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息。
test.py
def add(x,y): return x+y #以下这段代码只有直接运行这个文件进行测试时才要执行 #如果别的代码导入本模块,这段代码不应该被执行 result=add(2,5) print('测试的结果是:',result)
demo.py
import test.py #只要导入了test.py,就会立刻执行test.py代码,打印测试内容
为了解决这个问题,python在执行一个文件时有个变量__name__。在python中,当直接运行一个py文件时,这个py文件里的__name__值是__main__,据此可以判断一个py文件是被直接执行还是以模块的形式导入。
def add(x,y): return x+y if __name__=='__main__': #只有直接执行这个py文件,__name__的值才是__main__ #以下代码只有直接运行这个文件才会执行,如果是文件被别的代码导入,下面的代码不会执行 result=add(12,22) print('测试的结果是:',result)