Python基础知识_Day14_装饰器模块补充

路飞学城Python开发21天入门
侵权删!


Day14

今日内容

  • 带参数的装饰器:flask框架 + Django缓存 + 写装饰器实现被装饰的函数要执行N此
  • 模块:
    • os
    • sys
    • time(三种类型)
    • datetime 和 timezone

内容回顾&补充

1.函数

写代码的方式:面向过程 --> 函数式编程 --> 面向对象编程

1.1 函数基础
def func(a1,a2):
    pass
result = func(1,2)
1.2 参数

补充:对于函数的默认值慎用可变类型

#如果想要给value设置默认是空列表

#不推荐(坑)
def func(data,value=[]):
	pass

#推荐
def func(data,value=None):
    if not value:
        value = []
def func(data,value=[]):
	value.append(data)
    return value

v1 = func(1) # [1.]
v2 = func(1,[11,22,33]) # [11,22,33,1]

面试题:

  • def func(a,b=[]) 有什么陷阱?

  • 看代码写结果

    def func(a,b=[]):
        b.append(a)
        return b
    
    l1 = func(1)
    l2 = func(2,[11,22])
    l3 = func(3)
    
    print(l1,l2,l3)
    
1.3 返回值

闭包

1.4 作用域
1.5 递归

函数自己调用自己。

def func():
    print(1)
    func()
    
func()
def func(i):
    print(i)
    func(i+1)
    
func(1)
def func(a,b):
    print(b)
    func(b,a+b)
    
func(0,1)
def func(a):
    if a == 5:
        return 1000
    result = func(a+1) + 10
    return result

2.模块

  • hashlib
  • random
  • getpass
  • time

内容详细

1、装饰器

1.1 基本格式
def x(func):
    def inner():
        return func()
    return inner

@x
def index():
    pass
1.2 关于参数
def x(func):
    def inner(*args,**kwargs):
        return func(*args,**kwargs)
    return inner

@x
def index(a1):
    pass

index()
1.3 关于返回值
# 案例1
def x(func):
    def inner(*args,**kwargs):
        data = func(*args,**kwargs)
        return data
    return inner

@x
def f1(a1):
    print(123)

v1 = f1()  # 返回None

# 案例2
def x(func):
    def inner(*args,**kwargs):
        data = func(*args,**kwargs)
        return data
    return inner

@x
def f1(a1):
    print(123)
    return 666

v1 = f1()  # 返回None

# 案例3
def x(func):
    def inner(*args,**kwargs):
        data = func(*args,**kwargs)
        return 666
    return inner

@x
def f1(a1):
    print(123)

v1 = f1()  # 返回666
1.4 关于前后
def x(func):
    def inner(*args,**kwargs):
        # 前
        data = func(*args,**kwargs) # 执行原函数
        # 后
        return data
    return inner

@x
def index(a1):
    print(123)
    
index()

练习题

# 让函数执行五次,每次结果追加到列表里
import random
def func():
    return random.randint(1,4)

# 答案
import random

def wrapper(func):
    def inner(*args,**kwargs):
        value = []
        for i in range(5):
            data = func(*args,**kwargs)
            value.append(data)
        return data
    return inner

@wrapper
def func():
    return random.randint(1,4)
1.5 带参数的装饰器
# 第一步: 执行 ret = xxx(index)
# 第二步: 将返回值赋值给 index = ret
@xxx
def index():
    pass


# 第一步: 执行 v1 = uuu(9)
# 第二步: ret = v1(index)
# 第三部: index = ret
@uuu(9)
def index():
    pass
# ############ 普通修饰器 ############
def x(func):
    def inner(*args,**kwargs):
        # 前
        data = func(*args,**kwargs) # 执行原函数
        # 后
        return data
    return inner

@x
def index(a1):
    print(123)
   

# ############ 带参数修饰器 ############
def y(counter):
    def x(func):
        def inner(*args,**kwargs):
            # 前
            data = func(*args,**kwargs) # 执行原函数
            # 后
            return data
        return inner
    return x

@y(9) # 先执行y(9)函数,返回值是一个函数,传的参相当于个闭包
def index(a1):
    print(123)

