函数名的应用
1.函数名就是函数的内存地址
2.函数名可以作为变量
def func(): print(666) f1 = func1 f2 = f1 f2()
3.函数名可以作为函数的参数
def funcl2(): print(666) def fun2(x): x() func2(func1)
4.函数名可以当作函数的返回值
def wraaper(): def inner(): print('inner ') rerurn 666 teturn inner ret = wraaper()
def func2(): print('in func2') def func3(x): print('in func3') return x f1 = func3(func2) f1()
5.函数名可以作为容器类类型的元素
def func1(): print('in func1') def func2(): print('in func2') def func3(): print('in func3') l1 = [func1,func2,func3] for i in l1: i()
像上面的函数名这种,第一类对象。
闭包
内层函数对外层函数的变量(非全局变量)的引用,并返回这样就形成了闭包。
def wraaper(): name = 'alex' def inner(): print(name) print(inner.__closure__) inner() return inner wraaper()
闭包的作用
当程序执行时,遇到了函数执行,它会在内存中开辟一个空间,局部名称空间,如果这个函数内部形成了闭包,那么它就不会随着函数的结束而消失。
迭代器
可迭代对象
for i in 'abc': print(i)
对象内部含有__iter__方法就是可迭代对象。
可迭代对象满足可迭代协议。
可迭代对象:str, list, dict, tuple,set,range()
判断一个对象是否是可迭代对象
第一种方法:
print('__iter__' in dir(dic))
第二种方法:
from collections import Iterable print(isinstance('alex',Iterable))
迭代器
对象内部含有__iter__方法且含有__next__方法就是迭代器
print('__iter__' in dir(dict)) print('__next__' in dir(dict))
可迭代对象 VS 迭代器
1.可迭代对象不能取值,迭代器是可以取值的
2.迭代器非常节省内存
3.迭代器每次只会取一个值
4.迭代器单向的,不反复
1.将可迭代对象转化成迭代器
2.调用__next__方法取值
3.利用异常处理停止报错
iter1 = s1.__iter__() while 1: try: print(iter1.__next__()) except StopIteration: break
可迭代对象---->(转化成)迭代器
lis = [1,2,3] itel = lis.__iter__() print(itel)
迭代器如何取值
next一次,取一个值
print(itel.__next__())