python学习No6
- 装饰器
- 模块
- 一些模块
- os
- sys
- math
- random
- datetime
- time
- calendar
- hashlib、hmac
- uuid
- pip命令的使用及其配置
- 检查是否配置好pip:
- 使用pip
- 下载安装包
- 卸载安装包
- 其他命令
- 使用自定义模块
- 包的使用
装饰器
计算一段代码执行时间
import time #time模块可以获取当前时间
#代码运行之前,获取时间
start=time.time() #time模块里的time方法,可以获取当前时间的时间戳
#时间戳是从1970-01-01 00:00:00 中国是UTC+8 到现在(转换成国际时间要减8)的秒数
print('start=',start)
x =1
for i in range(1,100000):
x+=i
print(x)
end=time.time()
print('代码运行时间:',end-start)
start=time.time()
print('hello')
time.sleep(3)#休眠代码
print('word')
end=time.time()
print('代码运行时间:',end-start)
装饰器使用
#装饰器
import time
def cal_time(fn):
print('fn={}'.format(fn))
def inner():
start=time.time()
fn()
end=time.time()
print('代码耗时',end-start)
return inner
@cal_time #第一件事调用cal_time立马调用#第二件事,把demo传给fn
def demo():
x=0
for i in range(1,10000):
x+=1
print(x)
#第三件事:当再次调用demo函数时,此时的demo已经不是demo了
#而是inner
demo()
print('装饰后的demo函数是{}'.format(demo))
#装饰后的demo函数是<function cal_time.<locals>.inner at 0x000001A2FF1A7B80>
装饰器的详解
import time
def cal_time(fn):
print('fn={}'.format(fn))
def inner(x,*args,**kwargs):
start=time.time()
s=fn(x)
end=time.time()
#print('代码耗时',end-start)
return s,end-start
return inner
@cal_time
def demo(n):
x=0
for i in range(1,10000):
x+=1
return x
m=demo(10000,'good',y='hello')
print('m的值为',m)#装饰器改变了原有函数传参,可以传多值
#玩游戏代码,现要求有防沉迷系统,使10点后玩不了,所以多传参clock
def play_game(name,game,clock):
if clock > 22:
print('太晚了,不能玩了')
print('{}正在玩{}'.format(name,game))
play_game('张三','王者荣耀',12)
play_game('李四','英雄联盟',23)
print('-------')
#以上并非最佳方案,由于开放封闭原则,最好不要动前面完成的代码
#故我i们使用装饰器不改变play_qame函数
def can_play(fn):
def inner(x,y,*args,**kwargs):
#if args[0]>22:
clock=kwargs.get('clock',23)#如果有clock,就用clock,如果没有就用默认值23
if clock>22:
print('太晚了,睡觉吧')
else:
fn(x,y)
return inner
@can_play
def play_game(name,game):
print('{}正在玩{}'.format(name,game))
play_game('张三','王者荣耀',a='hello',b='good',clock=12)
play_game('李四','英雄联盟',23)
模块
- 在python里的一个py文件,就可以理解为模块
- 不是所有的py文件都能作为一个模块来导入
- 如果想要让一个py文件能够被导入,模块名字必须要遵守规则(数字字母下划线)
- python为了开发,提供很多内置模块
- 格式1:import 模块名称
调用:模块名.模块中的函数
import time
print(time.time())
- 格式2:from 模块名 import 函数名,导入模块里的一个方法
from random import randint
print(randint(0, 2))#不用写random.randint()
#并没有导入random,只是拿出了randint
- 格式3:from 模块名 import * 导入这个模块的所有(所有并不是真正的所有)方法
from math import *
print(pi)#不用写成math.pi
#本质史读取模块中__all__属性,看这个函数中定义了那些属性和变量
#如果模块中没有定义__all__才会导入所有不以_开头的变量
#以一个下划线开始的变量,建议只在本模块里使用,别的模块里不要导入进去
#但是用格式1还是能用,建议别这样
#如果定义了,__all__以外的就使用不了
#比如假设__all__中没有pi则使用pi时就会报错,不可使用
#想使用就得用格式1
- 起别名
import datetime as dt#导入模块并起别名
print(dt.MAXYEAR)
#导入某个模块的某个方法,并起一个别名
from copy import deepcopy as dp#from 模块名 import 函数名 as 别名
dp(['hello','good',[1,2,3],'hi'])#深复制
一些模块
os
os模块:OperationSystem操作系统
os模块里提供的方法就是用来调用操作系统里的方法
import os
#获取操作系统的名字(windows==>nt或者非windows==>posix)
print(os.name)
#拿到路径的分隔符
print(os.sep) #windos:\ 非windows:/
#os中的path比较常用
#abspath===>获取文件绝对路径
print(os.path.abspath('模块.py'))
#isdir判断是否是文件夹
print(os.path.isdir('模块.py'))
#isfile判断是否是文件
print(os.path.isfile('模块.py'))
#exists判断是否存在
print(os.path.exists('模块.py'))
print('模块.py'.rpartition('.'))
print(os.path.splitext('模块.py'))
还有其他方法如图:
sys
sys模块:系统相关的功能
import sys
print('hello')
#查找模块的路径
print(sys.path)
sys.stdin #可以像input一样,接收用户的输入,和input相关
sys.stdout #标准输出,修改sys.stdout 可以改变默认输出位置
sys.stderr#修改sys.stderr 可以改变错误的默认输出位置
#退出程序,和内置函数exit一致
sys.exit()
print('hehehe')
math
math模块:数学计算相关的模块
import math
#求阶乘
print(math.factorial(6))
#向下取整
print(math.floor(12.98))
#向上取整
print(math.ceil(14.22))
#算幂运算
print(math.pow(2,10))
print(math.sin(math.pi/6))
random
random模块:和随机有关的代码
import random
#randint(a,b) 用来生成[a,b]的随机整数
print(random.randint(2,9))
#randrange(a,b) 用来生成[a,b)的随机整数
print(random.randrange(2,9))
#random()用来生成[0,1)的随机浮点数
print(random.random())
#choice用来在可迭代对象中随机抽取一个数据
print(random.choice(['aa','ss','dd','ff']))
#sample 用来在可迭代对象中随机抽取n个数据
print(random.sample(['aa','ss','dd','ff'],2))
datetime
datetime模块:主要显示日期时间,这里主要涉及date类,用来显示日期;time类显示时间;datetime类用来显示日期时间;timedelta类用来计算时间
import datetime as dt
print(dt.datetime.now())
time
time模块:操作时间,time模块不仅可以显示日期,还可以控制程序,让程序暂停(sleep函数)
import time
print(time.time())
print(time.strftime("%Y-%m-%d %H:%M:%S"))
print(time.asctime())
calendar
calendar模块:
import calendar
c=calendar.calendar(2019)#打印日历
print(c)
hashlib、hmac
hashlib模块和hmac模块:用来加密
import hashlib
#hashlib模块主要支持两个算法 md5和sha加密
#加密方式:单向加密:只用加密过程,不能解密md5/sha 对称加密 非对称加密rsa
#需要加密的内容必须转换为二进制
x=hashlib.md5()#生成一个md5对象
x.update('abc'.encode('utf8'))#===>x=hashlib.md5('abc'.encode('utf8'))
print(x.hexdigest())
#'abc'========>900150983cd24fb0d6963f7d28e17f72
#sha加密
h1=hashlib.sha1('1234'.encode())
print(h1.hexdigest())
h2=hashlib.sha224('1234'.encode())#224位 一个16进制占4位
print(h2.hexdigest())
h3=hashlib.sha256('1234'.encode())
print(h3.hexdigest())
h4=hashlib.sha384('1234'.encode())
print(h4.hexdigest())
import hmac
#hmac加密可以指定密钥
h=hmac.new('h'.encode(),'你好'.encode(),digestmod='MD5')
result=h.hexdigest()
print(result)
uuid
uuid模块:用来生成一个全局唯一的模块
import uuid
print(uuid.uuid1())#32个字符 每一个字符有16个选择
#print(uuid.uuid2)python不能用
print(uuid.uuid3(uuid.NAMESPACE_DNS,'lisi'))#生成固定的uuid
print(uuid.uuid5(uuid.NAMESPACE_DNS,'lisi'))#生成固定的uuid
print(uuid.uuid4())#最常用,随机
pip命令的使用及其配置
安装python时,会同时安装pip软件,可以用来查找下载安装卸载第三方资源包
检查是否配置好pip:
然后windows+R,输入cmd打开
图所示就是环境变量没有配置,在此电脑右击打开属性
然后在用户变量或者系统变量中找到path,编辑
完成后再到命令提示符中查看:
成功了!
注意:有些时候不能在c盘python文件夹scripts中找到pip,建议重装。
使用pip
下载安装包
pip install 模块名
下载后根据提示找到下载路径,我们去看看是否真的下载成功
卸载安装包
pip uninstall 模块名
其他命令
pip list 用来列出当前环境安装的模块名和版本号
pip freeze 用来列出当前环境安装的模块名和版本号
pip freeze >file_name 将安装的模块名和版本号重新定向输出到指定文件
pip install -r file_name 读取文件中的模块名和版本号并安装
使用自定义模块
自己定义一个模块其实就是自己写一个py文件。
如果一个py文件想要当作一个模块被导入,文件名一定要遵守命名规范,由数字,下划线,字母组成。
导入一个模块,就能使用这个模块的方法
在自定义模块中,如果想要一些内容不在引用该模块的那个文件中使用可以用name
#__name__:当直接运行py时,值时__main__
#如果杂蒽个py文件作为模块导入时,值是文件名
if __name__=='__main__':
print('模块中的name',__name__)
包的使用
将多个具有相似或者关联的多个模块放到一个文件夹里,便于统一管理,这个文件夹叫做包,包里面有__init__文件