zoukankan      html  css  js  c++  java
  • python记录_day11 闭包 迭代器

    一、第一类对象:

    函数名是一个变量,可以当普通变量使用,但它又是一个特殊的变量,与括号配合可以执行函数。

    函数名的运用

    1、单独打印是一个内存地址

    2、可以给其他变量赋值

    3、可以作为容器类变量的元素

    4、可以作为函数的参数

    5、可以作为函数的返回值

    二、闭包

    如果一个内层函数有对外层函数变量的引用,那么就称为这个内层函数为闭包函数,也叫闭包

    那么,如何检查一个函数是不是闭包函数呢?

      用__closure__()方法可以检查函数是否是闭包函数,返回值不为None就是闭包函数。

    def func():
        name = "alex"
        def func2():
            print(name)
        func2()
        print(func2.__closure__) #(<cell at 0x00000000027375B8: str object at 0x00000000027B81B8>,)
    func()
    print(func.__closure__)  #None

    闭包的作用

      1、保护变量不受侵害。闭包函数引用的是局部变量,因此变量不容易被修改

      2、可以让一个变量常驻内存。因为内层函数执行的时机是不确定的,为了inner函数能正常执行,必须保证变量存在。

    如何访问内部函数?

      访问内部函数,可以先调用外部函数,获取内部函数地址,再调用内部函数即可。多层嵌套就一层一层的返回

    def outer():
        name = "alex"
        #内部函数
        def inner():
            print(name)
        return inner
    fn = outer()  #调用外部函数 获取内部函数的函数地址
    fn()  #调用内部函数

    两个方法:

    __doc__() 查看函数的文档注释

    __name__() 查看函数名

    三、迭代器

    迭代器就是个可以使用__next__函数一个一个往外拿值的容器。比如 a是一个迭代器,那么a.__next__()就表示从a中拿出了一个值。

    dir()  能够查看数据类型能够执行的操作,即该数据类型支持的内部方法

    print(dir(list))
    
    #结果
    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', 

    '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__',
    '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__',
    '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',

    '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',

    '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop',

    'remove', 'reverse', 'sort']

    通过对list、set、tuple、str等数据类型查看,我们都能发现一个__inter__函数,这是可迭代对象的共性。其实__inter__函数相当于是一个可迭代协议,只要有这个函数,就表示它是可迭代的。__inter__函数的作用是获取对象的迭代器。

    因此

    一个对象有__inter__函数,表示可迭代的(iterable)

    有__iter__, __next__函数,表示是迭代器(iterator),迭代器都是可迭代的

    如何判断一个对象是否是可迭代对象?

    1、dir(x)      查看是否具有__iter__函数

    2、“__iter__”  in  dir(x)    判断是否可迭代 返回值是True 或False  

      "__next__" in  dir(x)      判断是否是迭代器 返回值是True 或False

    3、专业方法

    from  collections  import  Iterable,Iterator

    isinstance(x ,Iterable)   表示 x是否是Iterable

    isinstance(x,Iterator)    表示x 是否是Iterator

    迭代器的三个特点:

    1、节省内存

    2、惰性机制    必须通过__next__()才能拿值

    3、只能往前,不能后退

    使用while+迭代器模拟for循环:

    lst = [1,2,3]

    it = lst.__iter__()  #得到迭代器

    while 1:
      try:
        el = it.__next__()
        for循环的循环体
      except StopIteration:
        break

    lst = [1,2,3]
    it = lst.__iter__()
    
    while 1:
        try:
            el = it.__next__()
            print(el)
        except StopIteration:
            break
    
    
    #等价于
    for el in lst:
        print(el)
  • 相关阅读:
    linux一键安装filemanager和caddy
    搭建owncloud
    Linux下解压命令大全
    linux虚拟机调整分辨率
    [Javascript] ==与===区别
    [转]ActiveX控件安全初始化之一:实现ISafeObject接口
    C# 温故而知新:Stream篇(—)
    [转]C# 温故而知新:Stream篇(二)
    【转】C# 温故而知新:Stream篇(三)
    [转]在企业应用开发中遵循开源协议
  • 原文地址:https://www.cnblogs.com/zhang-yl/p/9885899.html
Copyright © 2011-2022 走看看