• 函数--第一类对象、闭包、


    一.第一类函数。

    二.闭包

    三.迭代器。

    一.第一类对象

    函数名是一个变量,但它是个特殊的变量,与括号配合可以执行函数的变量.
    
    函数名可以赋值给其他变量,调用函数体时,后面()就可和原函数名一样使用
    
    函数名可以当作容器类的元素
    
    函数名可以当作函数的参数
    
    函数名可以作为函数的返回值

    二.闭包

    闭包就是内层函数,对外层函数(非全局)的变量的引用,python规定:如果你的内部函数中访问了外层函数中的变量,那么这个变量将不会消亡,常驻内存
    闭包的简单写法:
    def func1():
        name = "alex"
        def func2():
            return name    # 闭包
        return func2
    
    ret=func1() #访问外部函数,获取到内部函数的地址
    print(ret())#访问并打印内部函数
    结果:
    alex

    未来闭包的应用场景简述

    简易版爬虫
    
    from urllib.request import urlopen  #导入urllib包的request模块的urlopen(打开一个网址)函数
    def but():
    content = urlopen("https://www.dytt8.net").read()
    def get_content():
    return content
    return get_content
    print("开始获取")
    fn = but()
    content = fn().decode("gbk")
    print("获取完毕")
    print(content[60])
    print(content[5])
    检测函数是否有闭包:__closure__
    
    使用函数名.__closure__返回cell就是闭包,返回None就不是闭包
    闭包的优点:
        1)保护变量不被全局修改
        2)可以让这个变量常驻内存,方便调用.
    闭包的不足:
        当闭包太多,常驻内存的值就会很多,内存空间会告急.

    三、迭代器

     判断迭代器和可迭代对象的方案(官方):

    Iterable(是否是可迭代的);

    Iterator(是否是迭代器)

    from collections import Iterable, Iterator
    isinstance(对象, Iterable) 是否是可迭代的
    isinstance(对象, Iterator) 是否是迭代器
    str, list, tuple, dict, set都是可迭代对象,因为他们遵循了可迭代协议.
    dir()函数是第一种:可以查看类中定义好的所有方法,包括是否可迭代
    print(dir(str))
    属性中存在__iter__,声明该类是个可迭代对象,
    
    isinstence()函数是第二种查看一个对象定义好的所有方法,包括是否可迭代
    l = [1,2,3]
    l_it = l.__iter__() #获取对象的迭代器,有了迭代器权限,才能一个一个(__next__)迭代拿取
    __inter__获取到对象的迭代器  #可以使用迭代器中的__next__()来一个一个的获取迭代器内的元素,

    总结:
      以后代码写的过长,但需求只是一部分时,使用改方法可节省内存.
    该方法存在惰性机制,就是你不下__next__的指令它就永远停在那里,而且不能反复,只能向下执行,如果想再次获取前一个内容,必须重新获取该类的迭代器(l_it = l.__iter__)

     for 循环的机制:

    for i in [1,2,3]:
        print(i)

     下面我们使用while循环+迭代器来模拟for循环

    lst = [1,2,3]
    lst_iter = lst.__iter__()#获取lst列表的迭代器权限
    while True:
        try: #尝试
            i = lst__iter__().__next__()
            print(i)
        except StopIteration:#如果报错
            break  #终止(兜底)
    此方法的try,except StopIteration, break,为固定格式
  • 相关阅读:
    安装GitLab出现ruby_block[supervise_redis_sleep] action run
    docker tag根据镜像id做标签,用于应用的回滚
    Jenkenis报错:该jenkins实例似乎已离线
    kubernetes-批量删除Evicted Pods
    阿里云k8s构建镜像时设置版本号用于版本回滚
    Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
    Java虚拟机5:Java垃圾回收(GC)机制详解
    Java虚拟机4:内存溢出
    Java虚拟机3:常用JVM命令参数
    Java虚拟机2:Java内存区域及对象
  • 原文地址:https://www.cnblogs.com/lgw1171435560/p/10099681.html
Copyright © 2020-2023  润新知