python 三大器
- 迭代器: 有__iter__()和__next__()方法
- 生成器:函数中将return换成yield
- 装饰器:闭包的本质
迭代器
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 迭代器 拥有__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 将可迭代对象逐行输出 节省空间
装饰器
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 闭包
def func():a = 11def foo():print(a)return foo
ret = func()
print(ret.__closure__)# 返回内存地址def func():a = 11def foo():print(a)return foo
func()()
print(func.__closure__)# 返回None# 递归 不断自己调用自己,有明确终止条件
def age(n):if n == 4:return 18else: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(源函数())