Python - 03 - 函数

128 阅读3分钟

函数

  • 定义

    • def 函数的名字():
    • 实参: 实际调用的时候传递的信息
      1. 位置参数:按照位置传递参数
      2. 关键字参数:按照参数名字传递参数
      3. 混合参数:顺序- 位置参数放前面,关键字参数放后面
      4. 实参在执行的时候,必须要保障形参有数据
      5. 传递一个数组或者字典
        1. 使用 list传递,是把列表打散成位置参数进行传递给args
        2. 使用 dict,是把字典传递给args
    • 形参: 在函数定义的时候,需要准备的变量来接收信息
      1. 位置参数
      2. 默认值参数
      3. 动态参数
        1. *args 表示接收所有的位置参数的动态传参放到一个元祖中
        2. **args 表示接收所有的关键字的动态传参
      4. 顺序: 位置> *args > 默认值 > **args
  • 内置函数

    • format: 格式化
      • format(str,"08b") : b代表转成二进制,8代表最低8位,0代表补齐位置填0
    • ord: python中使用的是unicode,计算出传入文字在unicode中的码位
    • chr: 输入码位,输入文字
    • all: 传入可迭代对象,判断其中元素是否都为true,相当于and
    • any: 传入可迭代对象,相当于or
    • enumerate: 将数组转为(索引,元素)的元祖
    • hash: 哈希,将传入参数计算转为数字,然后进行数据存储-> 字典(集合)哈希表
    • id: 获取传入参数的内存地址
    • dir:传入参数,告诉你当前参数可以进行哪些操作
    • zip:可以把多个可迭代对象合并
    • locals:以字典的类型返回当前位置的全部局部变量
    • globals:以字典的类型返回全部全局变量
    • sorted:排序,默认从小到大,参数1:列表,参数2:排序函数
    • filter:筛选,参数1:排序函数,参数2:列表
    • map:参数1:排序函数,参数2:列表
  • global:在函数局部引入全局变量用来改变全局变量的值

  • nonlocal:在局部,引入外层的局部变量(如果没有,再往外一层找,直到全局(但不包括全局变量)),用来改变值

  • 装饰器

    1. 本质上是个闭包
    2. 作用:在不改变原有函数调用的情况下,给函数增加新的功能
    3. 作用:可以在函数前后增加新功能
    def wrapper(fn):   # wrapper:装饰器  fn:目标函数
        def inner(*args,**kwargs):
            #在目标函数执行之前...
            fn(*args,**kwargs)
            #在目标函数执行之后...
       return inner
    
  • 迭代器

    1. for...in...必须是可迭代对象
    2. 可迭代对象提供一个迭代器
    3. 迭代器本身是可以被迭代的
    4. iter() 内置函数可以拿到迭代器
    5. __ iter __() 特殊方法
    6. next() 逐一拿出元素
    7. __ next __() 特殊方法
    8. 迭代器的特性
      • 只能向前不能反复
      • 特别节省内存
      • 惰性机制
      for item in "123".__iter__():
          try: 
              data = item.__next__()
              print(data)
          except StopIteration:
              break
      
  • 生成器

    1. 本质上就是迭代器
    2. 创建生成器的2种方式
      1. 生成器函数
      2. 生成器表达式
    3. 生成器有关键字yield
    4. 生成器函数执行的时候并不会执行函数,得到的是生成器
  • 推导式

    1. 作用: 简化代码
    2. 语法:
      1. 列表推导式:[数据 for循环 if判断]
      2. 集合推导式:{数据 for循环 if判断}
      3. 字典推导式:{k:v for循环 if判断}
      4. 没有元祖推导式,因为元祖不可增加改变
      5. (数据 for循环 if判断) : 这个叫生成器表达式(一次性的)
  • 匿名函数

    • lambda表达式
      • 语法: 变量 = lambda 参数1,参数2,参数3... : 返回值