Python学习笔记之 装饰器& 偏函数 & 异常处理 & 断言 & 文件读写 &编码与解码
装饰器
- 概念:是一个闭包,把一个函数当做参数,返回一个替代版的函数,本质上就是一个返回函数的函数。
# 简单的装饰器
def function1():
print("lee is a good man!")
def function3(func):
def inner():
print("******************")
func()
return inner
# f是函数function1的加强版本
f = function3(function1)
f()
# 复杂一点的装饰器
def outer(func):
def inner(age):
if age < 0:
age = 0
func(age)
return inner
# 使用@函数将装饰器应用到函数
# python2.4开始支持使用@符号
@outer
def say(age):
print("lee is %d years old" % (age))
say(-15)
# 通用装饰器
'''
# 固定格式
def outer(func):
def inner(*args,**kwargs):
#添加修改的功能
pass
func(*args,**kwargs)
return inner
'''
import time
def outer(func):
def inner(*args,**kwargs):
#添加修改的功能
startTime = time.time()
time.sleep(1)
print("&&&&&&&&&&&&&&")
func(*args,**kwargs)
endTime = time.time()
print("执行该函数总共花了 %f" %(endTime - startTime))
return inner
@outer
def say(name,age): #函数的参数理论上是无限制的,但实际上最好不要超过6~7个
print("my name is %s, I am %d years old" %( name,age))
say("lee", 18)
偏函数
import functools
# print(int("123", base = 10))
# 偏函数
def int2(str, base = 2):
return int(str,base)
print(int2("1010"))
# 把一个参数固定住,形成一个新的函数
int3 = functools.partial(int, base = 2)
print(int3("1010"))
异常处理
'''
格式:
try:
语句t
except 错误码 as e:
语句1
except 错误码 as e:
语句2
……
except 错误码 as e:
语句n
else:
语句e
注意:else语句可有可无
作用:用来检测try语句块中的错误,从而让except语句捕获错误信息并处理
逻辑:当程序执行到try-except-else语句时
1、如果当try“语句t”执行出现错误,会匹配第一个错误码,如果匹配上就执行对呀的“语句”
2、如果当try“语句t”执行出现错误,没有匹配的异常,错误将会被提交到上一层的try语句。或者到程序的最上层。
3、如果当try“语句t”执行没有出现错误,执行else下的“语句e”(你得有)
'''
try:
#print(3 / 0)
#print(num)
print(4 / 2)
except NameError as e:
print("没有该变量")
except ZeroDivisionError as e:
print("除数为0了")
else:
print("代码没有问题")
# 使用except而不使用任何的错误类型
try:
#print(4 / 0)
print(num)
except:
print("程序出现了异常")
# 使用except带着多种异常
try:
print(5 / 0)
except (NameError,ZeroDivisionError):
print("出现了NameError或ZeroDivisionError")
# 特殊
#1、错误其实是class(类),所以的错误都继承自BaseException,所以捕获的时候,它捕获了该类型的错误,还把子类一网打尽
try:
print(5 / 0)
except BaseException as e:
print("异常1")
except ZeroDivisionError as e:
print("异常2")
#2、跨越多层调用,main调用了func2,func2调用了func1,func1出现了错误,这时只要main捕获到了就可以处理
def func1(num):
print(1 / num)
def func2(num):
func1(num)
def main():
func2(0)
try:
main()
except ZeroDivisionError as e:
print("****")
格式:
try:
语句t
except 错误码 as e:
语句1
except 错误码 as e:
语句2
……
except 错误码 as e:
语句n
finally:
语句f
作用:语句t无论是否有错误都将执行最后的语句f
try:
print(1 / 0)
except ZeroDivisionError as e:
print("为0了")
finally:
print("必须执行我")
print("*****")
# 断言
def func(num,dev):
assert (dev != 0), "dev 不能为0"
return num / dev
print(func(10,0))
文件读写
- 读文件
过程:
1、打开文件
2、读文件内容
3、关闭文件
- 打开文件
打开文件
open(path, flag[, encoding][, errors])
path:要打开文件的路径
flag:打开文件的方式
r 以只读的方式打开文件,文件的描述符放在文件的开头
rb 以二进制格式打开一个文件用于只读,文件的描述符放在文件的开头
r+ 打开一个文件用于读写,文件的描述符放在文件的开头
w 打开一个文件只用于写入,如果该文件已经存在会覆盖,如果不存在则创建一个新文件
wb 打开一个文件只用于写入二进制,如果该文件已经存在会覆盖,如果不存在则创建一个新文件
w+ 打开一个文件用于读写,如果该文件已经存在会覆盖,如果不存在则创建一个新文件
a 打开一个文件用于追加,如果文件存在,文件描述符将会放在文件末尾
a+
encoding:编码格式
errors:错误处理
path = r"C:\Users\yanji\Desktop\day7\file1.txt"
#ignore 忽略错误
f = open(path, "r",encoding="gbk")
读文件内容
# 1、读取文件全部内容
str1 = f.read()
print(str1)
# 2、读取指定字符数
str2 = f.read(10)
print("*"+str2+"*")
str3 = f.read(10)
print("*"+str3+"*")
# 3、读取整行,包括"\n"字符
str4 = f.readline()
print(str4)
str5 = f.readline()
print(str5)
# 4、读取指定字符数
str6 = f.readline(10)
print(str6)
# 5、读取所有行并返回列表
list7 = f.readlines()
print(list7)
# 6、若给定的数字大于0,返回实际size字节的行数
list8 = f.readlines(20)
print(list8)
# 7、修改描述符的位置
f.seek(10)
str9 = f.read()
print(str9)
# 一个完整的过程
try:
f1 = open(path,"r", encoding="gbk")
print(f1.read())
finally:
if f1:
f1.close()
with open(path,"r",encoding="gbk") as f2:
print(f2.read())
path = r"C:\Users\yanji\Desktop\day7\file4.txt"
f = open(path,"w")
# 1、将信息写入缓冲区
f.write("lee is a good man")
# 2、刷新缓冲区
# 直接把内部缓冲区的数据立刻写入文件,而不是被动的等待自动刷新缓冲区写入
f.flush()
f.write("lee is a good man\n")
f.close()
with open(path,"a") as f:
f.write("good man")
# 编码
path = r"C:\Users\yanji\Desktop\day7\test1"
with open(path,"wb") as f3:
str = "lee is a good man"
f3.write(str.encode("utf-8"))
with open(path,"rb") as f2:
data = f2.read()
print(data)
print(type(data))
newDate = data.decode("utf-8")
print(newDate)
print(type(newDate))