今日主要内容

  • 补充:传参与参数分配区别
  • 动态传参
  • 函数注释
  • 名称空间
  • 函数名的使用
  • 函数嵌套
  • global和nonlocal

补充:传参与参数分配区分

  • 先看一个函数定义和函数调用

    def func(a, b):   print(b, a)  a = 5 b = 10     func(b, a)  # 5 10

    • 粉色箭头是传参的过程
    • 青色箭头是分配参数的过程
  • 传参的过程按照参数类型进行,位置参数按顺序一一对应传参,与变量名是什么无关

  • 而参数分配是函数自己的事,函数体属于函数,分配参数的过程要按照变量名分配

一、动态传参

(一) 为什么要用动态传参

  • 先来看一个例子:

    • 定义一个吃饭的函数,每次调用时传入要吃的东西,打印菜单
    def eat(zhushi, huncai, sucai, tang, tiandian):   print("我要吃:", zhushi, huncai, sucai, tang, tiandian)  eat("大米饭", "红烧肉", "烧茄子", "番茄汤", "慕斯") # 我要吃: 米饭 红烧肉 烧茄子 番茄汤 慕斯
    • 这可能是我的饭量,但是这时来了一个女生,女生吃不了这么多啊,只选了一个小花卷,一盘黄瓜炒鸡蛋
    def eat(zhushi, huncai, sucai, tang, tiandian):   print("我要吃:", zhushi, huncai, sucai, tang, tiandian)  eat("小花卷", "黄瓜炒鸡蛋") # TypeError: eat() missing 3 required positional arguments: 'sucai', 'tang', and 'tiandian'
    • 由于我填入的参数与定义的参数数量不对应,调用时就会报错,怎么解决这个事情呢,这就要用到了我们的动态传参。
  • 动态传参可以给函数传入不定量的参数,以元组、字典的方式打包起来,这就解决了我们填入参数是数量不定引发的error,下面我们来看看动态传参具体的方法

(二)两类动态传参

  • 动态位置参数
  • 动态关键字参数
  1. 动态位置参数(动态接收位置参数)

    • 先来回忆一下位置参数,按照一一对应的位置来传参
    def eat(zhushi, tang):  # 按照位置接收参数(形参)  print(f"主食:{zhushi} 汤:{tang}")  eat("米饭", "番茄蛋花汤")  # 位置参数(实参) # 主食:米饭 汤:番茄蛋花汤
    • 动态接收位置参数,在形参前加一个星号*,表示可接收任意数量的形参,以元组存储
    def eat(*food):  # 参数前加一个星号,表示动态接收位置参数  print(food)  eat("米饭", "番茄蛋花汤")  # 可以填写任意数量参数 # ('米饭', '番茄蛋花汤')
    • 动态位置参数在python中一般用*args来表示,只是一个行业内的规范,也可以用其他变量名定义但不建议使用
    def