第一对象:
查看函数的内存地址 print(函数名) 函数可以当做值,赋值给变量 函数可以参数,传递个函数的形参 函数当参数的时候不能加括号 函数可以当返回值 当返回值的时候不括号 函数名可以元素存在容器里
def fn(): print("我叫fn")fn()print(fn) #第一对象
闭包:
闭包:嵌套函数,内部函数使用外部变量(非全局变量)就是闭包 闭包好处, 保护这个变量不被外界修改 生命周期延长 节省开辟空间和销毁空间的时间差,提高效率
def wrapper(): a = "哈哈" # 不安全的一种写法 name = "周杰伦" def inner(): print(name) # 在内层函数中使用了外层函数的局部变量 print(a) def ok(): nonlocal a a = 108 print(a) return inner # 返回函数名ret = wrapper()ret()
def wrapper(): name = "周杰伦" # 局部变量常驻与内存 def inner(): print(name) # 在内层函数中使用了外层函数的局部变量 return inner # 返回函数名 # inner()ret = wrapper() # ret是一个内层函数ret() # ret是inner, 执行的时机是不确定的, 必须保证里面的name必须存在
迭代器
除去整型和布尔值剩下现已知都是 迭代器: 遵守迭代器的协议 具有__iter__()方法和__next__()方法 创建一个迭代器 == 可迭代对象.__iter__() 使用迭代器 == 迭代器.__next__() list 列表dict字典 set 集合tupie 元祖都可以
print(s.__iter__()) # 对象 iterator 迭代器print(lst.__iter__())print(dict.__iter__({ '1':2}))print(set.__iter__({ '1',2}))print(tuple.__iter__(('1',2)))print(range.__iter__(range(0,7)))
迭代器 特点:
迭代器不能回退 迭代器是惰性的 迭代器是一次性的
#########for循环的机制########### lst = [1,2,3,4,5] count = 0 l = lst.__iter__() while count < len(lst): print(l.__next__()) count += 1 lst = [1,2,3,4,5,67,7] l = lst.__iter__() while True: try: # 异常捕获 print(l.__next__()) except StopIteration: break