zoukankan      html  css  js  c++  java
  • 函数的位置形参,位置实参,可变长位置形参,关键字形参

    今天内容

    函数的参数详解
    形参与实参
    形参及形式参数,就是在定义函数是括号中指定的参数(本质就是一个名字)
    实参及实际参数,指的是在调用函数是传入的参数)(本质就是一个值)
    在调用函数是就会把形参和实参绑定在一起(变量名)
    在函数调用结束之后绑定关系就解除了
    def func1(a,b)#a,b就是形参a=1,b=2
    print(a)
    print(b)
    func1(1,2)#1,2就是实参
    位置参数(用的最多)
    根据调用阶段 参数分为两类 形参和实参
    所以对应的 位置参数也有两种
    位置形参

    位置实参
    位置,表示的是顺序,指从左往右来定义的参数就是位置参数
    需要注意的是:
    只要是定义了的位置形参都必须被传值
    位置形参的数量与位置实参的数量必须一致,不能多传也不能少传
    实参会按照传入的位置一次赋值给形参
    def func(a,b,c)a,b,c都是位置形参


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

    def register(name,password,sex):
    print('my name is %s pwd:%s sex :%s)
    register('123','rose','woman')
    关键字参数(默认函数)
    关键字实参
    在调用函数时指明到姓的为形参赋值就称为关键字参数
    优点:
    可以打破传入参数的顺序,可以不与形参顺序相同
    注意:
    1、不管以什么样的方式传值,每一个形参都必须被传值、
    2、关键字参数必须放在位置参数的后面
    3、不能为同一个参数传多次值
    到底是位置参数还是关键字参数是由实参决定
    使用关键字传参时,实参的名字必须与形参一致
    def func(a,b,c):
    print(a)
    print(b)
    print(c)
    func(1,2,c=3)与位参数没区别
    func(c=3,1,2)语法错误,关键字参数出现在了位置参数的前面
    func(c=3,a=1,b=2) 打破位置参数的顺序限制

    def register(name,pwd):
    print('name is'name)
    print('password is',pwd)
    register(name='egon',pwd='123')
    register(jack,pwd='123')
    默认形参
    在定义时,就已经为形参指定了一个值,那么这个形参就称为默认形参
    特点:
    在调用时可以不为默认形参传值,使用时就是默认值
    场景:
    当然也可以传值,这样的话内部使用的就是你传的值
    当函数中的某一形参经常出现重复的值时,就将其指定为默认形参,可以简化调用代码
    需要注意的是:
    不应将默认形参的值设置成一个可变类型
    会导致每次函数调用都共用同一个默认参数,我们应该将函数设计为独立的类型,每次调用互不干扰
    只能是不可变类型
    需要注意,
    默认形参必须放在非默认形参后面
    def reg(name age,sex='fenamle'):
    print(name,age,sex)
    reg=('rose',18,)
    reg=('rose',18,)
    reg=('egon',18,'male')

    def reg(name ,sex,hobby,li=[]):
    li.append(hobby)
    print(name,sex)
    print(li)
    reg('bgon','man'['play','music','move'])
    reg('cgon','man'['play','music','move'])


    def reg(name ,sex,hobby):
    li.append(hobby)
    print(name,sex)
    print(hobby)
    reg('bgon','man'['play','music','move'])
    reg('cgon','man'['play','music','move'])
    #可以不用完全按照顺序来传值
    open(‘xxx’,'r',encoding='utf-8')
    可变参数(重难点)
    可变长度参数指的是,可以传任意个数的实参
    传入实参是为了给形参来使用,那就意味这,形参可以接收任意个数实参的能力
    也就是* 和**
    带*的形参表示可以接收任意个数的实参,接收到的参数会被打包成元组类型


    形参的名字可以任意,但建议使用args,是参数的缩写
    # iterable可迭代的,只要可以被for in 循环的
    带*的实参会自动将*后对应的值打散'abc'打散a,b ,c


    def func(a,b,c)
    print(a,b,c,)
    func(1,2*'abc')#打散a,b ,c
    位置形参与可变长形参混合使用

    当可变长形参出现在了位置形参的前面时,那么后面的位置形参必须以关键字形参来传入
    当*可变长形参出现在位置形参后面,会按照顺序给前面位置形参,剩余的值就赋值给*args
    当可变长形参存在关键字形参时不能接受,会报错。
    **不能接收位置实参
    把传入的关键字实参打包成字典
    **使用
    形参中如果带有**,会把关键字实参打包成字典类型传入
    先为前面的形参赋值,后续的多余的关键字参数形参赋值给**
    只能接收多出来的关键字实参

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


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


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


    def func(name):
    print(name)
    func(**{'name':'rose'})(name=rose)

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

    def func(name,pwd,**args)

    if name=='bgon'and pwd=='123';
    if 'phone' in kwargs:
    if kwargs['phone']=='110'
    print('login successful')
    else:
    print('请传入手机号验证‘)
    else:
    print(error name or pwd)
    func('bgon','123')
    func(’bgon','123',phone='110')

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

    该方式可以接收任意个数的位置实参和关键字实参
    但要注意顺序,位置实参必须在关键字之前
    在装饰器中
    def inner(name,sex,age)
    print(name,sex,age)
    def func(*args,**kwargs)
    print(args)
    print(kwargs)
    inner(*args,**kwargs)#inner(1,2,3,a=10,b=20)
    outer(1,2,3,a=10,b=20)
    #上述写法,可以将outer接收到的所有参数,原模原样的传递给inner函数。


    def func(*args,a,b,)
    print(a,b,args)
    func(1,2,3,a=4,b=5)

    def func(*args)
    pass

    func(1)
    func(1,2)
    func(1,2,3)

  • 相关阅读:
    详细聊聊k8s deployment的滚动更新(一)
    更新k8s镜像版本的三种方式
    深入理解docker信号机制以及dumb-init的使用
    10分钟教你理解反射
    nodejs的交互式解释器模式常用命令
    nrm的安装和使用
    复杂sql语句之单字段分类count计数和多字段count计数
    navicat连接mysql出现2059
    mongodb常规操作语句
    System.Web.NullPointerException
  • 原文地址:https://www.cnblogs.com/tangda/p/10255243.html
Copyright © 2011-2022 走看看