函数名的本质,闭包和迭代
函数名的本质:
函数名本质上就是函数的内存地址。
1.函数名可以作为变量:
def func1(): print(666) f1 = funv1 f1()
2.函数名可以作为函数的参数
def func1(): print(666) def func2(x): x() func2(func1)
3.函数名可以作为当作函数的返回值:
def wraaper(): def inner(): print('inner') return inner ret = wraaper() ret()
4.函数名可以作为容器类类型的元素:
def func1(): print('in func1') def func2(): print('in func2') def func3(): print('in func3') def func4(): print('in func4') li = [func1,func2,func3,func4] for i in l1: i()
向上面的函数名:第一类对象
globals() locals()
1.globals():返回全局变量的一个字典。
2.locals():返回当前位置的局部变量的字典
闭包:
内层函数对外层函数的变量(非全局变量)的引用,并返回,这样就形成了闭包:
def wraaaper(): name = 'alex' def inner(): print(name) inner() return inner wraaper()
功能:当程序执行时,遇到了函数的执行在内存中开辟一个空间,基本名称空间,如果这个函数内部形成了闭包,那么他就不会随着函数的结束而消失。
可迭代对象
对象内部含有__iter__方法就是一个对象。可迭代对象就满足可迭代协议,判断一个对象是否时可迭代对象:
print('__iter__' in dic(s1))
from collections imprt Iterable print(isinstance('alex,Iterable)) Ture
迭代器
对象内部含有__iter__方法且含有__next__方法就是一个迭代器。
可迭代对象vs迭代器
1.可迭代对象不能取值,迭代器是可以取值的
2.迭代器非常节省内存
3.迭代器每次只会取一个值
迭代器单向的不反复