Python生成器装饰器及异常

(一)生成器

yield 让函数返回的结果成为生成器对象,并且支持延迟返回。

def func():
    print('abc')
    return 123
    print('def')
    return 456

res = func()
print(res)

在这里插入图片描述
当我们用return时,返回的结果只有第一部分,这是因为return是最后执行的语句。return之后不会再执行。现在我们把return换成yield。

def func():
    print('abc')
    yield 123
    print('def')
    yield 456

res = func()
print(res)


获取全部内容
在这里插入图片描述
一个一个获取
生成器本质上就是迭代器:

def fib(end):
    n,a,b = 0,0,1    #n初始值,ab需要两个数相加
    while n<end:
        a,b = b,a+b
        yield b 
        n+=1

num=fib(10)
for i in num:
    print(i)

在这里插入图片描述

(二)装饰器

装饰器也是用函数写的。
先补充一下,函数里有一种函数叫回调函数—把函数体当作参数传递给另一函数进行使用。

def play():
    print('今天吃大餐')

def work(f):
    print('今天的工作完成了')
    f()                     

在这里插入图片描述
闭包函数:外层函数返回内层函数的函数体。

def func():
    def f():
        print('我是内层函数')
    return f                      #通过return返回

a = func()
a()
a()

在这里插入图片描述

装饰器 本质上是一个闭包函数+回调函数 ,作用:在不改变原函数的基础上增加额外的功能。
使用装饰器直接@就可以。

def func(f):
    def f_1():
        print('这是我增加的功能')     #新增加的功能
        print(f)
        f()          #原函数的功能
    return f_1


@func
def play():
    print('我是play基础函数')

@func
def eat():
    print('我是eat基础函数')

在这里插入图片描述
运行过程:调用func,play函数传给参数f,f_1替换为play。

(三)异常

异常就是报错。
异常处理:

try:        #可能会报错的代码
    file = open('a.py')
except:     #出现异常之后该怎么处理
    print('当前文件不存在')

print(123)  #后面正常执行的代码

在这里插入图片描述
如果想要打印报错信息:

try:        #可能会报错的代码
    file = open('a.py')
except Exception as e:     #出现异常之后该怎么处理
    print(e)   #打印报错信息 
    print('当前文件不存在')

print(123)  #后面正常执行的代码

在这里插入图片描述
如果想要更精确,提示不同的错误:

try: # 可能发生异常的代码
##    print(1/0)
    a = 1+1
except NameError:  # 发生了异常之后进行处理的代码
    print('变量名未找到')
except TypeError:
    print('类型错误')
except FileNotFoundError:
    print('文件未找到')
except Exception:
    print('未知异常')
else: # 当try里面的代码没有异常时进行调用的代码
    print(a)
finally: # 无论是否发生异常都需要执行的代码
    print('一定要执行的代码')

在这里插入图片描述
如果把a=a+1换成print(1/0)则会:
在这里插入图片描述
还有一种是断言assert ,通过判断继续执行代码 ,没通过就直接报错,一般用于测试。

assert 1==2
print(123)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值