day11 第一类对象 闭包 迭代器

第一对象:
查看函数的内存地址   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

猜你喜欢

转载自www.cnblogs.com/zhangguangpei/p/10256430.html
今日推荐