Python函数进阶


一.函数两大分类

1.1 形式参数

在函数定义阶段括号内所填写的参数,简称“形参”

def test(a,b):
    pass
# a和b两个参数就是test的形参

1.2 实际参数

在参数调用阶段括号内传入的参数,简称“实参”

1 def test2(x,y):
2     pass
3 # x,y就是test1的实参

1.3 形参与实参的关系

我们可以将形参看成是变量名,实参看成是变量值,两者在函数调用阶段临时绑定,函数运行结束断开。实参的表现形式只有一种就是变量名,实参的表现形式有很多种,实参核心其实就是数据值。

二.位置参数

2.1 定义

位置参数按照从左往右的顺序依次填入的参数

2.2 分类

位置形参:在函数定义阶段括号内按照从左往右的顺序依次填入的变量名

位置实参:在函数调用阶段括号内按照从左往右的顺序依次传入的数据值

操作注意事项

1.位置形参与位置实参在函数调用阶段,按照位置一一对应绑定

2.位置实参在绑定的时候多一个少一个都不可以

3.格式越简单的越靠前,格式越复杂的越靠后

三.默认参数

3.1 定义

默认形参:函数在定义阶段就可以给形参赋值了

1.该形参在函数调用阶段如果不给值,则使用默认的

2.该形参在函数调用阶段也可以继续给值,则使用你给的

1 # 定义学员注册功能
2 def register(name, age, gender='male'):
3     print('%s:%s:%s' % (name, age, gender))
4 
5 
6 register('jason', 18, 'male')  # jason:18:male

位置形参与默认形参在定义的时候,位置形参必须在默认形参的前面

越简单的越靠前,格式越复杂的越靠后

四.可变长参数

4.1 函数无论传入多少位置参数都可以正常运行

可变长参数

1 def test2(x, y, *a):
2     print(x, y, a)
3 test2(13, 25, 45, 67, 43, 21)  # 13 25 (45, 67, 43, 21)
4 test2(13, 14)  # 13 14 ()  

*号用来接收多于位置的参数,并组织成元组的形式赋值给*后面的变量名

4.2 函数无论传入多少关键字参数都可以正常运行

**号在形参中的使用

用于接收多余的关键字参数,并组织成字典的形式赋值**好后面的变量名

1 def test3(x,y,**b):
2     print(x,y,b)
3 test3(x=23,y=2,)
4 test3(x=24,y=26,a=1234)

4.3 定义一个函数无论传入多少位置参数和关键字参数都可以正常运行

可变长形参,*与**后面的变量名其实是可以随便定义的

1 def test4(*a, **b):
2     print(a, b)
3 
4 
5 test4(3, 5)
6 test4(0)
7 test4(1, 2, 3)
8 test4(1, 2, 3, 4)
9 test4(1, 2, 3, 4, a=1, b=2, c=3, d=4)

如果test4形参是*args,列表里面有很多元素,如何实现按照位置一一传值

会将列表,元组内的元素打散成参数的形式一一传值

1 def test4(a, b, c):
2     print(a, b, c)
3 
4 
5 new_list = [1, 2, 3]
6 old_tuple = (1, 2, 3)
7 test4(new_list[0], new_list[1], new_list[2])
8 test4(*new_list)
9 test4(*old_tuple)

五.名称空间

5.1 什么是名称空间

用于存放变量名与变量值绑定关系的地方

5.2 名称空间的分类

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.局部名称空间

函数体代码运行之后产生的都是局部名称空间

六.名字的查找顺序

6.1 在查找名字的时候 要先确定自己当前在哪

1.如果你在局部

局部>>>全局>>>内置

2.如果你在全局

全局>>>内置

6.2 函数的定义阶段名字的查找顺序

函数在定义阶段名字的查找顺序就已经固定死了(特例)

相关