三大器
python 三大器
迭代器: 有__iter__()和__next__()方法
生成器:函数中将return换成yield
装饰器:闭包的本质
迭代器
# 迭代器 拥有__iter__()和__next__()方法
# 先将可迭代对象赋值一个新的变量转成迭代器
# 每次都返回一个值
# 一个__next__()对应一个输出结果
s = "1234"
new_s = s.__iter__()
print(new_s.__next__())# 输出1
print(new_s.__next__())# 输出2
# 变量名 = 可迭代对象
# 新赋值的变量名 = 变量名.__iter__() # 装成迭代器
# print(新赋值的变量名.__next__())
生成器
# 生成器 函数中将return改成yield的函数
def func():
print(1)
yield 2
g = func()
print(next(g))
# def 函数名():
# print(输出)
# yield 返回值
# 新的函数名 = 调用函数名()
# print(next(新的函数名))
# yield from 将可迭代对象逐行输出 节省空间
装饰器
# 闭包
def func():
a = 11
def foo():
print(a)
return foo
ret = func()
print(ret.__closure__)# 返回内存地址
def func():
a = 11
def foo():
print(a)
return foo
func()()
print(func.__closure__)# 返回None
# 递归 不断自己调用自己,有明确终止条件
def age(n):
if n == 4:
return 18
else:
return age(n+1)-2
print(age(1))# 输出12
# 将age"1"的实参传给age"n"形参
# if 1!=4,执行else
# else return age(1+1)=2
# 直到4==4,return18
# 18反给age(3),18-2=16
# 一直反age(2),16-2=14 age(1),14-12=12
# age(1)=12
# 装饰器 在不改变源代码和调用方法的基础上增加新功能
# 将闭包的参数换成函数名
def func(f):
def foo(*args,**kwargs):
print("装饰器")
return f()
return foo
@func
# @函数名 语法糖 相当于 f=func(f)
def index():
print(123)
return 456
print(index())
# 输出 装饰器 123 456
# def 外层函数(参数):
# def 内层函数(动态参数,形参):
# print()
# return 参数()
# return 内层函数
# @外层函数
# def 源函数():
# print()
# return
# print(源函数())