模块
-
获取一段代码的时长
- 导入time模块
- time模块time获取的是UTC从197-01-01-00:00:00到现在的秒数
import time def count_time(fn,n): start_time=time.time() #time模块time获取的是UTC从197-01-01-00:00:00到现在的秒数 fn(n) end_time=time.time() return end_time-start_time def foo(n): s=0 for i in range(n): s+=i return s print(count_time(foo, 100000000))
-
装饰器
- 定义和调用装饰器的格式
- 第一步是调用函数cac_time;第二步是将demo函数赋值给fn
- 此时的demo函数已经是cac_time内部的inner函数了
- 当再次调用demo的时候,就相当于调用inner函数,
- 注意**@函数的下一行一定要跟着定义一个函数**
import time #定义一个装饰器的格式 def cac_time(fn): #def 函数1(参数): print('cac_time函数被调用了') #代码操作 def inner(): # def inner() start_time=time.time() #pass fn() #return inner end_time=time.time() print(end_time - start_time) return inner @cac_time #第一步是调用函数cac_time;第二步是将demo函数赋值给fn def demo(): #下面一定是跟着定义一个函数 x=0 for i in range(1,100000000): x+=i print(x) print('装饰后的demo函数{}'.format(demo)) #此时的demo函数已经是cac_time内部的inner函数了 demo() #当再次调用demo的时候,就相当于调用inner函数,
-
详解
import time def cac_time(fn): print('cac_time函数被调用了') def inner(x,*args,**kwargs): #装饰器的好处 start_time=time.time() m=fn(x) end_time=time.time() print(end_time - start_time) return m,end_time - start_time return inner @cac_time #第一步是调用函数cac_time;第二步是将demo函数赋值给fn def demo(n): s=0 for i in range(1,n): s+=i return s print('装饰后的demo函数{}'.format(demo)) #此时的demo函数已经是cac_time内部的inner函数了 #当再次调用demo的时候,就相当于调用inner函数, x=demo(100000,'hello',y='good') #不会报错,因为此时的demo函数时inner函数 print(x)
-
装饰器可以在不修改一个函数的前提下对函数进行优化
- #如果采用下面写法,就必须有args参数输入.可以采用缺省参数的方法,或者使用关键字,注意使用关键字时要使用get方法,不然输入的关键字找不到会报错
def can_play(fn): def inner(name,game,*args,**kwargs): if args[0]<22: #如果采用这种写法,就必须有args参数输入,所以可以采用缺省参 fn(name,game) #数的方法,或者使用关键字,注意使用关键字的写法,要使用 else: #get方法,不然输入的关键字找不到会报错 print('太晚了,休息吧') return inner @can_play def play_game(name,game): print('{}正在玩儿{}'.format(name,game)) play_game('zhangsan','王者荣耀',18) play_game('lisi','吃鸡',22)
- 定义和调用装饰器的格式
-
模块
模块:就是一个py文件,导入一个模块就相当于将这个模块文件添加到新的py文件里
只有满足命名规则的py文件才能称为模块
-
导入模块的五种方式
-
**import 模块名 ** 直接导入一个模块
-
from 模块名 import 函数名 直接导入模块里的某个方法
-
from 模块名 import ** 导入模块里的"所有"**方法与变量
-
import 模块名 as 别名 ** 导入模块并起一个别名**
-
from 模块名 import 函数名 as 别名 导入函数并起一个别名
import time # import 模块名 直接导入一个模块 from random import randint #from 模块名 import 函数名 直接导入模块里的某个方法 from math import * #from 模块名 import * 导入模块里的"所有"方法与变量 import datetime as dt #from 模块名 as 别名 导入模块并起一个别名 from copy import deepcopy as dp #from 模块名 import 函数名 as 别名 导入函数并起一个别名 print(time.time()) #此时调用模块里的的函数,前面需要加模块名 print(randint(0, 2)) #此时调用就不需要加模块名 print(pi) #调用不需要加模块名 print(dt.time) #调用时可以使用别名 dp([0,1,2,3])
-
-
os模块 operator system的简称
是对操作系统处理方法的模块
import os print(os.name) #获取操作系统的名字:windows==>nt,非windows==>posix print(os.sep) #获取路径的分割符 print(os.getcwd()) #获取当前的工作目录 os.chdir('../') #改变工作目录:到上一层工作路径 print(os.getcwd()) os.chdir('F:\\between jobs/python的代码/2021.1.22') #路径的分割用反向斜划线或者\\ #os.rename('01装饰器.py', '01装饰器格式及应用') #修改文件名 #os.remove('xx.py') #删除文件 #os.rmdir('zzz') #删除一个空文件夹 #os.mkdir() #创建一个文件夹 #print(os.listdir('C:\\')) #获取指定目录下面的所有文件与文件夹,默认是当前文件夹 #os里面的path经常用到 #找到一个文件的绝对路径 print(os.path.abspath('01装饰器.py')) #判断(默认是当前文件夹)是否是一个文件夹 print(os.path.isdir('01装饰器.py')) print(os.path.isdir('zzz')) #判断(默认是当前文件夹)是否是一个文件 print(os.path.isfile('01装饰器.py')) print(os.path.isfile('zzz')) #判断(默认是当前文件夹)是否存在该文件 print(os.path.exists('01装饰器.py')) file_name='2021.1.25.demo.py' # print(file_name.rpartition('.')) #分割成两份 print(os.path.splitext(file_name)) #获取文件名和后缀 #result nt \ F:\between jobs\python的代码\2021.1.22 F:\between jobs\python的代码 F:\between jobs\python的代码\2021.1.22\01装饰器.py False False False False False ('2021.1.25.demo', '.py')
-
sys模块
import sys print(sys.path) #模块的路径 #sys.stdin 功能与input类似 #sys.stdout 改变输出的位置,默认是控制台 #sys.sderr 改变提示错误输出的位置,默认是控制台 sys.exit() #用法与内置函数exit类似
-
math模块
import math print(math.floor(12.60)) #向下取整 print(math.ceil(13.21)) #向上取整 print(math.factorial(6)) #求阶乘 #round() 是内置函数表示四舍五入 #三角函数在这个模块里,但注意要用弧度
-
random模块
- 获取随机(整)数(步长)
- 随机抽取样本
import random print(random.randint(2,9)) #在[2,9]中随机抽一个整数 print(random.randrange(2,9)) #在[2,9)中随机抽一个整数,这个可以控制步长 print(random.random()) #在[0,1)随机抽一个数 print(random.choice(['zhangsan', 'lisi', 'Jerry', 'Jack', 'Harry'])) #在一个可迭代对象里面随机选择一个 print(random.sample(['zhangsan', 'lisi', 'Jerry', 'Jack', 'Harry'], 3)) #在一个可迭代对象里面随机选择n个
-
datetime模块
import datetime as dt print(dt.datetime.now()) #获取当前的时间 dt.date(2021,1,1) #创建一个日期 dt.time(20,17,52) #创建一个时间 print(dt.datetime.now() + dt.timedelta(3)) #现在时刻的三天后日期
-
time模块
import time print(time.time()) #获取时间戳 time.strftime("%Y-%m-%d %H:%M:%S") #以指定格式输出时间 print(time.asctime()) #输入一个元组 print(time.ctime()) #需要输入时间戳 print('hello') print(time.sleep(10)) #代码睡眠10s print('word')
-
calendar模块 :日历模块
- 打印一年的日历,一个月的日历
- 设置一周第一天
- 判断闰年
import calendar calendar.setfirstweekday(calendar.SUNDAY)#设置每一周的第一天是周日,周一到周日与0-6 print(calendar.firstweekday()) c=calendar.calendar(2021) #获取2021的日历 print(c) print(calendar.isleap(2000)) #判断是否是闰年 print(calendar.leapdays(1996, 2012)) #判断之间有几个闰年 print(calendar.month(2021,2)) #打印2021年2月份的日历
-
hashlib和hmac模块:加密模块
- hashlib支持md5加密和sha加密
- hmac支持指定秘钥加密
import hashlib #这两个模块是用来加密的 支持md5加密和sha加密 import hmac #支持指定秘钥加密 x=hashlib.md5() #使用md5加密的格式: 将加密内容(字符串)转换为二进制 x.update('abc'.encode('utf8')) y=hashlib.md5('123565'.encode()) print(x) print(x.hexdigest()) print(y.hexdigest()) #文件的md5:一般校验文件是否被篡改的方式 #sha系列加密 h1=hashlib.sha1('123456'.encode()) print(h1.hexdigest()) h2=hashlib.sha224('123456'.encode()) print(h2.hexdigest()) h3=hashlib.sha256('123456'.encode()) print(h3.hexdigest()) h4=hashlib.sha384('123456'.encode()) print(h4.hexdigest()) h=hmac.new('h'.encode(),'你好'.encode()) #使用指定秘钥加密 print(h.hexdigest()) #result <md5 HASH object @ 0x0000000002471D20> 900150983cd24fb0d6963f7d28e17f72 e86228f32ba83d6ff2aaa160c1f900a6 7c4a8d09ca3762af61e59520943dc26494f8941b f8cdb04495ded47615258f9dc6a3f4707fd2405434fefc3cbf4ef4e6 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 0a989ebc4a77b56a6e2bb7b19d995d185ce44090c13e2984b7ecc6d446d4b61ea9991b76a4c2f04b1b4d244841449454 0c3e0484c4e8ae8613b10f471a31ced8
-
uuid模块
#uuid模块,生成全局唯一的id import uuid print(uuid.uuid1()) #根据时间戳,MAC地址,随机数生成的全球唯一id print(uuid.uuid3(uuid.NAMESPACE_DNS,'zhangsan')) #生成一个固定的id 基于md5 print(uuid.uuid5(uuid.NAMESPACE_DNS,'zhangsan')) #生成一个固定的id 基于sha print(uuid.uuid4()) #根据随机数产生的一个随机id #result 8ca2099e-5f16-11eb-a8b0-dc85def8b534 d51a47a6-3157-39a9-94d3-70ecb9fda86e 8e117ce0-eb96-5ae8-84b7-621521f751b6 38930ce0-b5d0-40e8-b381-a778aa1f45e5
-
-
使用pip管理第三方模块
-
基本操作
- pip install <package_name>用来下载第三方包模块
- pip uninstall<package_name>用来删除第三方模块
- pip list 列出已经安装的第三方的模块m名和版本号
- pip freeze 列出已经安装的第三方的模块m名和版本号
- pip freeze > file_name 将第三方模块名与版本号存到指定文件里
- pip install -r file——name 读取指定文件里的内容并下载
- pip install <package_name> -i 从指定路径下载第三方模块(临时修改一次)
-
国内常见镜像服务器
-
清华大学镜像站 https://mirror.tuna.tsinghua.edu.cn/
-
阿里云镜像站 https://developer.aliyun.com/mirror/
-
网易云镜像站 http://mirrors.163.com/
-
华中科技大镜像站 http://mirror.hust.edu.cn/
-
北京交通大学镜像站 https://mirror.bjtu.edu.cn/
-
中国科学技术大学镜像站 https://mirror.bjtu.edu.cn/
-
搜狐镜像站 http://mirrors.sohu.com/
-
豆瓣:https://pypi.douban.com/simple/
-
-
-
使用自定义的模块
-
自定义模块的使用
-
模块名必须满足命名规则
-
from <模块名> import ,当该模块有时,是导入__all__=[ ,]里面的所有变量和方法;当该模块没有设置*__all__时,是默认导入所有不以一个下划线作为开头的函数和变量**,
-
通过import <模块名>,以一个下划线开头的函数变量有时可以被调用,有时候会出错,有一种产生这种错误的原因,可能是在模块的里面将那个函数变量删除了
-
如果不想让别人用自己写的模块里的函数或者变量,可以以一个下划线开头
-
导入模块时,会将里面的操作执行一遍:使用__name__可以不让测试结果显示
- 如果在模块本身运行,那么就是’main’,如果是作为模块导入,那么就是文件名
def division(x,y): return x/y if __name__=='__main__': #如果在模块本身运行,那么就是’__main__',如果是作为模块导入,那么就是文件名 print('测试division函数,测试结果为{}'.format(division(4, 2)))
-
-
-
包的使用