day14装饰器_模块


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(a,b=[]):
   b.append(a)
   return b
l1 = func(1)  
l2 = func(2,[11,22])
l3 = func(3)
# [1,3]   [11,22,2]   [1,3]
print(l1,l2,l3)
?
def func(a,b=[]):
   b.append(a)
   print(b)
func(1)  
func(2,[11,22])
func(3)
# [1]   [11,22,2]   [1,3]
?

1.3返回值

分析函数执行的内存

def func(name):
   def inner():
       print(name)
       return 123
   return inner
?
v1 = func("alex")
v2 = func("eric")
?
v1()
v2()

闭包

#不是闭包
def func1(name):
   def inner1():
       return 123
   return inner
#是闭包:封装值+内层函数需要使用。
def func1(name):
   def inner2():
       print(name)
       return 123
   return inner

1.4作用域

1.5递归

函数自己调用自己。(效率低)

def func():
   print(1)
   func()
   
func()
#递归次数最大1000
#怎么查看此时
#在cmd里打开python解释器,调用sys模块(import sys),查看所有(dir(sys)),找到getrecursionlimit并调用(sys.getrecursionlimit())
def func(i):
   print(i)
   func(i+1)
   
func(1)

 

2.模块

  • hashlib

  • random

  • getpass

  • time

内容详细

1.装饰器

def x(func):
def inner():
return func()
return inner
@f
def index():
pass
# ######################################
# 然你理解没意义的一段代码
def x(func): # 2 运行x函数并创建inner函数
def inner(a1,a2):# 5 运行inner函数并传入两个值
return func()# 6调用func函数就是index函数
return inner # 3 返回inner函数并将
# inner赋给index(index = innder)
@x # 1 0调用x函数并吧index当做参数传给x
def index():# 7 运行index函数
pass

index(1,2) # 4 调用index函数index就是inner函数并传入两个实参

不管有几个参数都可以用的装饰器

def x1(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner

@x1(1)
def f1():
pass
@x1
def f2(a1):
pass

装饰器建议写法:

def x1(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner
#如何查看一个路径是否存在?
import os
result = os.path.exists("路径地址")

# result为True,则表示路径存在。
# result为False,则表示路径不存在。
# ######################################
def wrapper(func):
def inner(*atgs,**kwargs):
#检测路径是否存在
path = args[0]
#路径不存在就执行判断下面命令
if not os.path.exists(path):
print("路径不存在")
return None
result = func(*atgs,**kwargs)
return result
return inner
@wrapper
def read_userinfo(path):
file_obj = open(path,mode="r",encoding="utf-8")
data = file_obj.read()
file_obj.close()
return data

content = read_userinfo("/usr/bin/xxx/xxx")
print(content)

练习题

def xxx(nnn):
nnn = int(nnn)
def x1(func):
vv = []
def inner(*args, **kwargs):
for i in range(nnn):
data = func(*args, **kwargs)
vv.append(data)
return vv
return inner
return x1

vvv = input(">>>")
@xxx(vvv)
def index():
return 8

v = index()
print(v)
# #################################
def xxx(nnn):
nnn = int(nnn)
def x1(func):
if counter == True:
pass
else:
vv = []
def inner(*args, **kwargs):
for i in range(nnn):
data = func(*args, **kwargs)
vv.append(data)
return vv
return inner
return x1

@xxx(False)
def index():
return 8

@xxx(True)
def index():
return 8

2.模块

  • sys

    import sys
    #a被调用的次数
    #获取一个值的应用计数
    a = [11,22,33]
    B = a
    print(sys.getrefcount(a))

    #python默认支持的递归数量
    v1 = sys.getrecursionlimit()

    #输出
    sys.stdout.write("sdfjl")
    #\n 换行
    #\t 制表符
    #\r 回到当前行的起始位置
    print("sdjfl\r",end="")
    print("sdjflfd",end="")
    # ############
    import time
    for i in range(1,101):
    msg = "%s%%\r" %i
    print(msg,end="")
    time.sleep(0.05) #然程序在这多执行0.05秒

    进度条

    #导入模块os
    import os
    #获取文件的总大小(字节)
    file_size = os.stat("asdlkfjsldjf.mp4").st_size

    # 2.一点一点的读取文件
    read_size = 0
    with open("asdlkfjsldjf.mp4",mode="rb") as f1:
    while read_size < file_size:
    chunk = f1.read(1024)
    #每次最多去读取1024字节
    read_size += len(chunk)
    val = int(read_size / file_size * 100)
    print("%s%%\r" %val,end="")
    模块参数
    import sys
    #获取用户执行脚本时,传入的参数。
    #c:\sjldj\sldjf.exe d:/djks/dslkf/d.py d:/sdklf
    #sys.argv = [d:/djks/dslkf/d.py ,d:/sdklf]
    path = sys.argv[1]
    import shutil
    shutil.rmtree(path)#删除path的所有文件

    sys.path

    2.1 os
    • os.pathl.exists(path)如果path存在,返回;如果path不存在,返回False

    • os.stat("sdlaslkjdf.mp4").st_size 获取文件大小

    • os.path.abspath() 获取一个文件的绝对路径

      path = "文件名"
      import os
      v1 = os.path.abspath(path)
      print(v1)
    • os.path.dirname,获取路径的上级目录

      import os
      v = r"d:\code\s21sdalf\ksd.mp4"
      r是转义,遇到\n\t\r当作普通的字符串处理
      print(os.path.dirname(v))
    • 转义

      v = r"d:\code\s21sdalf\ksd.mp4"
      #r是转义,遇到\n\t\r当作普通的字符串处理
    • os.path.join 路径拼接

      path = "e:\sdflk\asljk\sdklfj"
      v = "sdj.txt"

      result = os.path.join(path,v)
      print(result)
    • os.listdir ,查看一个目录下所有的文件[第一层]

      import os

      result = os.listdir(r"e:\sdflk\asljk\sdklfj")
      for path in result:
      print(path)
    • os.walk ,查看一个目录下所有的[所有层]

      import os

      result = os.walk(r"e:\sdflk\asljk\sdklfj")
      for a,b,c in result:
      for item in c:
      path = os.path,join(a,item)
      print(path)
    shutil
    import shutil
    shutil.rmtree(path)

    总结

    • 普通装饰器 5*

      • 参数

      • 返回值

      • 前后

    • 带参数4*

    • 模块

      • random

      • hashlib

      • getpass

      • time

      • os

      • sys

      • shutil