函数进阶

函数的参数类型

  • 不可变类型参数:字符串str,数值型,元组tuple
    • 传递的参数不会影响参数本身,只是修改了另一个复制的对象
  • 可变类型参数:列表list,字典dict
    • 传递参数会影响参数本身

命名空间

  • 定义:保存程序中的变量名和值的地方。命名空间的本质是一个字典,用来记录变量名称和值

  • 命名空间一共分为三种:局部命名空间、全局命名空间、内置命名空间

    • 局部命名空间:每一个函数都有自己的命名空间,记录函数内部的变量,函数的参数
    • 全局命名空间:每个模块都有自己的命名空间,记录了模块的变量,类,导入的模块
    • 内置命名空间:任何模块都可以访问,记录内置函数和异常
  • 命名空间的访问

    • 局部命名空间使用 locals() 函数来访问
    • 全局命名空间的访问使用 globals()函数访问
  • 命名空间的加载顺序:内置-->全局--局部

  • 命名空间的查找顺序:局部-->全局-->内置

作用域

  • 定义:是变量在程序中的可应用范围

  • 分类:分为4类 LEGB

    • L-->local(函数内部) 局部作用域
    • E-->enclosing 嵌套作用域
    • G-->global 全局作用域
    • B-->built in 内建作用域
  • 模块,类,函数会产生新的作用域, 条件语句if,循环语句while,for不会产生新的作用域

全局变量和局部变量

  • 局部变量:在函数中定义的变量成为局部变量,只在函数内部起作用

  • 全局变量:在程序一开始定义的变量成为全局变量,全局变量的作用域是整个程序

  • global 关键字可以将一个局部变量变成一个全局变量

    • 格式:global 变量名
  • nonlocal:可以修改外层(非全局)变量 -->嵌套作用域的变量

    -格式:nonlocal变量名

内置函数

  • abs()函数:求绝对值 abs(数据)

  • max()函数:求最大值, max(一组数据,key=func)

    • 将迭代器的每一个返回值当做参数传给 key=func 中的 func(一般用 lambda 表达式定 义) ,然后将 func 的执行结果传给 key,然后以 key 为标准进行大小的判断
  • map(func,iterable) 函数 ,第一个参数是函数,第二个参数是可迭代对象

    • 函数会作用在可迭代对象内容的每一个元素上进行计算,返回一个新的可迭代内容
  • filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进判 然后返回 True 或 False,最后将返回 True

  • zip 函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个 tuple, 然后返回一个可迭代的 zip 对象

匿名函数

  • 定义:在定义函数的时候,如果不想给函数起名字,可以用lambda定义一个匿名函数

  • 语法:变量名=lambda [参数]:表达式

    • 注意:1.表达式中不能有循环,return,可以包含if..else

      ​ 2.表达式的结果直接返回

  • lambda 表达式也会产生一个新的局部作用域。在 def 定义的函数中嵌套 labmbda 表达式,

    lambda 表达式 能够看到所有 def 定义的函数中可用的变量

闭包和装饰器

  • 闭包

    • 1.嵌套 2.内层函数使用外层函数的参数或者变量 3.外层函数返回内层函数的引用
  • 装饰器:本质就是一个闭包函数

    import time
    def timer(f):
        def innner():
            start = time.time()
            f()
            end = time.time()
            print("程序运行的时间是:",end-start)
        return innner
    @timer
    def func():
        lst = []
        for i in range(10000):
            lst.insert(0,i)
    func()
    
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。