zoukankan      html  css  js  c++  java
  • python第一类对象,闭包,迭代器

    一.第一类对象

      第一类对象 -> 函数名 -> 变量名

    1.特征:

          函数对象可以像变量一样进行赋值

          还可以作为列表的元素进行使用

          还可以作为返回值返回

          还可以作为参数进行传递

    def warpper():
        def inner():
            print("666")
        print("inner")
        return inner
    ret = warpper()   # warpper() 返回值是inner 也就是inner 调用再加()
    print(ret())
    ret()         

    二.闭包

      闭包 -> 函数的嵌套              内层函数对外层函数中的变量的使用

     1.  初级的闭包

    f warpper():
        name = "zhou"       # 局部变量常驻在内存
        def inner():
            print(name)      # 在内层函数中使用了外层函数的局部变量
        return inner
    ret  = warpper()          #  ret = inner
    ret()

    2.闭包的优点

       1.保护变量不被侵害. (如果需要的变量在全局,任何函数都能调用)

      2.让变量常驻内存.(个人理解   当ret = warpper()时   是把warpper函数剥去,这样name就类似全局中的变量,就常驻内存了)

    3.查看闭包

      __closure__ : 返会东西就是闭包,返回None就不是闭包

    def wapper():
        name = "alex"
        def inner():
            print("123")
        print(inner.__closure__)   # 查看是否闭包,有内容就是闭包,返回None就不是闭包
        return inner
    wapper() 

    三.迭代器

     一个数据类型中包含了__iter__函数表示这个数据是可迭代的

    1.判断迭代器和可迭代对象的方案

        1.dir(数据):返回这个数据可执行的所有操作

          用dir来查看,   __iter__       有这个就是可迭代的

                  __iter__    __next__    有这两个就是 迭代器

      2.官方的判断

           在 collections中 导入   Iterable     Iterator 包  

        isinstance(对象,Iterable)      判断是不是可迭代的

        isinstance(对象,Iterator)  判断是不是迭代器   

      3.关系

        可迭代包含迭代器    也就是迭代器一定是可迭代的,可迭代的不一定是迭代器.

    from collections import Iterator ,Iterable
    
    lst = []
    t = lst.__iter__()
    #迭代器一定可迭代    可迭代的不一定是迭代器
    print(isinstance(lst,Iterable))  # xxx是否是xxx类型的
    print(isinstance(t,Iterator))   #判断是不是迭代器

    2.模拟for循环

    用 __iter__   拿到迭代器

    用 __next__  来拿下一个

    lst = ["贾樟柯", "李安", "杨德昌", "王家卫"]
    # for i in lst:
    #     print(i)
    t = lst.__iter__()     #拿到迭代器   是一个地址
    while 1 :
        try:
            print(t.__next__())  #循环着拿数据
        except StopIteration:   # 拿完的时候会遇到Stopiteration错误
            break
    

    3.特征

        1.省内存

      2.惰性机制

      3.只能向前,不能后退

  • 相关阅读:
    Linux下Tomcat重新启动
    Navicat远程连接不上mysql解决方案
    Tomcat 启动时 SecureRandom 非常慢解决办法,亲测有效
    SpringMVC Controller接收参数总结
    maven source 1.3 中不支持泛型 解决办法
    css background-image 自适应宽高——转载
    IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
    使用Idea从github上获取项目
    取消IDEA默认打开最近的项目(设置打开选择创建页面)
    GameFreamWork框架----事件系统的应用
  • 原文地址:https://www.cnblogs.com/q767498226/p/10099244.html
Copyright © 2011-2022 走看看