zoukankan      html  css  js  c++  java
  • 函数进阶

    namespace(名称空间)
    名称空间就是用来存放名字与值内存地址绑定关系的地方(内存空间)

    名称空间分为三大类
    内置名称空间:存放的是python解释器自带的名字
    全局名称空间:存放的是文件级别的名字
    局部名称空间:在函数内定义的名字

    生命周期:
    内置名称空间:在解释器启动时则生效,解释器关闭则失效
    全局名称空间:在解释器解释执行python文件时则生效,文件执行完毕后则失效
    局部名称空间:只在调用函数时临时产生该函数的局部名称空间,改函数调用完毕则失效

    加载顺序: 内置->全局->局部

    查找顺序:基于当前所在位置按照 局部->全局->内置 查找
    注意:
    名字的查找顺序,在函数定义阶段就已经固定死了(即在检测语法时就已经确定了名字的查找顺序),
    与函数的调用位置无关,也就是说无论在任何地方调用函数,都必须回到
    当初定义函数的位置去确定名字的查找关系

    作用域:作用的范围
    作用域分为两种:
    1.全局作用域:包含的是内置名称空间与全局名称空间中的名字
    特点:全局有效,全局存活
    2.局部作用域:包含的是局部名称空间中的名字
    特点:局部有效,临时存活



    闭包函数:
    闭包函数是定义在一个函数内部的函数,该内部函数包含对外层函数作用域名字的引用
    需要结合函数对象的概念将闭包函数返回到全局作用域去使用,从而打破函数的层级限制

    闭包函数的作用: 提供了一种为函数体传值的解决方案

    装饰器:
    装饰器就是用来为被装饰器对象添加新功能的工具
    注意:装饰器本身可以是任意可调用对象,被装饰器的对象也可以是任意可调用对象

    装饰器的实现必须遵循两大原则:
    1. 不修改被装饰对象的源代码
    2. 不修改被装饰器对象的调用方式
    装饰器的作用:就是在遵循1和2原则的前提下为被装饰对象添加上新功能

    装饰器的语法糖:
    在被装饰对象正上方单独一行写@装饰器的名字
    运行原理:
    python解释器一旦运行到@装饰器的名字,就会调用装饰器,然后将被装饰函数的内存地址当作参数传给装饰器,最后将装饰器调用的结果赋值给原函数名

    解释@语法的时候是自下而上运行
    而执行装饰器内的那个wrapper函数时的是自上而下

    @wraps装饰器应该加到装饰器最内层的函数上
    用wraps 可是将wrapper 完全伪装成原函数

    def deco(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
        return wrapper


    函数递归:
    函数的递归调用是函数嵌套调用的一种特殊形式,在调用一个函数的过程中又直接或者间接地调用该函数本身,称之为函数的递归调用

    递归调用必须有两个明确的阶段:
    1. 回溯: 一次次递归调用下去,每一次重复问题的规模都应该有所减少,直到逼近一个最终的结果,即回溯阶段一定要有一个明确的结束条件
    2. 递推: 往回一层一层推算出结果

    迭代器:
    迭代取值的工具,迭代是一重复的过程,每一次重复都是基于上一次的结果而来

    迭代器的作用: 迭代器提供了一种通用的且不依赖于索引的迭代取值方式

    一 :可迭代的对象iterable:
    但凡内置有__iter__方法的对象都称之为可迭代的对象
    可迭代的对象:str,list,tuple,dict,set,文件对象
    执行可迭代对象下的__iter__方法,返回的值就是一个迭代器对象iterator

    二: 迭代器对象iterator
    1. 既内置有__next__方法的对象,执行迭代器__next__方法可以不依赖索引取值
    2. 又内置有__iter__方法的对象,执行迭代器__iter__方法得到的仍然是迭代器本身
    ps:
    1.迭代器对象一定是可迭代的对象,而可迭代的对象却不一定是迭代器对象
    2.文件对象本身就是一个迭代器对象

    for本质应该称之为迭代器循环
    工作原理
    1. 先调用in后面那个对象的__iter__方法,将其变成一个迭代器对象
    2. 调用next(迭代器),将得到的返回值赋值给变量名k
    3. 循环往复直到next(迭代器)抛出异常,for会自动捕捉异常然后结束循环

    三:迭代器总结
    优点:1. 提供一种通用的且不依赖于索引的迭代取值方式
    2. 同一时刻在内存中只存在一个值,更节省内存
    缺点:1. 取值不如按照索引的方式灵活,(不能取指定的某一个值,而且只能往后取)
    2. 无法预测迭代器的长度

    生成器:
    就是一种自定义的迭代器,本质就是迭代器
    函数内包含yield关键字,调用函数不会执行函数体代码,会得到一个返回值,该返回值就是生成器对象
    对生成器对象运行next方法 会触发函数的执行,直到碰到一个yield停下来,并且将yield后的值当作本次next的结果返回

    强调:针对表达式形式的yield的使用,第一步必须让函数先暂停到一个yield的位置,才能进行传值操作
    1. 先为当前暂停位置的yield赋值
    2. next(生成器)直到再次碰到一个yield停下来,然后其的值当做本次next的结果

    总结yield:只能在函数内使用
    1. yield提供了一种自定义迭代器的解决方案
    2. yield可以保存函数的暂停的状态
    3. yield对比return
    1. 相同点:都可以返回值,值的类型与个数都没有限制
    2. 不同点:yield可以返回多次值,而return只能返回一次值函数就结束了

    生成器表达式的格式为
    小括号内 中间是for循环 右边可以是if条件判断 左边是输出的值
  • 相关阅读:
    (转)Linux端口nmap和netstat命令
    (转)Linux下增加交换分区的大小
    (转)centos7安装telnet服务
    (转)VmWare下安装CentOS7图文安装教程
    (转)Linux系统安装时分区的选择
    (转)硬盘分区备忘(主分区,扩展分区和逻辑分区)以及Linux硬盘分区工具parted 介绍
    (转).tar.gz文件和.rpm文件的区别
    (转)Linux(Centos)之安装Java JDK及注意事项
    ibatis中integer类型
    ibatis时间比较大小
  • 原文地址:https://www.cnblogs.com/liangchengyang/p/9474992.html
Copyright © 2011-2022 走看看