欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

s21day14 python笔记

程序员文章站 2022-04-19 23:22:49
s21day14 python笔记 一、内容回顾及补充 1. 参数补充 对于函数的默认值是可变类型 2. 闭包补充 3. 作用域补充 递归 二、装饰器补充:带参数的装饰器 1. 应用场景:flask框架 / django缓存 / 写装饰器实现被装饰的函数要执行N次 2. 区别: 3. 练习题 三、模 ......

s21day14 python笔记

一、内容回顾及补充

  1. 参数补充

    • 对于函数的默认值是可变类型
    # 如果要想给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)
  2. 闭包补充

    #区分:
    # 不是闭包
    def func1(name):
        def inner():
            return 123
        return inner 
    
    # 是闭包:封装值 + 内层函数需要使用。
    def func2(name):
        def inner():
            print(name)
            return 123
        return inner 
  3. 作用域补充

    • 递归

      # 函数自己调用自己
      def func():
          print(1)
          func()
      
      func()
      
      # 递归的返回值
      def func(a):
          if a == 5:
              return 100000
          result = func(a+1) + 10
      v = func(1)
      
      name = 'alex'
      def func():
          def inner():
              print(name)
           return inner
      v =func()

二、装饰器补充:带参数的装饰器

  1. 应用场景:flask框架 / django缓存 / 写装饰器实现被装饰的函数要执行n次

    # 第一步:执行 ret = xxx(index)
    # 第二步:将返回值赋值给 index = ret 
    @xxx
    def index():
        pass
    
    # 第一步:执行 v1 = uuu(9)
    # 第二步:ret = v1(index)
    # 第三步:index = ret 
    @uuu(9)
    def index():
        pass
  2. 区别:

    # 普通装饰器
    def wrapper(func):
        def inner(*args,**kwargs):
            data = func(*args,**kwargs) # 执行原函数并获取返回值
            return data
        return inner 
    
    @wrapper
    def index():
        pass
    
    # 带参数装饰器 
    def x(counter):
        def wrapper(func):
            def inner(*args,**kwargs):
                data = func(*args,**kwargs) # 执行原函数并获取返回值
                return data
            return inner 
     return wrapper 
    
    @x(9)
    def index():
        pass
  3. 练习题

    # 习题一:
    # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次结果添加到列表中,最终返回列表。
    def xxx(counter):
        def wrapper(func):
            def inner(*args,**kwargs):
                v = []
                for i in range(counter):
                    data = func(*args,**kwargs) # 执行原函数并获取返回值
                    v.append(data)
                return v
            return inner
        return wrapper
    
    @xxx(5)
    def index():
        return 8
    v = index()
    print(v)
    
    # 习题二:
    # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【面试题】
    def xxx(counter):
        def wrapper(func):
            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)
    
    # 习题三:
    # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回执行结果中最大的值。
    def xxx(counter):
        def wrapper(func):
            def inner(*args,**kwargs):
                value = 0
                for i in range(counter):
                    data = func(*args,**kwargs) # 执行原函数并获取返回值
                    if data > value:
                        value = data 
                return value
            return inner
        return wrapper
    
    @xxx(5)
    def index():
        return 8
    v = index()
    print(v)

三、模块

  1. sys:python解释器相关数据
  • sys.getrefcount:获取一个值的应用计数

  • sys.getrecursionlimit:python默认支持的递归数量

  • sys.stdout.write:输入输出
    • 补充:
      • \n:换行
      • \t:制表符
      • \r:回到当前行的起始位置
    import time
    for i in range(1,101):
        msg = "%s%%\r" %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%%\r' %val ,end='')
  • sys.argv:获取用户执行脚本时,传入的参数
    • 示例:让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删
"""
让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。
c:\python36\python36.exe d:/code/s21day14/7.模块传参.py d:/test
c:\python36\python36.exe d:/code/s21day14/7.模块传参.py
"""

import sys
# 获取用户执行脚本时,传入的参数。
# c:\python36\python36.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)
  1. os:和操作系统相关的数据【常用】
  • os.path.exists(path):如果path存在,返回true;如果path不存在,返回false

  • os.stat('文件路径').st_size:获取文件大小

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

import os
v1 = os.path.abspath(path)
print(v1)
  • os.path.dirname:获取路径的上级目录
import os
v = r"d:\code\s21day14\20190409_192149.mp4"
print(os.path.dirname(v))
  • 补充:

    • 转义

      v1 = r"d:\code\s21day14\n1.mp4"  (推荐)
      v2 = "d:\\code\\s21day14\\n1.mp4"
  • os.path.join:路径的拼接

import os
path = "d:\code\s21day14" # user/index/inx/fasd/
v = 'n.txt'

result = os.path.join(path,v)
print(result)
  • os.listdir:查看一个目录下所有的文件【第一层】
import os
result = os.listdir(r'd:\code\s21day14')
for path in result:
    print(path)
  • os.walk:查看一个目录下所有的文件【所有层】
import os

result = os.walk(r'd:\code\s21day14')
for a,b,c in result:
    # a,正在查看的目录 b,此目录下的文件夹  c,此目录下的文件
    for item in c:
        path = os.path.join(a,item)
        print(path)
  1. shutil:删除/解压
# 删除目录
import shutil
shutil.rmtree(path)