一. 函数名的运用
函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量 1. 函数名的内存地址 2. 函数名可以赋值给其他变量 3. 函数名可以当做容器类的元素 列表里面可以装函数名 4. 函数名可以当做函数的参数 5. 函数名可以作为函数的返回值 二. 闭包 闭包就是内层函数对外层(非全局)函数的变量的引用 我们可以使用__closure__来检测函数是否是闭包,使用函数名.__closure__ ,返回cell就是闭包,返回None就不是闭包 在函数外调用内部函数,如果是多层嵌套,只需要一层一层往外层返回就行了 def func1(): name = "alex" def func2(): print(name) return func2 f = func1() f() 闭包的好处:(1)保护变量不被侵害,(2)保持一个变量常驻内存(局部变量常驻于内存只能闭包)爬虫 三. 迭代器 可迭代对象有:str,list,tuple,dict,set range iterable可迭代的, 查看一个对象是否可迭代的方法: (1)使用dir()函数查看类中定义好的所有方法,找__iter__函数 print(dic(list)) (2)使用isinstance()函数来查看 lst = [1, 2, 3] from collections import Iterable print(isinstance(lst, Iterable)) 迭代器:可以被next()函数调用并不断返回下一个值的对象成为迭代器 Iterator 判断一个对象是否是迭代器: from collections import Iterator print(isinstance([], Iterator)) 综上,如果对象中有__iter__函数,那么我们认为这个对象遵守了可迭代协议,就可以获取到相应的迭代器,这里的__iter__是帮助我们获取到对象的迭代器,我们使用迭代器中的__next__来获取到一个迭代器中的元素(list,dict,str都是Tterable但不是Iterator,可以通过iter()函数获取到迭代器,再通过next()函数调用并不断返回下一个数据) for循环的本质原理:通过不断调用next()函数实现的 使用while循环和迭代器来模拟for循环, lst = [1, 2, 3] lst_iter = lst.__iter__() while 1: try: i = lst_iter.__next__() print(i) except StopIteration: break 总结: Iterable: 可迭代对象, 内部包含 iter()函数 Iterator: 迭代器, 内部包含 iter() 同时包含 next() 迭代器的特点:(1).节省内存.(2).惰性机制(3).不能反复,只能向下执行