一.函数参数的两大分类:
1. 形式参数
在函数定义阶段从左往右依次写入的变量名就叫形式参数,简称"形参"
def func(a,b):
pass
# 这里的a和b就是形式参数,形参
2. 实际参数
在函数调用阶段从左往右依次写入的变量值就叫实际参数,简称"实参"
func(1, 2)
# 这里的1和2就是实际参数
'''
形参和实参是什么样的关系
形参相当于变量名,实参相当于变量值
他们两个在函数调用阶段临时绑定,函数运行结束立马断开联系
'''
# 形参的表现形式就一种
# 实参的表现形式有多种
二.位置参数:
位置参数
# 从左往右依次写入的数据就是位置参数
位置形参
# 在定义函数的时候,从左往右依次写入的变量名就是位置形参
位置实参
# 在函数调用阶段,从左往右依次写入的变量值就是位置实参
# 写一个可以比较两个数字大小的函数,哪个大返回哪个值
def my_max(a, b):
print(a, b)
if a > b:
return a
else:
return b
res = my_max(1, 2)
print(res)
# 关键字实参
my_max(b=1, a=2) # 关键字参数
通过形参名=变量值的形式传递
'''
位置形参和位置实参的关系:
位置实参从左往右依次传递给位置实参(一一对应)
'''
三.默认参数
默认形参:
在函数定义阶段,两种情况:
1. 如果你没有给形参传递值,就使用默认的
2. 如果你给形参传递了值,就使用你给的
# 用户注册功能:
def register(name, age, gender='male'):
print('%s:%s:%s' % (name, age, 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)
# index(1, 2, 3, 4)
# index(1, 2, 3, 4, 5, 6, 7, 8)
# index()
# index(1, 2, 3)
# index(1, 2, 3, 4, 5, 6)
# index()
index(1, 2)
index(1, 2, 3, 4, 5, 6)
'''
*在形参中的使用:
接收多余的位置实参,把多余的实参赋给*号后面的变量名,(元组形式)
'''
2. 无论我在函数调用阶段传递多少个关键字实参都可以
# 2. 无论我在函数调用阶段传递多少个关键字实参都可以
def index(a, b, **x):
print(x)
# index() # {}
index(a=1, b=2, c=3) # {'a': 1, 'b': 2, 'c': 3}
'''
**号在形参中的使用:
接收多余的关键字参数,把多余的关键字参数赋给了**号后面的变量名,以字典的格式
'''
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 index(a, b, c):
# print(args)
print(a, b, c)
# l = [11, 22, 33]
t = (11, 22, 33)
# index(l)
# index(l[0], l[1], l[2]) # index(11, 22, 33)
# index(*l) # index(11, 22, 33)
'''**号在实参中的使用'''
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(): # func函数名就在全局名称空间中
pass
a = [11, 22, 33]
# for i in a: # i 也在全局名称空间中
# print(i)
#
# print(i)
while True:
x = 123 # 也在
break
# 查看全局的名称空间
print(globals())
-3 局部名称空间
# 在函数体中存在的都是局部的
def index(a, b, c):
x = 222
y = 111
# 查看局部的名称空间
print(locals())
index(1, 2, 3)
六.名字的查找顺序:
查找顺序:
1. 看自己位置在哪里:
如果在局部:局部 >>> 全局 >>> 内置
如果在全局: 全局 >>> 内置
# 局部名称空间的嵌套:
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()