zoukankan      html  css  js  c++  java
  • 函数(2)

    一.形参与实参

    形参即形式参数,就是在定义函数时括号中指定的参数,本质就是一个名字

    实参即实际参数,指的是在调用函数的时候传入的参数,是一个实际的值

    在调用函数式就会自动把参数(变量名)和实参(值)进绑定,在函数调用结束之后绑定关系就解除了

    def func1(a,b): # a,b就是形参 a = 1,b = 2

        print(a)

        print(b)

    func1(1,2) # 1,2就是实参

    二.位置参数

    根据调用阶段 参数分为两类 形参和实参

    所以对应的位置参数也有两种:

    位置形参

    位置实参

    位置其实指的是顺序,从左往右来定义的参数就是位置(顺序)参数

    需要注意的是:

    只要是定义了的位置形参都必须被传值

    位置形参的数量与位置形参的数量必须一致,不能多传,也不能少传

    实参会按照传入的位置依次赋值给形参

    def func(a,b,c):# abc都是位置形参

        print(a,b,c)

    func(2,1,3) # 1,2,3都是位置实参

    def register(name,passwod,sex):

        print("my name is %s pwd:%s sex:%s" % (name,passwod,sex))

    register("123","rose","woman")

    三.关键字实参

    在调用函数时,指名道姓的为形参赋值就称之为关键字参数

    其优点是:

    可以打破传入参数的顺序,可以不与形参顺序相同

    注意:

    1.不管以什么样的方式传值,每一个形参都必须被传值

    2.关键字参数必须位于位置参数的后面

    3.不能为同一个参数传多次值

    4.使用关键字传参时,实参的名字必须与形参的名字匹配

    到底是位置参数好事关键字参数,有参数决定

    def func(a,b,c):

        print(a)

        print(b)

        print(c)

    func(1,2,c = 3) # 与位置参数没区别

    func(1,2,a = 10) # 重复为a传值了两次

    func(c = 3,1,2) # 语法错误 关键字参数出现在了位置参数的前面

    func(a = 1,c = 3,b = 2) # 可以打破位置参数的顺序限制

    def register(name,pwd):

        print("name is",name)

        print("password is",pwd)

    register(pwd="123",name="bgon")

    register("jack",pwd="321")

    可以不用完全按照顺序来传值

    open("今日内容","r",encoding="utf-8")

    四.默认形参

    在定义时,就已经为形参指定了一个值,那这个形参就称之为默认参数

    特点:

    在调用时可以不用为默认形参传值,使用这个参数时就是默认值

    当然也可以传值,这样的话内部使用就是你传入的值

    场景:

    当函数中的某一形参经常出现重复的值时,就可以将其定义为默认参数,可以简化调用代码

    需要注意:

    1.默认形参必须放在默认参数的后面

    2.默认形参的值在定义时就已经固定了 

    3.不应该将默认形参的默认值设置为一个可变类型,

    会导致每次函数调用都共用同一个默认参数,我们应该将函数设计为独立的功能,每次调用互不干扰

    只能是 int float str tulpe

    def reg(name,age,sex="woman"):

        print(name,age,sex)

    reg("rose",18)

    reg("kairy",20)

    reg("maria",39)

    reg("lili",78)

    reg("egon",38,"man")

    def reg1(name,sex,hobby,li=()):

        print(name,sex)

        print(li)

    reg1("bgon","man","music")

    reg1("cgon","man","play")

    def reg1(name,sex,hobby):

        print(name,sex)

        print(hobby)

    reg1("bgon","man",["music","play"])

    def fun(b,c,a=10):

        pass

    x = 1

    def func2(a,b=x):

        print(a,b)

    x = 100

    func2(20)

    五.可变长参数

    可变长参数指的是可以传任意个数的实参

    传入实参是为了给形参来使用,那就意味,必须让形参也具备可以接受任意个数的实参的能力

    也就是*和**

    *的使用

    带*的形参

    带*的形参表示可以接受任意个数的实参,接收到的实参会被打包成元组类型

    形参的名字可以随意,但是建议用args是arguments的缩写

    带*的实参

    在实参前面加*,会自动将*后的值,打散("abc" 打散 成了 "a","b","c")

    带*的形参不能接收关键字实参

    可变长形参与位置形参混合使用

    1.当可变长形参出现了位置形参的前面时,那么后面的位置形参必须以关键字实参来传入

    2.当可变长形参出现在位置形参后面,会按照顺序给前面位置形参赋值最后剩余的就赋值给可变长args

    **的使用

    形参中如果带有**,会把关键字打包成字典类型传入

    只能接收多出来的关键字实参

    实参中带**,会把**后的字典(也必须是字典类型)打散,成关键字实参(**{"a":1} 打散为 a = 1)

    *和**可以为函数预留扩展空间,后期可以根据需求增加参数,而且旧的函数调用方式也不会出现问题,简单的说就是提高函数的扩展性

    def func(*args):

        print(args)

        pass

    func(1)

    func(1,2)

    func(1,2,3)

    def func(a,b,c,d,e):

        print(a,b,c,d,e)

    func(1,2,*[0,9,8]) # func(1,2,a,b,c)

    iterable 可迭代的  只要是可以被for in 循环使用的都是可迭代 字符串 列表 元组  字典 集合

    func(a=1)

    func(a=1,b=2)

    func(a=1,b=2,c=3)

    位置形参与 可变长形参混合使用

    当可变长形参出现在了位置形参的前面时,那么后面的位置形参必须以关键字实参来传入

    def func(*args,a,b):

        print(a,b,args)

    func(1,2,3,4,b=5)

    当可变长形参出现在位置形参后面,会先按照顺序给前面位置形参赋值最后剩余的就赋值给可变长args

    def func(a,b,*args):

        print(a,b,args)

    func(1,2,3,4,5,)

    **不能接收位置实参

    def func(**b):

        print(b)

    func(a = 100,c = "abc")

    先为前面的形参赋值,后续的多余的关键字参数赋值给**

    def func(a,c,**b):

        print(a,c)

        print(b)

    func(1,s = 100,c = "abc")

    def func(c,a=1,**b):

        print(a,c)

        print(b)

    func(1,2)

    def func(a=1,b=2,**kwargs):

        print(a,b,kwargs)

    func(a = -1,b=-2,s = 10)

    实参中带**

    def func(a,b,c):

        print(a,b,c)

    func(**{"a":"rose","b":"woman","c":18}) # func(name="rose",sex="woman")

    print(**{"name":"rose"}) # print(name="rose")

    写一个带有可变长的位置形参函数

    def func(name,pwd,**kwargs):

        if name == "bgon" and pwd == "123":

            if "phone" in kwargs:

                if kwargs["phone"] == "110":

                    print("登录成功!")

            else:

                print("请传入手机号验证!")

        else:

            print("登录失败!")

    func("bgon","123")

    func("bgon","123",phone = "110")

    该方式可以接受任意个数的位置实参和关键字实参,

    但要注意顺序,位置实参必须在关键字之前

    def inner(name,sex,age):

        print(name,sex,age)

    def outer(*args,**kwargs):

        print(args)

        print(kwargs)

        inner(*args,**kwargs) # inner(1,2,3,a=10,b=20)

    outer(1,2,3,100,a=10,b=20)

    上述写法 可以将outer接收到的所有参数 原模原样的传给inner函数

    def inner(name,sex,age):
    print(name,sex,age)

    def outer(*args,**kwargs):
    print(args)
    print(kwargs)
    inner(*args,**kwargs) # inner(1,2,3,a=10,b=20)

    outer(1,2,3,100,a=10,b=20)


    上述写法 可以将outer接收到的所有参数 原模原样的传给inner函数
  • 相关阅读:
    什么是ORM
    ORM优缺点
    Azure 中快速搭建 FTPS 服务
    连接到 Azure 上的 SQL Server 虚拟机(经典部署)
    在 Azure 虚拟机中配置 Always On 可用性组(经典)
    SQL Server 2014 虚拟机的自动备份 (Resource Manager)
    Azure 虚拟机上的 SQL Server 常见问题
    排查在 Azure 中新建 Windows 虚拟机时遇到的经典部署问题
    上传通用化 VHD 并使用它在 Azure 中创建新 VM
    排查在 Azure 中新建 Windows VM 时遇到的部署问题
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10255409.html
Copyright © 2011-2022 走看看