(一)生成器
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)