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函数
  • 相关阅读:
    字符读取流缓冲区
    Runtime、System类
    字符流和字节流
    将C盘一个文本文件复制到D盘。
    DateDemo
    Collection单列集合 Map双列集合
    泛型
    Collection接口
    String类
    Python代码约定
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10255409.html
Copyright © 2011-2022 走看看