今日主要内容
补充:传参与参数分配区别
动态传参
函数注释
名称空间
函数名的使用
函数嵌套
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,下面我们来看看动态传参具体的方法
(二)两类动态传参
动态位置参数
动态关键字参数
动态位置参数(动态接收位置参数)
先来回忆一下位置参数,按照一一对应的位置来传参
def eat(zhushi, tang): # 按照位置接收参数(形参)
print(f"主食:{zhushi} 汤:{tang}")
eat("米饭", "番茄蛋花汤") # 位置参数(实参)
# 主食:米饭 汤:番茄蛋花汤
动态接收位置参数,在形参前加一个星号*,表示可接收任意数量的形参,以元组存储
def eat(*food): # 参数前加一个星号,表示动态接收位置参数
print(food)
eat("米饭", "番茄蛋花汤") # 可以填写任意数量参数
# ('米饭', '番茄蛋花汤')
动态位置参数在python中一般用*args来表示,只是一个行业内的规范,也可以用其他变量名定义但不建议使用
def eat(*args): # 一般用*args表示动态位置参数
print(args)
eat("米饭", "番茄蛋花汤") # 可以填写任意数量参数
# ('米饭', '番茄蛋花汤')
结合之前两种形参(位置参数、默认值参数)共同分析
位置参数 + 动态位置参数
位置参数必须在动态位置参数前(位置参数 > 动态位置参数)
def eat(zhushi, *food):
print(zhushi, food)
eat("米饭", "红烧肉", "排骨", "烧鸡")
# 米饭 ('红烧肉', '排骨', '烧鸡')
原因:如果动态位置参数(带星的)在前,那么所有实参全部都传给了动态位置参数(带星的),后面的位置参数(不带星的)是接收不到任何实参的,导致报错
def eat(*food, zhushi):
print(food, zhushi)
eat("米饭", " 红烧肉", "排骨", "烧鸡")
# TypeError: eat() missing 1 required keyword-only argument: 'zhushi'
默认值参数 + 动态位置参数
默认参数必须在动态位置参数后( 动态位置参数 > 默认值参数)
def eat(*food, zhushi="米饭"):
print(food, zhushi)
eat("回锅肉", "红烧肉", "翡翠白玉汤")
# ('回锅肉', '红烧肉', '翡翠白玉汤') 米饭
Python基础(十)
最新推荐文章于 2022-08-10 11:06:14 发布