函数知识点整理

时间:2022-11-17 14:59:30

函数

  • 一组语句通过一个名字(函数名)封装起来,想要执行的时候只需要调用其函数名即可

特性

  • 减少重复代码
  • 程序可扩展
  • 程序容易维护

参数

  • 形式参数

    • 函数被调用时分配内存,调用结束后释放
    • 形参只在函数内部有效
  • 实际参数

    • 常量、变量、表达式、函数等对象
  • 默认参数
  • 关键参数

    • 指定参数名传参数,关键参数放在位置参数之后
  • 非固定参数1

    • *args, 传入的参数就是一个元组
    • 如果参数中出现 *args, 传递的参数就可以不再是固定个数,传过来的所有参数打包元组
    • 如果传入的参数是一个列表或元组,那么就要在列表或元组前面加上*
    • 要放在传入参数的最后
  • 非固定参数2

    • **kwargs, 传入的参数就是一个字典

返回值

  • return
  • 可以返回任意对象,return代表函数的结束

局部变量

  • 定义在函数里的变量,只能在函数里生效

全局变量

  • 定义在函数外部一级代码的变量,全局能用
  • 如果全局和局部都有一个同名变量,函数的查找顺序是由内而外。

global

  • 在函数中定义全局变量
  • 需要先global声明全局变量,后定义变量值
  • 不建议函数中改全局变量

函数里不能直接修改的数据

  • 字符串
  • 数字
  • 布尔值

作用域 scope

  • python中函数就是一个作用域,局部变量定义在作用域中
  • 代码定义完成后,作用域已经生成(不是调用的时候才生成),作用域链向上查找

嵌套函数

  • 函数里层再定义函数

匿名函数

  • lamda

    • map(lambda x:x + 1, list(range(10)))

高阶函数

  • 接收一个或多个函数作为参数输入
  • return返回另外一个函数

递归

  • 函数的内部调用函数本身
  • 必须有明确的结束条件
  • 每次递归问题规模都应有所减少
  • 递归效率不高,递归层数太多会导致栈溢出

命名空间 namespace

  • 记录对象和对象名字对应关系的空间
  • LEGB访问规则

    • 往上寻找,由内而外
  • 局部命名空间 local

    • 函数的参数
    • 局部变量
    • 类的属性
  • 闭包命名空间 enclosing function

    • 闭包函数的命名空间(Python3引入)
  • 全局命名空间 global

    • 读取一个模块(.py)后产生的命名空间
  • 内建命名空间 build-in

    • Python解释器启动时自动载入__built__模块形成的名称空间
    • 各种内置函数str/list/open

闭包

  • 闭包是一种代码组织结构
  • 内部函数可以使用外部函数变量的行为,就叫闭包

    • 闭包是由函数及其相关的引用环境组合而成的实体
    • 而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回
def foo():
    m = 3
    n = 5
    def bar():
        a = 4
        return m + n + a
    return bar
>>>bar = foo()
>>>bar()

装饰器

  • 语法糖
  • 本质是一个返回函数的高阶函数
  • 想对一个函数扩展功能,又不希望修改原函数代码的情况下就需要装饰器