12 函数名的应用 闭包 迭代器
主要内容:
1. 函数名的应用,第一类对象
函数名可以像变量一样使用
a . 函数名的内存地址
# 1.函数名的内存地址 def func(): print("呵呵") print(func) # 结果: <function func at 0x1101e4ea0>
b. 函数名可以赋值给其他变量
#2函数名可以赋值给其他变量 def func(): print("呵呵") a = func # 把函数当成⼀个变量赋值给另一个变量 a() # 函数调用 func()
c. 作为list元素
def f1(): print("我是马化腾") def f2(): print("我是马云") def f3(): print("我是马赛克") lst = [f1(),f2(),f3()] print(lst) '''我是马化腾 #调用f1的结果 我是马云 #调用f2的结果 我是马赛克 #调用f3的结果 [None, None, None] #因为函数没有返回值,返回none
可以用for循环遍历列表中的元素
def f1(): print("我是马化腾") def f2(): print("我是马云") def f3(): print("我是马赛克") lst = [f1,f2,f3] #循环遍历列表 for c in lst: c() #调用每一个函数 ''' 我是马化腾 我是马云 我是马赛克 '''
函数名可以当作函数的参数.
# 函数名可以当作函数的参数 def func(): print("吃了么") def func2(fn): print("我是func2") fn() # 执⾏行行传递过来的fn # print("我是func2") func2(func) # 把函数func当成参数传递给func2的参数fn.
作为返回值
# def func(): # def inner(): # print("火锅不让吃了. 吃了上火") # return inner # ret = func() # 这里func()执行之后获取到的是inner函数 # ret() # 这里是让inner函数执行
2. 闭包:内部函数访问外部函数的局部变量
def func(): name = "alex" # 常驻内存 防止其他程序改变这个变量 def inner(): print(name) # 在内层函数中调用了外层函数的变量,叫闭包, 可以让一个局部变量常驻内存 return inner ret = func() ret() # 执行的是inner()
使用__closure__来检测函数是不是闭包,使用函数名.__closure__,返回cell是闭包,返回none就不是闭包.
def func1(): name = "alex" def func2(): print(name) # 闭包 func2() print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,) func1() # alex # (<cell at 0x0000019CE3567588: str object at 0x0000019CE35F8148>
好处:
安全
常住内存,提高效率
3. 迭代器
dir()来查看一个对象,数据类型中包含了哪些东西
lst = [1,2,3] print(dir(lst)) s = '王尼玛' print('__iter__'in dir(s)) print('__iter__'in dir(lst)) print('__iter__'in dir(123))
isinstance(对象,类型) 判断什么对象是否是什么类型
lst = [1,2,3] from collections import Iterable #可迭代的 from collections import Iterator #迭代器 print(isinstance(lst,Iterable)) print(isinstance(lst,Iterator))
lst = [1,2,3] from collections import Iterable #k可迭代的 from collections import Iterator #迭代器 it = lst.__iter__() print(isinstance(it,Iterable)) #判断是否是可迭代的,迭代器一定是可迭代的 print(isinstance(it,Iterator)) #迭代器里面一定有__next__(),__iter__() print('__iter__'in dir(lst)) #确定是可迭代的 print('__next__'in dir(lst)) #确定不是一个迭代器
可迭代对象(iterable):内部包含__iter__().
迭代器(iterator):内部含有__iter__和__next__
可迭代对象: str list tuple set dict range
迭代器: f(句柄)
模拟for循环
lst = ["皇阿玛", "皇额娘", "容嬷嬷", "紫薇"] # 模拟for循环 it = lst.__iter__() #获取迭代器 while True: try: name = it.__next__() #迭代器往外拿元素 print(name) except StopIteration: # 拿完了 break
迭代器的特点:
省内存
惰性机制
只能向前