函数名的使用-闭包-迭代器
函数名的使用及第一类对象
def func():
pass
print(func()) 调用
print(func) 查看函数的内存地址
函数名的使用:
1.函数名可以当做值赋值给变量
def func(): print(1) a=func a() func() 结果: 1 1
2.函数名可以当做参数去传递 注意传递函数名的时候不能加(),如果加了()就是在传递这个函数的返回值
def func(): pass def func2(msg): print(msg) func2(func) 结果: <function func at 0x0000023EBD721E18> #func的内存地址
3.函数名可以当做返回值被返回 注意当返回值的时候不能加括号
def foo(): print(2) def func(msg): print(1) return msg print(func(foo)) 结果: 1 <function foo at 0x00000135B65F1E18> #将foo传参给msg,return msg就是返回foo的内存地址 结
4.函数名可以当做元素存放在一个容器当中
def foo(): print(1) def func(): print(2) def func2(): print(3) print(func2()) lst = [foo,func,func2] print(lst) 结果: 3 None [<function foo at 0x000001EFF0F91E18>, <function func at 0x000001EFF11688C8>, <function func2 at 0x000001EFF1168950>]
闭包
闭包:在嵌套函数里,并且内部函数使用外部变量(非全局变量)就是闭包.
使用函数名.__closure__ 获取的内容 不是None,就说明是闭包
一般在函数调用完后,内存空间就会消失
闭包好处:
1.保护变量不被外界修改
2.生命周期延长
3.节省开辟空间和销毁空间的时间差,提高效率
应用场景:
爬虫 import requests
迭代器
可迭代对象:
1.遵守可迭代对象的协议
2.具有__iter__方法
除去整型和布尔值,剩下现已知的数据类型都是
print(dir(str) dir : 查看这个类型中有什么功能
迭代器:
1.遵守迭代器协议
2.具有__iter__()方法和__next__()方法
创建一个迭代器 : 可迭代对象.__iter__()
使用迭代器 : 迭代器.__next__()
l1 = lst.__iter__().__next__()
for循环就是一个迭代器
for循环的机制 lst = [1,2,3,4,5] count = 0 l = lst.__iter__() while count < len(lst): print(l.__next__()) count += 1
特点:
1.迭代器不能回退
2.迭代器是惰性的
3.迭代器是一次性的
查看是迭代器还是可迭代对象: from collection inport Iterator,Iterable print(isinstance('查看的内容',Iterator)) 查看是不是迭代器 print(isinstance('查看的内容',Iterable)) 查看是不是可迭代的
迭代器一定是可迭代的,但是可迭代的不一定是迭代器
try: 异常捕获 捕捉错误
except
lst = [1,2,3,4,5] l = lst.__iter__() while True: try: print(l.__next__()) except StopIteration