python 三大器

三大器

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(源函数())

posted @ 2019-07-19 10:06  张珊33  阅读(167)  评论(0编辑  收藏  举报