函数参数的分类 | 名称空间的概念
内容概要
- 函数参数的两大分类
- 位置参数和关键字参数
- 默认参数
- 可变长参数
- 其他函数参数补充
- 名称空间的概念
形式参数
-
在函数定义阶段括号内所填写的参数,简称'形参'
-
实际参数
在函数调用阶段括号内传入的参数,简称'实参'
'''
形参与实参的关系
我们可以将形参看成是变量名,实参看成是变量值
形参的表现形式只有一种就是变量名
实参的表现形式有很多种(但是把握核心,就是数据值)
'''
位置参数
-
位置参数
按照从左到右的顺序依次填入的参数 -
位置形参
在函数定义阶段括号内按照从左到右的顺序依次填入的变量名 -
位置实参
在函数调用阶段括号内按照从左到右的顺序依次传入的数据值 -
关键字实参(可以打破位置顺序)
在函数调用阶段通过形参 = 数据值的形式指名道姓的传值
'''
1.位置形参与位置实参在函数调用阶段,按照位置一一对应绑定
2.位置参数在绑定的时候,多一个不行少一个也不行
'''
"""格式越简单的越靠前,格式越复杂的越靠后"""
默认参数
-
默认形参
函数在定义阶段就可以给形参赋值了
1.该形参在函数调用阶段如果不给值则默认使用的
2.该形参在函数调用阶段也可以继续给值,则使用你给的'''
位置形参与默认值形参在定义的时候
位置形参必须在默认值形参的前面
'''
'''格式越简单的越靠前 格式越复杂的越靠后'''
可变长参数
1.函数无论传入多少位置参数都可以运行
def func(x, y, *a):
print(x, y, a)
func(1, 2, 3, 4, 5, 6, 7)
func(1, 2)
func(1, 2, 3, 4, 5, 6, 7, 8, 9)
func(1, 2)
"""
*号在形参中的使用
用于接收多余的位置参数,并组织成元组的形式赋值给 *号后面的变量名
"""
2.函数无论传入多少关键字参数都可以正常运行
def index(x, y, **b):
print(x, y, b)
index(y=2, x=1)
index(y=2, x=1, u=222, k=111, l=444)
"""
**号在形参中的使用
用于接收多余的关键字参数,并组织成字典的形式赋值给 **号后面的变量名
3.定义一个函数无论传入多少位置函数和关键字都可以正常运行
def index(x, y, **b):
print(x, y, b)
index(y=2, x=1)
index(y=2, x=1, u=222, k=111, l=444)
def index(*a, **b):
print(a, b)
index()
index(1, 2, 3, 4)
index(a=1, b=2, c=3)
index(1, 2, 3, 4, a=1, b=2, c=3)
"""
墨守成规
可变长形参 *与 *后面的变量名其实是可以随便定义的
但是python推荐使用
args
**kwargs
def index(args, **kwargs):
pass
"""
def index1(*args):
print(args)
- new_list1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
index1(*new_list1)
"""
*号在实参中的使用
会将列表、元组内的元素打散成位置元素的形式一一传值
"""
def index2(**kwargs):
print(kwargs)
- new_dict = {'username': 'jason', 'pwd': 123}
index2(**new_dict)
"""
**号在实参中的使用
会将字典内的键值对打散成关键字参数传入
"""
函数参数补充
1.命名关键字参数
def register(name, age, *, sex, height):
pass
register('lili', 18, sex='male', height='1.8m')
"""
sex height在传入实参的时候必须以关键字参数的形式
ps:该类型的的参数基本不用,也几乎很少碰到
"""
名称空间
-
什么是名称空间
用于存放变量名与变量值绑定关系的地方 -
名称空间的分类
1.内置名称空间
python解释器提前定义好的
print()
len()
...
2.全局名称空间
在py文件中顶格编写的代码运行之后都会存入全局名称空间
name = 'jason' # name全局
def func(): # func全局
pass
if 1:
a = 123 # a全局
for i in range(10):
print(i) # i全局
while True:
a = 123 # a全局
3.局部名称空间
函数体代码运行之后产生的都是局部空间
- 存活周期
1.内置名称空间
python解释器启动与关闭而创建和销毁
2.全局名称空间
随着py文件的运行与结束而创建和销毁
3.局部名称空间
随着函数体代码的执行与结束而创建和销毁
名字查找的顺序
- 在查找名字的时候,要确定自己当前在哪
1.如果你在布局
布局 >>> 全局 >>>内置
2.如果你在全局
全局 >>> 内置
- 局部名称空间的嵌套
'''函数定义阶段名字的查找就已经固定死了(特例)'''
x = 111
def f1():
x = 222
def f2():
x = 333
def f3():
x = 444
def f4():
x = 555
print(x)
# x = 555 特例
f4()
f3()
f2()
# 通过调用f1 执行所有的函数
f1()