函数名的运用: 函数名的命名规范跟变量名是一样的,函数名就是变量名
1,函数名的内存地址
2,函数名可以赋值给其他变量
3,函数名可以当做容器类的元素
4,函数名可以当做函数的参数
5,函数名可以作为函数的返回值
函数名就叫做第一类对象,能装对象的对象是列表
闭包:
闭包就是内层函数对外层函数(非全局)变量的引用,这里面的内层函数是闭包
可以使用函数名.__closure__检测函数是否是闭包,返回cell就是闭包,返回None就不是闭包
python规定,如果在内部函数中访问了外层函数中的变量,
那么这个函数就不会消失,将会常驻内存中
也就是说,使用闭包,可以保证外层函数中的变量在内存中常驻
闭包的作用:
1,保护变量不受侵害
2,让一个变量可以常驻内存,供后面的程序使用
手写闭包:
def outer():
a = 10
def inner():
print(a)
return ininer
迭代器:
dir() 可以通过dir查看**类型的数据可以执行哪些方法
可以通过dir来判断数据是否是可迭代的,以及数据是否是迭代器
__iter__获取当前对象的迭代器,所有带__iter__的可以使用for循环,是可迭代对象
迭代器里面有__next__(),使用__next__()来获取迭代器中的每一个元素,如果next写多了,会报错
迭代器中也有__iter__,也可以进行for循环
官方方案判断是不是可迭代对象和迭代器:
from collections import Iterable
from collections import Iterable
print(isinstance(lst,Iterable))
print(isinstance(lst,Iterator))
print(isinstance(it,Iterable))
print(isinstance(it,Iterator))
可迭代对象没有__next__,有__iter__.迭代器里面有__next__,有__iter__
迭代器的特点:
1,只能向前
2,几乎不占用内存,会节省内存
3,惰性机制
list(参数) 会把参数循环迭代
迭代器模拟for循环:
lst = [1,2,3,4,5]
it = lst.__iter__() #获取迭代器
while 1:
try: #尝试执行
el = it.__next__() #获取下一个元素
print(el)
except StopIteration: #处理错误
break
for循环的内部机制:
1,首先获取到迭代器
2,使用while循环获取数据
3,it.__next__()来获取数据
4,处理异常,try