zoukankan      html  css  js  c++  java
  • python装饰器

    #普通装饰器基本格式
    def wrapper(func):
        def inner():
            pass
            return func()
        return inner
    
    def func():
        pass
    func = wrapper(func)
    func()
    #带参数装饰器基本格式
    def w(counter):
        def wrapper(func):
            def inner(*args,**keargs):
                lis = []
                for i in range(0,counter):
                    a=func(*args,**keargs)
                    lis.append(a)
                return lis
            return inner
        return wrapper
    
    def func(*args,**keargs):
        return 8
    

    0.装饰器补充

    • 常见的模块(hashlib,random,getpass,time)

    • 默认值参数尽量是不可变数据类型!可变数据类型有坑!****

      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)									#最后输出的时候l1与l3均已运行,b=[1,3]
      
      def func(a,b=[]):
          b.append(a)
          print(b)										#函数执行一次输出一次
          
      func(1)
      func(2,[11,22,33])
      func(3)
      
      # [1]  [11,22,33,2]   [1,3]
      
    • 递归

      • 函数自己调用自己.效率低
    • 装饰器:

    #普通装饰器基本格式
    def x(func):
        def inner():
            return func()
        return inner 
    
    @x
    def index():
    	pass
    #带参数的装饰器基本格式
    def x(counter):
        def wrapper(func):
            def inner(*args,**kwargs):
                data = func(*args,**kwargs) # 执行原函数并获取返回值
                return data
            return inner 
    	return wrapper 
    
    @x(counter)
    def index():
        pass
    
    #题
    # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【题】
    def xxx(counter):
        print('x函数')
        def wrapper(func):
            print('wrapper函数')
            def inner(*args,**kwargs):
                for i in range(counter):
                    data = func(*args,**kwargs) # 执行原函数并获取返回值
                return data
            return inner
        return wrapper
    
    @xxx(5)
    def index():
        return 8
    
    v = index()
    print(v)
    

    1.带参数的装饰器

    • flask框架中存在很多带参数的装饰器;

    2.模块

    • 换行符

    • 制表符table

    • 回到当前的起始位置,再次打印时删除本行内容

      print('回到起始位置
      ',end='')
      print('清空原有内容',end='')
      
    • r 释义,当文件路径中存在 或者 等字符时,当做普通字符处理

      v1 = r"D:codes21day14
      1.mp4"  (推荐)
      print(v1)
      

    1.os模块

    和操作系统相关的数据。

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

    • os.stat('20190409_192149.mp4').st_size , 获取文件大小

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

      path = '20190409_192149.mp4' # D:codes21day1420190409_192149.mp4
      
      import os
      v1 = os.path.abspath(path)
      print(v1)
      
    • os.path.dirname ,获取路径的上级目录

      import os
      v = r"D:codes21day1420190409_192149.mp4"
      
      print(os.path.dirname(v))
      
      
    • os.path.join ,路径的拼接

      import os
      path = "D:codes21day14" # user/index/inx/fasd/
      v = 'n.txt'
      
      result = os.path.join(path,v)
      print(result)
      result = os.path.join(path,'n1','n2','n3')
      print(result)
      
      
    • os.listdir , 查看一个目录下所有的文件【第一层】

      import os
      
      result = os.listdir(r'D:codes21day14')
      for path in result:
          print(path)
      
      
    • os.walk , 查看一个目录下所有的文件【所有层】

      import os
      result = os.walk(r'D:codes21day14')
      for a,b,c in result:
          # a,正在查看的目录 b,此目录下的文件夹  c,此目录下的文件
          for item in c:
              path = os.path.join(a,item)
              print(path)
      
      

    2.sys模块

    python解释器相关的数据。

    • sys.getrefcount , 获取一个值的应用计数

      a = [11,22,33]
      b = a
      print(sys.getrefcount(a))
      
      
    • sys.getrecursionlimit , python默认支持的递归数量

    • sys.stdout.write --> print (进度)

      import time
      for i in range(1,101):
          msg = "%s%%
      " %i
          print(msg,end='')
          time.sleep(0.05)
      
      
      #进度显示
      import os
      
      # 1. 读取文件大小(字节)
      file_size = os.stat('20190409_192149.mp4').st_size
      
      # 2.一点一点的读取文件
      read_size = 0
      with open('20190409_192149.mp4',mode='rb') as f1,open('a.mp4',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%%
      ' %val ,end='')
      
      
    • sys.argv

      #!/usr/bin/env python
      # -*- coding:utf-8 -*-
      """
      让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。
      C:Python36python36.exe D:/code/s21day14/7.模块传参.py D:/test
      C:Python36python36.exe D:/code/s21day14/7.模块传参.py
      
      """
      import sys
      
      # 获取用户执行脚本时,传入的参数。
      # C:Python36python36.exe D:/code/s21day14/7.模块传参.py D:/test
      # sys.argv = [D:/code/s21day14/7.模块传参.py, D:/test]
      path = sys.argv[1]
      
      # 删除目录
      import shutil
      shutil.rmtree(path)
      
      

    3.time

    • time.time() 获取当前时间
    • time.sleep('时间') 休眠时间

    4.shutil

    #删除
    import shutil
    shutil.rmtree(path)
    
    

    模块小结

    • random
    • hashlib
    • getpass
    • time
    • os
    • sys
    • shutil
  • 相关阅读:
    linux 中的./configuration --prefix=安装路径 的用法(指定源码安装方式的安装路基)
    深入了解Activiti工作流流程定义
    ResultCode 自定义错误状态码
    maven和gradle对比
    js中的prototype原型解析
    json字符串的标准格式
    迷茫于Hibernate/JPA的人提一些建议。
    ModelDriven 和 Preparable 拦截器
    Spring中bean的scope
    spring配置文件详解以及beans:beans标签
  • 原文地址:https://www.cnblogs.com/bigox/p/10720284.html
Copyright © 2011-2022 走看看