文章目录
python-装饰器、高阶函数、模块
(一)装饰器
一、装饰器
在不改变原函数的情况下,为原函数添加功能
def guanjia(fn):
print(fn.__name__) # __name__ :
def inner():
print("开挂")
fn()
print("关闭外挂")
return inner
@guanjia
def play_wz():
print("小鲁班无敌")
@guanjia
def play_lol():
print("乌鲁乌鲁,德玛西亚")
play_wz()
play_lol()
二、装饰器的解包拆包
def guanjia(fn):
def inner(*args,**kwargs):
print("开挂")
fn(*args,**kwargs) # 这里的*号是解包拆包
print("关闭外挂")
return inner
@guanjia
def play_wz(uname,pwd):
print("小鲁班无敌,耶~~")
print(f"用户名是{uname},密码是{pwd}")
@guanjia
def play_lol(uname,pwd,area):
print("乌鲁乌鲁,德玛西亚")
print(f"用户名是{uname},密码是{pwd},地区是{area}")
play_wz("zs","123456")
play_lol(uname = "lisi",pwd = "987654",area = "chengdu")
三、装饰器的返回值
def guanjia(fn):
# print(fn.__name__)
def inner(*args,**kwargs):
print("开挂")
ret = fn(*args,**kwargs) # 这里的*号是解包拆包
print("关闭外挂")
return ret
return inner
@guanjia
def play_wz(uname,pwd):
print("小鲁班无敌,耶~~")
print(f"用户名是{uname},密码是{pwd}")
return "小鲁班厉害呀!"
@guanjia
def play_lol(uname,pwd,area):
print("乌鲁乌鲁,德玛西亚")
print(f"用户名是{uname},密码是{pwd},地区是{area}")
a = play_wz("zs","123456")
print(a)
play_lol(uname = "lisi",pwd = "987654",area = "chengdu")
(二)高阶函数
一、一个函数被多个装饰器装饰
def wrapper1(fn):
def inner():
print("1111111")
fn()
print("1111111")
return inner
def wrapper2(fn):
def inner(*args,**kwargs):
print("2222")
fn()
print("2222")
return inner
@wrapper1
# 说明:test = wrapper1(test) = wrapper1(wrapper2.inner) ----> wrapper1.inner
@wrapper2
# 说明:test = wrapper2(test) ----> wrapper2.inner
def test():
print("我是函数")
test()
二、map( )
1、结构:map(将来可以被调用的,可迭代数据(可通过for循环迭代的))
2、map() :最终返回的是一个可迭代对象
3、从可迭代对象中取出第一个值,作为参数传递给x,执行函数体,作为第一个数据
a = map(lambda x : x*x,[1,2,3,4])
print(a) # 返回的是一个可迭代对象
for i in a:
print(i)
b = map(lambda x,y : x+y,[1,2,3,4],[5,6,7,8])
for i in b:
print(i)
三、filter( )
1、filter( ):过滤器,对指定的序列进行过滤,如果为真,则留着传入到数据 所有非0的数字都为真
2、filter() :最终返回的是一个可迭代对象
a = filter(lambda x:x%2,[1,2,3,4])
for i in a:
print(i)
# 输出结果:(不能被2整除的输出)
D:\python\python.exe E:\python笔记\day7\09-filter.py
1
3
四、reduce( )
以上一次执行的结果作为下一次x的值传入如果指定了额外的值,则第一次会将额外的值作为x传入。
from functools import reduce
a = reduce(lambda x,y : x+y,[1,2,3,4,5])
print(a)
# 输出结果:
D:\python\python.exe E:\python笔记\day7\10-reduce.py
15
(三)模块
一、模块
1、一般而言,在python中,xxx.py文件就是一个模块
2、一个模块一般只用于存储和管理一类功能的一个文件
二、包(文件夹)
1、文件夹,用来管理和存放模块的,将功能相关的模块放在一个文件夹里
2、注意:普通文件夹可以称为一个包,但是真正的包,存在_init_包里
三、导包
导包的几种方式:
1、import 模块名
import random
a = random.random() # 获取一个0-1左闭右开的随机数
print(a)
输出:
D:\python\python.exe E:\python笔记\day7\12-模块.py
0.32439913626292627
2、import 模块名 as 别名
import threading as th # as :起一个别名
th.Thread()
3、from 包 import 模块名
from threading import Thread
Thread()
4、* :导入包中所有的模块
from random import *
a = random()
print(a)
5、import 包名.模块名
四、内置模块
1、random模块
(1)randint(m,n) :[m,n]的整数随机数
(2)randrange() :取左不取右 可以设置步长
(3)random.choice([有序序列]) :随机列举有序序列中的一个值
(4)random.shuffle(x) : 洗牌打乱,就地将序列x的值随机打乱
(5)random.uniform(a,b) :返回a到b的一个随机浮点数
2、数学模块:math
(1)math.e # 显示e的值
(2)math.pi # 显示pi的值
(3)math.ceil(2.58) # 向上取整
(4)math.floor(2.58) # 向下取整
(5)math.pow(2,3) # 幂函数
(6)math.sqrt(9) # 开算术平方
(7)math.fabs(-15) # 取绝对值
(8)math.log(a) # 默认以e为底对数
(9)math.log(a,b) # 以b为底,求a的对数
(10)round(4.5) # 四舍五入全局函数,奇数遵循标准的四舍五入,偶数遵循以五为界限,五会被舍弃
3、os模块
(1)os:操作系统上的文件系统的
(2)os.curdir # 获取当前文件的路径(当前目录)
(3)os.chdir() # 修改工作目录
(4)os.chmod # 修改权限
(5)os.getcwd() # 用于获取当前工作目录的函数
(6)os.getpid() # 获取进程编号
(7)os.getppid() # 获取父进程编号
(8)os.kill(进程编号) # 杀死当前进程
(9)os.mkdir() # 创建一个目录
(10)os.makedirs() # 创建多级目录
(11)os.name # 返回操作系统的名称,nt表示Windows系统
(12)os.remove() # 移除
(13)os.rename() # 重命名 可以完成剪切
(14)os.system() # 清屏
(15)os.sep # 文件分隔符
(16)os.listdir() # 以列表的形式返回当前目录中的所有文件、文件夹的名称(以字符串的形式)
(17)a = os.scandir(“d:\”) # 返回的是一个迭代器
(18)os.path # 该模块不存在os模块里面,只是和os有一些内部关联
4、os包中的path模块
(1)from os import path # 从os中导入path模块
(2)path.abspath(“.”) # 查找当前路径(绝对路径)
(3)path.basename() # 获取当前文件后面的文件名
(4)path.dirname() # 获取当前文件前面的文件名
(5)path.exists(“文件路径”) # 确认当前文件路径是否存在,存在返回True,否则返回False
(6)path.isdir() # 判断是否是文件夹
(7)path.isfile() # 判断是否是文件
(8)path.getsize(“.”) # 获取当前文件的大小
(9)path.join(f,“a.mp4”) # 拼接文件
练习:
1、装饰器
练习一:
import time
def time_01(fn):
def inner():
start_time = time.time()
fn()
end_time = time.time()
execution_time = end_time - start_time
print(f"{fn.__name__}函数的执行实践是{execution_time}")
return inner
@time_01
def test01():
time.sleep(2)
print("111222")
test01()
练习二:
import time
time.time()
start = time.time()
# time.time() 获取时间
# time.sleep(时间) 让系统沉睡(时间)秒
def guanjia(fn):
time.sleep(2)
def inner():
print("开挂")
fn()
print("关闭外挂")
return inner
@guanjia
def play_wz():
print("小鲁班无敌")
@guanjia
def play_lol():
print("乌鲁乌鲁,德玛西亚")
end = time.time()
n = end - start
play_wz()
play_lol()
print(n)
2、模块
给定一个路径(假设是d://),使用python代码实现遍历该路径下所有文件
import os
from os import path
def bian_li(url):
a = os.listdir(url)
try:
for i in a:
b = path.join(url,i)
if path.isdir(b):
bian_li(b)
elif path.isfile(b):
print(b)
except:
pass
bian_li("e://python笔记//day5")