一.函数参数的两大分类:
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()