python-装饰器、高阶函数、模块

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值