09 生成器装饰器和异常
生成器
yield 可以很方便的实现一个迭代器
def fun():
print('1-')
yield 1 #返回值 得到一个生成器对象结果 同时暂停函数
print('2-')
yield 2
print('3-')
yield 3
b = fun()
next(b)
next(b)
next(b)
用生成器实现斐波那契数列
def fic(end = 10):
n,a,b = 0,0,1
while n < end:
a,b = b,a+b
n += 1
yield b
装饰器
#装饰器
def fun(f): #参数f指代f1函数体
def func():
print('这是嵌套函数的内部函数')
return func #闭包 外层函数返回内层函数体
@fun
def f1(): #回调 把一个函数作为另一个函数的参数
print('这是f1函数')
类的装饰器
class Person:
def __init__(self,name):
self.name = name
@property #类自带的装饰器 方法需要传参数时不用
def play(self):
print('玩游戏')
@classmethod #类自带的装饰器
def study(cls):
print('学习')
@staticmethod
def sleep(): #加装饰器后方法可以不加self实例本身
print('睡觉')
aa = Person('安安')
#加装饰器后实例调用方法不用加括号
aa.play
#加装饰器后类调用方法不用加类名
Person.study()
异常
try:
open('b.txt','r')
except FileNotFoundError as e: #捕获找不到文件的报错信息
print('文件不存在',e)
except NameError as e:
print('未定义',e)
except Exception as e: #捕获所有的报错信息
print('报错信息是',e)
else: #整个代码没有报错 走else
print('没有报错')
finally: #不管整个代码有没有报错 都会走到finally
print('程序运行完毕')
错误查找
断言
li = [5,7,8,9]
assert len(li) == 5
# 断言用于判断代码有没有错误 如果代码有错误则主动抛出错误
练习
- 利用装饰器,记录函数的运行日志(如:保存传入参数,返回结果,运行时间等信息)
import time
def variable(f1):
def fun(*args,**kwargs):
start = time.time()
varlues = f1(args,kwargs)
end = time.time()
with open('logo.txt','a+') as f:
f.writelines([str(args),'\n','运行时间%s'%(end-start)])
return varlues
return fun
@variable
def f1(*args,**kwargs):
return args,kwargs
- 打开一个只读文件,如果文件不存在,则去创建这个文件
try:
open('b.txt','r')
except FileNotFoundError:
f = open('b.txt','w')
f.close()
else:
print('程序完毕')