神奇语言python 第一类对象 闭包 迭代器
第一对象:
查看函数的内存地址 print(函数名)
函数可以当做值,赋值给变量
函数可以参数,传递个函数的形参 函数当参数的时候不能加括号
函数可以当返回值 当返回值的时候不括号
函数名可以元素存在容器里
def fn(): print("我叫fn") fn() print(fn) # <function fn at 0x0000000001D12E18> 第一对象
闭包:
闭包:嵌套函数,内部函数使用外部变量(非全局变量)就是闭包
闭包好处,
保护这个变量不被外界修改
生命周期延长
节省开辟空间和销毁空间的时间差,提高效率
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