美文网首页
python 10天快速教程 Day6

python 10天快速教程 Day6

作者: XaviSong | 来源:发表于2020-07-16 19:41 被阅读0次

    本节重点

    1. 装饰器
    2. 文件操作

    一、装饰器

    使用场景

    在函数内部代码逻辑比较多的时候,想添加简易功能,但不便在函数内修改,容易破坏函数内的结构。

    1、简单装饰器(前情提要
    定义:

    本质上也是闭包,可以给原函数的功能进行扩展,不改变原函数定义与调用操作。

    示例:
    #在AAAA前面加上BBBBB,装饰器本质是一个闭包
    def show4():
        print("AAAAA")
    def decorator(new_func):
        def inner():
            print("BBBBB")
            new_func()
        return inner
    # 重新给show4赋值
    show4 = decorator(show4)
    show4()
    
    #语法糖形式
    @decorator
    def show5():
        print("CCCCCCCC")
    show5()
    '''
    BBBBB
    AAAAA
    BBBBB
    CCCCCCCC
    '''
    
    2、装饰器修饰带参数的函数
    示例:
    # 装饰器修饰带有参数的函数
    def decorater(newfunc):
        def inner(num1,num2):
            print("计算两数之和")
            return newfunc(num1,num2)
        return inner
    @decorater # 等价于 sum = decorater(sum)
    def sum(num1,num2):
        print(num1+num2)
    
    sum(4,5)
    '''
    计算两数之和
    9
    '''
    
    3、使用带有参数的装饰器

    与上一条区分,这里是说装饰器本身接受参数,需要在原本的装饰器外部进行包裹。

    示例:
    # 装饰器自己带参数,要在装饰器外再包裹一层
    def get_decorator(str):
        def decorater(newfunc):
            def inner(*args):
                print(str)
                return newfunc(*args)
            return inner
        return decorater
    
    @get_decorator("计算两数之和")
    def sum(num1,num2):
        print(num1+num2)
    
    @get_decorator("计算三数之和")
    def sum2(num1,num2,num3):
        print(num1+num2+num3)
    
    sum(4,5)
    sum2(6,7,8)
    '''
    计算两数之和
    9
    计算三数之和
    21
    '''
    
    4、通用装饰器,可用于修饰任意函数

    inner接收参数时使用不定长参数,即可。

    # 使用通用装饰器,修饰任意函数,参数数量可变
    def gdecorator(newfunc):
        def inner(*args,**kwargs): # 不定长位置参数与不定长关键字参数
            print("经通用装饰器修饰的求和函数")
            return newfunc(*args,**kwargs)
        return inner
    
    @gdecorator
    def sum1(num1,num2):
        print(num1+num2)
        return num1+num2
    
    @gdecorator
    def sum2(num1,num2,num3):
        print(num1+num2+num3)
        return num1+num2+num3
    
    s1 = sum1(2,3)
    s2 = sum2(3,4,5)
    print(s1,s2)
    
    

    二、文件

    1、文件的访问模式

    常用的为以下六种

    • r:只读,当路径下没有此文件时,会报错
    • w:只写,若路径下文件已存在,原有内容会被清空;原本不存在,会帮助创建空文件
    • a:追加

    rb、wb、ab,对应以上三种模式,只不过是以二进制形式操作。比较常用,可兼容不同数据,文本、图片,视频。

    2、r,w,a示例
    # ------------r模式---------------
    file = open("1.txt","r",encoding = "utf-8") # 打开,文件不存在崩溃,为了兼容设置编码格式为utf-8
    content = file.read() # 文件内容读出
    print(content)
    file.close() # 关闭,避免内存泄漏
    
    # ------------w模式---------------
    file = open("1.txt","w",encoding = "utf-8")
    file.write("宋")
    file.write("B")
    file.write("K")
    file.close() # 关闭
    
    # ------------a模式---------------
    file = open("1.txt","a",encoding = "utf-8") # 追加
    file.write("宋")
    file.write("B")
    file.write("K")
    file.close() # 关闭
    
    3、rb,wb,ab示例
    # rb模式
    file = open("1.txt","rb") # 二进制格式不能给编码格式
    file_data = file.read() # 文件数据读出
    file_data.decode("utf-8") # 二进制方式解码
    file.close()
    
    #wb
    file = open("1.txt","wb") # wb默认仍会覆盖
    file_data = "BBBBBBBBBBB"
    file_data.encode("utf-8") # 以二进制方式写入需要编码
    file.write(file_data)
    file.close() # 避免内存泄漏
    
    #ab
    file = open("1.txt","ab",encoding="utf-8") # 追加
    file_data = "BBBBBBBBBBB"
    file_data.encode("utf-8") # 以二进制方式写入需要编码
    file.write(file_data)
    file.close() # 避免内存泄漏
    
    4、文件不同读取操作
    • read():全部读取
    • readline():只读取一行数据,遇到换行停止
    • readlines():文件中数据按照每行读取,每行内容加换行符作为一个元素,存入列表

    解码时可以遍历列表

    文件指针:

    可以先设置文件指针的位置,再读取文件,从而跳过文件的部分内容

    file = open("1.txt","r",encoding = "utf-8") 
    file.tell()#:当前指针位置
    file.seek(3)#:设置指针为3,先设置指针,再用file.read()读取
    content = file.read() # 文件内容读出
    print(content)
    file.close() # 关闭,避免内存泄漏
    
    模拟大文件的拷贝:
    #1.打开源数据文件
    src_file = open("1.txt","rb")
    #2.指定写入的路径
    dst_file = open("2.txt","wb")
    #3.读取
    while True:
        file_data = src_file.read(1024) # 循环一次读1024个字节,一点一点读,避免大文件全部载入内存
        if file_data:
            dst_file.write(file_data)
        else:
            print("数据读取完成了")
            break
    #4.关闭
    dst_file.close()
    src_file.close()
    
    文件与文件夹相关操作:
    os、shutil模块
    1、重命名文件
    import os
    file = open("1.txt","w",encoding = "utf-8")
    file.write("Hello")
    file.close()
    # 修改文件的名字,如果文件不存在会报错
    os.rename("1.txt","3.txt")
    
    2、创建文件夹
    os.mkdir("A") # 在当前路径下创建,如果已经存在A,会报错
    os.rename("A","B") # 改名
    
    3、查看当前路径
    current_path = os.getcwd()
    
    4、切换到指定路径
    os.chdir("A") # 切换到A文件夹下
    file = open("1.txt","w",encoding = "utf-8") # 在A下
    
    5、删除文件
    os.remove("A") # 若文件夹下有文件,不可以删除
    os.remove("A/1.txt") # 删除文件夹内的文件
    
    import shutil
    shutil.rmtree("A") # 删除文件树,级联删除全部内容
    

    上一篇:python 10天快速教程 Day5
    下一篇:python 10天快速教程 Day7

    相关文章

      网友评论

          本文标题:python 10天快速教程 Day6

          本文链接:https://www.haomeiwen.com/subject/buumhktx.html