函数名的应用,闭包,迭代器
1.函数名的应用(第一类对象)
函数名的命名规范和变量差不多
1 def func(): 2 print("吃了么") 3 def func2(fn): 4 print("我是finc2") 5 fn() 6 print("我是func3") 7 func2(func)
首先理解print(func) 这里输出的是一个func的内存地址,只有后面有括号的时候才是调用函数
这道题先是走7 前面是这个func的循环体,循环func2 这里的fn=func 内存地址相同 然后输出"我是func2',再走fn=fnc走1,输出:\"吃了么",最后走"我是fun3",结束这个循环
函数可以作为函数的返回值
1 def fun_1(): 2 print("这里是函数1") 3 def func2(): 4 print("这里是函数二") 5 print("这里是函数一") 6 return func2 7 fn=fun_1() 8 fn()
这里fun_1的返回值又通过fn()的形式继续输入
首先执行fun_1 输出"这里是函数1", 继续往下走,输出"这里是函数一" 然后输出返回值 func2 注意 这里输出的是一个内存地址 然后走 8 fn() 继续循环fn=func2这个函数输出"这里是函数二"
2.闭包
:定义:在内层函数访问外层函数的变量
作用: 1.保护变量不受侵害
2.可以让一个变量常驻内存(函数里面a=10)
1 def func(): 2 name="alex" 3 def fun2(): 4 print(name) 5 fun2() 6 func()
这里的name="alex" 就是一个闭包 因为这里 alex 是内层函数对外层函数变量的引用 ,就叫闭包 外层没有函数所以要引用
1 def func(): 2 name="alex" 3 def fun2(): 4 print(name) 5 return fun2 6 fn=func() 7 fn()
6.访问外部函数,获取内部函数的地址
7.返回内部函数
3.迭代器
1 s = "HAHAHAHA" 2 print(dir(s)) 3 print(dir(str))
这里 dir2 指的是输出的打印对象的方法和类
dir 3 指的是打印类的方法和类
所有的 __iter___ 是可以迭代的意思
s=" "
it = s .__iter___ #获取迭代器
print(it)
print(it__next__) 一个一个数下去
特点: 1.只能向前
2.几乎不占内存,节省内存
3. for 循环
4.惰性机制
1 lst=[1,2,3] 2 lis_iter = lst.__iter__() 3 while 1: 4 try: 5 i=lis_iter.__next__() 6 print(i) 7 except StopIteration: 8 break
2. #获取迭代器
try ecprct 只是预防
StopIteration 这一个错误
5#获取下一个元素
1 lst=["我是神"] 2 from collections import Iterable 3 from collections import Iterator 4 print(isinstance(lst,Iterable)) 5 print(isinstance(lst,Iterator))
ITERABLE # 可迭代对象 没有__next__
ITERATOR # 迭代器
这里lst 只是一个对象 并不能进行下一项迭代