python 函数参数

内容概要

  • 函数参数的两大分类
  • 位置参数与关键字参数
  • 默认参数
  • 可变长参数
  • 其他函数参数补充
  • 名称空间的概念

内容详细

函数参数的两大分类

            形式参数
                在函数定义阶段括号所填写的参数 简称'形参'
                    def func(a, b):
                        pass
                    # a和b就是函数func的形参
            实际参数
                在函数调用阶段括号内传入的参数 简称'实参'
                    fun(1, 2)
                    # 数据1和2就是函数func的实参

            '''
            形参与实参的关系
                我们可以将形参看成是变量名 实参看成是变量值
                    两者在函数调用阶段临时绑定 函数运行结束断开

            形参的表现形式只有一种就是变量名
            实参的表现形式有很多种(但是把握核心 就是数据值)

            '''

位置参数

            位置参数
                按照从左往右的顺序依次填入的参数
            位置形参
                在函数定义阶段括号内按照从左往右的顺序依次填入的变量名
            位置实参
                在函数调用阶段括号内按照从左到右的顺序依次传入的数据值

            # 定义一个可以比较大小的函数(传入两个值 返回较大的)


            关键字实参(可以打破位置顺序)
                在函数调用阶段通过形参名=数据值的形式指名道姓的传值
                '''
                1.位置形参与位置实参在函数调用阶段 按照位置一一对应绑定
                2.位置参数在绑定的时候多一个不行少一个也不行

                '''


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



默认参数

            默认参数
                默认形参
                    函数在定义阶段就可以给形参赋值了
                        1.该形象在函数调用阶段如果不给值 则使用默认的
                        2.该形参在函数调用阶段也可以继续给值 则使用你给的

            # 定义学员注册功能
            def register(name, age, gender='male'):
                    print('%s:%s:%s' % (name, age, gender))
                register('jason', 18)
                register('tony', 28)
                register('kevin', 38)
                register('lili', 18, 'female')
                register('lili', 18, gender='female')

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

                '''

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

可变长参数

            # 1.函数无论传入多少位置参数都可以正常运行
            # 可变长形参
            # def func(x,y,*a):
            #     print(x,y,a)
            # func()  # 报错
            # func(1)  # 报错
            # func(1, 2, 3, 4, 5, 6, 7)  # (1, 2, 3, 4, 5, 6, 7)
            # func(1,2)  # 1 2 ()
            # func(1,2,3,4,5,6,7,8,9)  # 1 2 (3, 4, 5, 6, 7, 8, 9)
            # func(1,2)  # 1 2 (3, 4, 5, 6, 7, 8, 9)


            """
            *号在形参中的使用
                用于接收多余的位置参数 并组织成元组的形式赋值给*号后面的变量名
            """


            # 2.函数无论传入多少关键字参数都可以正常运行
            # def index(x, y, **b):
            #     print(x, y, b)
            # index()  
            # index(x=1,y=2,c=3,d=4)  
            # index(y=2, x=1)  # 1 2 {}
            # index(y=2, x=1, u=222, k=111, l=444)  # 1 2 {'u': 222, 'k': 111, 'l': 444}

            """
            **号在形参中的使用
                用于接收多余的关键字参数 并组织成字典的形式赋值给**号后面的变量名
            """

            # 3.定义一个函数无论传入多少位置参数和关键字参数都可以正常运行
            # def index(*a,**b):
            #     print(a,b)
            # index()  # () {}
            # index(1,2,3,4)  # (1, 2, 3, 4) {}
            # index(a=1,b=2,c=3)  # () {'a': 1, 'b': 2, 'c': 3}
            # index(1,2,3,4,a=1,b=2,c=3)  # (1, 2, 3, 4) {'a': 1, 'b': 2, 'c': 3}


            """
            墨守成规
                可变长形参 *与**后面的变量名其实是可以随便定义的
                但是python中推荐使用
                    *args  
                    **kwargs 
            def index(*args, **kwargs):
                pass
            """


            # def index(a, b, c):
            #     print(a,b,c)
            # new_list = [11,22,33]
            # index(new_list)  # 肯定不行  列表是一个整体 相当于一个实参
            # index(new_list[0],new_list[1],new_list[2])  # 可以
            '''如果index形参是*args 列表里面有很多元素 如何实现按照位置一一传入'''
            # def index1(*args):
            #     print(args)
            # new_list1 = [11,22,33,44,55,66,77,88,99]
            # index1(*new_list1)  # index1(11,22,33,44,55,66,77,88,99)
            """
            *号在实参中的使用
                会将列表、元组内的元素打散成位置参数的形式一一传值
            """

            # def index2(**kwargs):
            #     print(kwargs)
            new_dict = {'username':'jason','pwd':123}
            # index2(**new_dict)  # index2(username='jason',pwd=123)
            # {'username': 'jason', 'pwd': 123}
            """
            **号在实参中的使用
                会将字典内的键值对打散成关键字参数传入
            """



函数参数补充(了解)

            1.命名关键字参数
                def redister(name, age, *, sex, height):
                    pass

                # register('jason', 18, 'male', 183)
                redister('lili', 18, sex='male', height='180') # 正确使用

                '''
                sex height在传入实参的时候必须以关键字参数的形式

                PS:该类型对的参数几乎不用 也几乎很少用到

                '''

名称空间

            # 什么是名称空间(namespaces)
                用于存放变量名与变量值绑定关系的地方(类似于民政局)

            # 名称空间的分类(重要)
                1.内置名称空间
                    python解释器提前给定义好了
                            print()
                            len()
                            ...
                 2.全局名称空间
                    在py文件中顶格编写的代码运行之后都会存入全局名称空间
                        name = 'jason'  # name全局
                        def fun():  # func全局
                            pass
                        if 1:
                            a = 123  # 全局
                        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()

posted @ 2021-11-15 16:27  风花雪月*  阅读(52)  评论(0编辑  收藏  举报