1:函数名的应用
1.函数名就是函数的内存地址。
def func(): pass print(func)
2.函数名可以作为变量
def num(): def num1(): print(33) num1() f1 = num f1()
3.函数名可以作为参数:
def num(): print(123) def num1(x): x() m = num num1(m)
4.函数命可以作为返回值。
def num(): print('我运行') def inner(x): print('233') return x s = inner(num())
5.函数类可以作为容器类类型数据的元素。
def num1(): print('111') def num2(): print('222') def num3(): print('333') def num4(): print('444') l = [num1,num2,num3,num4] for i in l: i()
2:globals(),locals()
globals()返回全局变量中的一个,locals()返回局部变量中的一个字典
def func1(): # a = 2 # b = 3 # print(globals()) # print(locals()) def inner(): c = 5 d =6 print(globals()) print(locals()) inner() # print(globals()) # print(locals()) func1()
3.闭包
1.内层函数对外层函数的(非全局变量)变量的引用,并返回,这样就行成了闭包
def wraaper(): name = "alex" def inner(): print(name) print(inner.__closure__) inner() return inner() wraaper()
2.闭包的作用:当程序执行时遇到函数,会在内存空间开辟一个局部命名空间,如果这个函数形成了闭包,它不会随着函数结束而关闭。
如,网页爬取时,形成闭包,那么爬取的数据一直都是使用同一个局部空间,从而节省内存。
4.可迭代对象:
1.对象内部含有__iter__方法的就是可迭代对象。可迭代对象满足可迭代协议。
2.可迭代对象:tuple,str,dict,list.range
3.判断一个对象是否可迭代。
s1 = 'asdf' #方法1 dic = {'name':'黎明'} print('__iter__' in dir(s1)) print('__iter__' in dir(dic))
5.迭代器:
1.什么是迭代器:对象内部含有__iter__ 切含有 __next__方法的就是迭代器。
f = [1,2,3,45,6,7] f1 = f.__iter__() print('__iter__' in dir(f1)) print('__next__' in dir(f1))
2.
可迭代对象vs迭代器
可迭代对象不能取值,迭代器是可以取值的。
可迭代对象 --->(转化成)迭代器
# lis = [1,2,3,4] # # lis1 = lis.__iter__() #可迭代对象转化为迭代器,方法1 # lis1 = iter(lis) #可迭代对象转化为迭代器,方法2 # print('__iter__' in dir(lis)) # print('__next__' in dir(lis)) # print('__iter__' in dir(lis1)) # print('__next__' in dir(lis1))
3 迭代器如何取值? next一次,取一个值
print(ite1.__next__()) print(ite1.__next__()) print(ite1.__next__()) print(ite1.__next__())
4.
1.可迭代对象不能取值,迭代器是可以取值的。
2.迭代器是非常节省内存。
3.迭代器每次只会取一个值
4.迭代器是单向的,一条路走到头。
5.
1.将可迭代对象转化成迭代器。
2.调用__next__方法取值
3.利用异常处理停止报错
iter1 = s1.__iter__() while 1: try: print(iter1.__next__()) except StopIteration: break