python 10天快速教程 Day6

2020-07-16  本文已影响0人  XaviSong

本节重点

  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、文件的访问模式

常用的为以下六种

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、文件不同读取操作

解码时可以遍历列表

文件指针:

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

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

上一篇 下一篇

猜你喜欢

热点阅读