练习题

# 写一个带参数的装饰器,实现:参数多少,被装饰的函数就执行多少次,把每次结果添加到列表中,返回列表

def y(counter):
    def x(func):
        def inner(*args,**kwargs):
            value = []
            for i in range(counter):
            data = func(*args,**kwargs) # 执行原函数
            value.append(data)
            return value
        return inner
    return x

@y(9)
def index():
    return 8
    
v = index()
print(v)
1.6 自己了解
  • 元数据
  • 多个装饰器

2、模块

2.1 sys

python解释器相关的数据。

  • sys.getrefcount

    # 获取一个值的应用计数
    import sys
    a = [11,22,33]
    b = a
    print(sys.getrefcount(a))
    
  • sys.gentrecursionlimit

    # 获取python默认的递归次数
    import sys
    v1 = sys.getrecursionlimit()
    print(v1)
    
  • sys.stdout.write

    # 引出实现进度条
    import time
    for i in range(1,101):
        msg = '%s%%/r' %i
        print(msg,end='')
        time.sleep(0.05)
    
    # 通过/r 和os模块,实现读取文件进度条
    import os
    # 1.读取文件大小(字节)
    file_size = os.stat('文件名').st_size
    
    # 2.一点点读取文件
    read_size = 0
    with open('文件名',mode='rb') as f1,open('新文件名',mode='wb') as f2:
        while read_size < file_size:
            chunk = f1.read(1024) # 每次最多读取1024字节
            f2.write(chunk)
            read_size += len(chunk)
            val = int(read_size / file_size * 100)
            print('%s%%/r' %val ,end='')
    
  • sys.argv

    import sys
    # 获取用户执行脚本时传入的参数
    # C:\....\...\python36.exe D:/..../..../xxxx.py D:/test
    # sys.argv = ['D:/..../..../xxxx.py','D:/test']
    path = sys.argv[1]
    
    # 删除目录
    import shutil
    shutil.rmtree(path) #删除传入参数,即删除输入的路径
    
  • sys.path

2.2 os

和操作系统相关的数据。

  • os.path.exists(path)

    如果存在返回True,否则返回False

  • os.stat(文件名).st_size

    获取文件的字节大小

  • os.path.abspath(path)

    # 获取绝对路径
    path = '当前文件夹的文件名'
    
    import os
    v1 = os.path.abspath(path)
    print(v1)
    
  • os.path.dirname(path)

    # 获取路径的上一级目录
    import os
    v1 = r'D:\..1..\..2..\xxxx.py' # 前面加r 进行转义
    v2 = r'D:\..1..\..2..'
    print(os.path.dirname(v1)) # D:/..1../..2../
    print(os.path.dirname(v2)) # D:/..1../
    
  • os.path.join

    # 路径的拼接
    import os
    path = r'D:\..1..\..2..'
    v = 'n.avi'
    result = os.path.join(path,v)
    print(result)
    result = os.path.join(path,'n1','n2','n3')
    print(result)
    
  • os.list.dir(path)

    # 查看一个目录下所有的文件,当前目录层级下的
    import os
    result = os.list.dir(r'路径')
    print(result)
    
  • os.walk(path)

    # 查看一个目录下所有层级的所有文件
    import os
    result = os.walk(r'路径')
    for item in result:
        print(len(tiem))
        
    for a,b,c in result:
        # a,正在查看的目录;b,此目录下的文件夹;c,此目录下的文件
        print(a,111,b,111,c)
        for item in c:
            path = os.path.join(a,item)
            print(path)
    
  • 补充:

    • 转义

      v1 = r'D:\..1..\..2..\xxxx.py' # 前面加r 进行转义
      v2 = 'D:\\..1..\\..2..\\xxxx.py' # \\ 进行转义
      
2.3 shutil
import shutil
shutil.rmtree(path)

总结

  • 普通装饰器
    • 参数
    • 返回值
    • 前后
  • 带参数的装饰器
  • 模块
    • random
    • hashlib
    • getpass
    • time
    • os
    • sys
    • shutil
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值