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'))

还有其他方法如图:

python显示00_版本号

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')

python显示00_版本号_02

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))

python显示00_python显示00_03

datetime

datetime模块:主要显示日期时间,这里主要涉及date类,用来显示日期;time类显示时间;datetime类用来显示日期时间;timedelta类用来计算时间

import datetime as dt
print(dt.datetime.now())

python显示00_版本号_04

time

time模块:操作时间,time模块不仅可以显示日期,还可以控制程序,让程序暂停(sleep函数)

import time
print(time.time())
print(time.strftime("%Y-%m-%d %H:%M:%S"))
print(time.asctime())

python显示00_python_05

calendar

calendar模块:

import calendar
c=calendar.calendar(2019)#打印日历
print(c)

python显示00_python_06

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())#最常用,随机

python显示00_python_07

pip命令的使用及其配置

安装python时,会同时安装pip软件,可以用来查找下载安装卸载第三方资源包

检查是否配置好pip:

python显示00_版本号_08


python显示00_python显示00_09


然后windows+R,输入cmd打开

python显示00_python_10


图所示就是环境变量没有配置,在此电脑右击打开属性

python显示00_python显示00_11

python显示00_python_12


然后在用户变量或者系统变量中找到path,编辑

python显示00_版本号_13


完成后再到命令提示符中查看:

成功了!

python显示00_python_14


注意:有些时候不能在c盘python文件夹scripts中找到pip,建议重装。

使用pip
下载安装包

pip install 模块名

python显示00_bc_15


下载后根据提示找到下载路径,我们去看看是否真的下载成功

python显示00_python_16

卸载安装包

pip uninstall 模块名

python显示00_版本号_17


python显示00_版本号_18

其他命令

pip list 用来列出当前环境安装的模块名和版本号
pip freeze 用来列出当前环境安装的模块名和版本号
pip freeze >file_name 将安装的模块名和版本号重新定向输出到指定文件
pip install -r file_name 读取文件中的模块名和版本号并安装

使用自定义模块

自己定义一个模块其实就是自己写一个py文件。

如果一个py文件想要当作一个模块被导入,文件名一定要遵守命名规范,由数字,下划线,字母组成。

导入一个模块,就能使用这个模块的方法

python显示00_python_19


在自定义模块中,如果想要一些内容不在引用该模块的那个文件中使用可以用name

#__name__:当直接运行py时,值时__main__
#如果杂蒽个py文件作为模块导入时,值是文件名
if __name__=='__main__':
    print('模块中的name',__name__)

包的使用

将多个具有相似或者关联的多个模块放到一个文件夹里,便于统一管理,这个文件夹叫做包,包里面有__init__文件

python显示00_python_20