今日内容概要
- 函数参数的两大分类
- 位置参数和关键字参数
- 默认参数
- 可变长参数(重点)
- 名称空间的概念
今日内容详细
函数参数的两大分类
1. 形式参数
在函数定义阶段从左往右依次写入的变量名就叫形式参数,简称"形参"
def func(a,b):
pass
# 这里的a和b就是形式参数,形参
2. 实际参数
在函数调用阶段从左往右依次写入的变量值就叫实际参数,简称"实参"
func(1, 2)
# 这里的1和2就是实际参数
'''
形参和实参是什么样的关系
形参相当于变量名,实参相当于变量值
他们两个在函数调用阶段临时绑定,函数运行结束立马断开联系
'''
# 形参的表现形式就一种
# 实参的表现形式有多种
位置参数
从左往右一次写入的数据就是位置参数
位置形参
在定义函数的时候,从左往右依次写入的变量名就是位置形参
位置实参
在函数调研阶段,从左往右依次写入的变量值就是位置实参
练习
写一个可以比较两个数字大小的函数,哪个大返回哪个值
'''
位置形参和位置实参的关系:
位置实参从左往右依次传递给位置实参(一一对应)
'''
关键字参数
my_max(b=1, a=2) # 关键字参数
通过形参名=变量值的形式传递
默认参数
在函数定义阶段的两种情况
1.如果没有定义给形参传递值,就使用默认的
2.如果给形参传递了值,就用提供的值
# 用户注册功能:
def register(name, age, gender='male'):
print('%s:%s:%s' % (name, age, gender))
如果 gender=[]的时候
# 练习题2:
x = 100
def index(a, b, c=x):
print(a, b, c)
x = 200
index(1, 2)
'''
第一种解释:
函数在定义阶段,已经把值固定死了
第二种解释:
变量名与变量值在内存中的关系判断
可变长参数
1.无论在函数调用阶段传递多少个位置实参都可以
def index(x, y, *a): 用(*形参)实现
print(x, y)
print(a)
'''
*在形参中的使用:
接收多余的位置实参,把多余的实参赋给*号后面的变量名,(元组形式)
'''
2.无论在函数调用阶段传递多少个关键字实参都可以
def index(a, b, **x):
print(x)
'''
**号在形参中的使用:
接收多余的关键字参数,把多余的关键字参数赋给了**号后面的变量名,以字典的格式
'''
3.无论在函数调用阶段传递多少个位置参数和关键字参数都可以
def index(u, z=100, *a, **b, ):
print(a)
print(b)
print(u)
# index()
index(1, 2, x=1, y=2)
'''
默认参数只要不放在**后面都可以
*号后面和**号后面的变量名可以任意命名
但是,在python中推荐使用
*args => arguments
**kwargs => keyword arguments
def func(a, b, c, *args, **kwargs):
pass
'''
*在实参中的应用
可以把元祖或者列表中的元素作为实参传值给形参
**号在实参中使用
def func(username, password):
print(username, password)
d = {'username': 'jason', 'password': 222}
# func(d['x'], d['y'])
func(**d) # func(username='jason',password=222)
func(username='jason', password=222)
名称空间的概念
1.什么是名称空间?
就是绑定变量名和变量值的地方
2.名称空间的分类
(1)内置名称空间
在python解释器中
如:len(),print(),open()
(2)全局空间
在py文件中,顶格写的都是全局名称空间
name='ly'
def (): #func函数名就在全居民称空间中
a=[11,22,33]
for i in a: # i 也在全局名称空间中
print(i)
while True:
x=123 #也是
查看全局名称空间
print(globais())
局部名称空间
在函数体中存在的都是局部的
def index(a, b, c):
x = 222
y = 111
# 查看局部的名称空间
print(locals())
index(1, 2, 3)
名字的查找顺序
查找顺序:
1.看自己的位置在哪里:
如果是在局部:局部》全局》内置
如果是在全局:全局》内置
局部名称空间的嵌套:
需要一层层调用
print(x)》666
def f1():
# x = 222
def f2():
# x = 333
def f3():
# x = 444
def f4():
# x = 555
def f5():
# x = 666
print(x)
f5()
f4()
f3()
f2()
f1()
名称空间的作用域
即名称空间的作用范围
1.内置名称空间
在任意位置都可以使用
2.全局名称空间
在整个py 文件中都可以使用
3.局部名称空间
一般情况下在自己的函数中使用
global和nonlocal关键字的使用
global在局部名称变量中改变全局名称变量
在局部修改全局的变量:
1. 修改的变量时不可变的类型,需要global关键字声明
2. 修改的变量是可变的类型,不需要global关键字声明
nonlocal在内部的局部名称中,修改外部名称的局部名称变量