Python 进阶:函数名、闭包与迭代器
摘要本文聚焦 Python 进阶核心知识点详细讲解函数名的第一类对象特性、闭包的定义、检测与应用、迭代器与可迭代对象的本质区别及工作原理附完整可运行代码示例帮助开发者夯实 Python 进阶基础理解底层执行逻辑。一、函数名的运用第一类对象Python 中函数是第一类对象函数名本质是特殊变量具备赋值、传参、作为返回值等特性。1. 函数名的内存地址直接打印函数名可查看其内存地址验证函数名是变量def func(): print(呵呵) # 打印函数内存地址 print(func) # 输出function func at 0x1101e4ea02. 函数名赋值给其他变量可将函数名赋值给新变量通过新变量调用原函数def func(): print(呵呵) # 函数名赋值 a func # 通过新变量调用函数 a() # 输出呵呵3. 函数名作为容器元素函数名可存入列表、元组等容器遍历容器即可批量执行函数def func1(): print(执行函数1) def func2(): print(执行函数2) def func3(): print(执行函数3) # 函数名存入列表 lst [func1, func2, func3] # 遍历执行 for i in lst: i()4. 函数名作为函数参数将函数作为参数传递给另一个函数实现函数间的灵活调用def func(): print(吃了么) # 接收函数作为参数 def func2(fn): print(我是func2) # 执行传入的函数 fn() # 传递函数名 func2(func)5. 函数名作为函数返回值函数可返回另一个函数嵌套函数实现延迟调用def func_1(): print(这里是函数1) # 内部函数 def func_2(): print(这里是函数2) # 返回内部函数名 return func_2 # 接收返回的函数 fn func_1() # 调用内部函数 fn()二、闭包1. 闭包定义闭包内层函数引用外层函数非全局变量且外层函数返回内层函数形成的嵌套函数结构。2. 基础示例def func1(): # 外层函数变量 name alex # 内层函数闭包 def func2(): # 引用外层变量 print(name) return func2 # 调用外层函数获取内层函数 fn func1() # 执行内层函数 fn() # 输出alex3. 闭包检测closure通过函数的closure属性检测是否为闭包返回cell对象是闭包返回None不是闭包def func1(): name alex def func2(): print(name) return func2 fn func1() # 检测闭包 print(fn.__closure__) # 输出(cell at 0x10c2e20a8: str object at 0x10c3fc650,)4. 外部调用内部函数闭包核心作用在函数外部访问内部函数def outer(): name alex # 内部函数 def inner(): print(name) return inner # 外部获取内部函数地址 fn outer() # 外部调用内部函数 fn() # 输出alex5. 多层嵌套闭包多层嵌套只需逐层返回内层函数def func1(): def func2(): def func3(): print(嘿嘿) return func3 return func2 # 逐层调用 func1()()() # 输出嘿嘿6. 闭包的核心作用闭包让外层函数变量常驻内存避免函数执行后变量销毁适合耗时操作缓存场景如爬虫from urllib.request import urlopen def but(): # 耗时网络请求仅执行1次 content urlopen(http://www.xiaohua100.cn/index.html).read() def get_content(): # 直接返回缓存内容 return content return get_content # 首次调用执行网络请求 fn but() # 后续调用直接读取缓存无需重复请求 content1 fn() content2 fn()三、迭代器1. 可迭代对象Iterable定义内部实现_iter_()方法的对象可通过for循环遍历常见str、list、tuple、dict、set、range。验证方法dir()查看是否含_iter_isinstance()判断类型from collections import Iterable # 方法1dir()查看 s 测试字符串 print(__iter__ in dir(s)) # True # 方法2isinstance() lst [1,2,3] print(isinstance(lst, Iterable)) # True print(isinstance(123, Iterable)) # Falseint不可迭代2. 迭代器Iterator定义同时实现_iter_(\)和_next_\(\)方法的对象是可迭代对象的进阶。核心特性惰性机制不一次性加载所有数据节省内存单向执行只能向下遍历不可回退一次性遍历结束后不可重复使用验证迭代器from collections import Iterator lst [1,2,3] # 获取迭代器 lst_iter lst.__iter__() print(isinstance(lst, Iterator)) # False print(isinstance(lst_iter, Iterator))# True3. 迭代器工作原理通过_iter_(\)获取迭代器_next_(\)逐个获取元素无元素时抛出StopIteration异常。基础示例s 我爱北京天安门 # 获取迭代器 c s.__iter__() # 逐个获取元素 print(c.__next__()) # 我 print(c.__next__()) # 爱 print(c.__next__()) # 北 print(c.__next__()) # 京 # 无元素时抛出异常 # print(c.__next__()) # StopIteration模拟 for 循环必掌握for循环底层是迭代器 异常捕获的封装lst [1,2,3] # 获取迭代器 lst_iter lst.__iter__() # while循环模拟for while True: try: # 获取元素 i lst_iter.__next__() print(i) # 捕获结束异常 except StopIteration: break4. Iterable vs Iterator 对比表特性可迭代对象Iterable迭代器Iterator核心方法仅_iter_(\)_iter_(\)_next_(\)内存占用一次性加载占用大惰性加载占用小遍历次数可重复遍历仅一次遍历典型对象list、str、dict、setlist 迭代器、文件对象四、总结函数名Python 第一类对象支持赋值、传参、返回值灵活扩展函数功能闭包内层引用外层变量 返回内层函数核心价值是变量常驻内存迭代器基于\_\_iter\_\_和\_\_next\_\_惰性遍历节省内存for循环底层依赖迭代器核心区别可迭代对象是 “数据容器”迭代器是 “数据生成器”。