zoukankan      html  css  js  c++  java
  • Python学习心得第四周-01 函数的参数

    1、函数的参数分为两大类:形参与实参
    形参:指的是在定义函数时,括号指定的参数,本质就是变量名
    实参:指的是在调用函数时,括号内传入的值,本质就是值

    只有在调用函数时才会在函数体内发生实参(值)与形参(变量名)的绑定关系
    该绑定关系只在调用函数时临时生效,在调用函数结束后就解除绑定
        def foo(x,y): #x=1,y=2
            print(x)
            print(y)
    
        # a=1
        # b=2
        # foo(a,b)
        foo(1,2)
    2、位置参数:
    位置形参:在定义函数时,按照从左到右的顺序依次定义的形参称之为位置形参
    注意:
    1、但凡是按照位置定义的形参,在调用函数时必须其传值,多一个不行少一个也不行

    位置实参: 在调用函数时,按照从左到右的顺序依次传入的值
    注意:
    1、在传值是按照顺序与形参一一对应

    3、关键字实参:
    在调用函数时,按照key=value的形式定义的实参,称之为关键字实参
    注意:
    1、在传值时可以完全打乱顺序,但仍然能指定道姓地为指定的参数传值
    2、可以在调用函数时,混合使用位置实参与关键字实参
    但是位置实参必须跟在关键字实参左边
    并且不能为一个形参重复传值
    def foo(x,y,z):
        print(x,y,z)
    
    
    # foo(1,2)
    # foo(1,2,3,4)
    # foo(1,2,3)
    foo(3,2,1)
    
    def register(name,sex,age):
        print(name)
        print(sex)
        print(age)
    
    
    register('egon','male',18)
    register('male','egon',18)
    
    register('egon','male',18)
    register(sex='male',name='egon',age=18)
    register('egon',age=18,sex='male')
    register(name='egon','male',age=18)
    register('male',name='egon',age=18)
    register('egon',age=18,sex='male')
    4、默认参数:
    在定义函数时,就已经为某些参数绑定值,称之为默认参数
    注意:
    1、在定义阶段就已经有值,意味在调用阶段可以不用为其传值
    2、默认形参必须放到位置形参的后面
    3、默认形参的值只在定义阶段生效一次,在函数定义之后发生的改动无效
    4、默认形参的值通常应该是不可变类型

    默认形参vs位置形参:
    默认形参:大多数情况下值都一样
    位置形参:大多情况值都是不一样的
    def foo(x,y,z=3):
        print(x)
        print(y)
        print(z)
    
    foo(1,2)
    foo(1,2,4)
    
    #
    def register(name,age,sex='female'):
        print(name)
        print(sex)
        print(age)
    
    register('wxx',38)
    register('lxx',48)
    register('cxx',28)
    register('alex',73,'male')
    
    
    #
    m=10
    def foo(x,y,z=m):
        print('x:%s' %x)
        print('y:%s' %y)
        print('z:%s' %z)
    m=1111111111111111111111111111111111111111111111111111111111111111
    foo(1,2)
    
    #
    def foo(name,hobby,l=[]):
        l.append(hobby)
        print('%s 的爱好是 %s' %(name,l))
    
    foo('egon','read')
    foo('alex','吹牛逼')
    foo('lxx','腰子汤')
    
    #
    def foo(name,hobby,l=None):
        if l is None:
            l=[]
        l.append(hobby)
        print('%s 的爱好是 %s' %(name,l))
    
    l1=[]
    foo('egon','read',l1) #l1=['read']
    foo('egon','music',l1)  #l1=['read','music']
    foo('egon',' 吟诗',l1)
    # foo('alex','吹牛逼')
    # foo('lxx','腰子汤')
    5、可变长度的参数:
    可变长度指的是在调用函数时,函数参数的个数可以不固定

    然而实参终究是要为形参传值的,针对两种形式实参个数不固定,对应着形参也必须有两种解决方案*、**
    来分别处理溢出位置实参与溢出的关键字实参


    1、* 会将溢出的位置实参存成元组,然后赋值给紧跟其后的变量名
    1.1 形参中带*
    def foo(x,y,*z): #z=(3,4,5,6,7,8)
        print(x)
        print(y)
        print(z)
    
    foo(1,2,3,4,5,6,7,8)
    1.2 形参中带*,实参中带*, 窍门:但凡碰到实参中带*,都先将其打散成位置实参,然后考虑传值
    def foo(x,y,*z): #z=(3,4,5,6,7,8)
        print(x)
        print(y)
        print(z)
    
    foo(1,2,[3,4,5,6,7,8]) #z=([3,4,5,6,7,8],)
    foo(1,2,*[3,4,5,6,7,8]) #foo(1,2,3,4,5,6,7,8)====>z=(3,4,5,6,7,8)
    foo(1,2,*'hello') #foo(1,2,'h','e','l','l','o')
    foo(1,*[2,3,4,5,6])  #foo(1,2,3,4,5,6)

    1.3 实参中带*, 窍门:但凡碰到实参中带*,都先将其打散成位置实参,然后考虑传值
    def foo(x,y,z):
        print(x,y,z)
    
    foo(1,2,3)
    foo(l[0],l[1],l[2])
    
    l = ['egon', 'alex', 'lxx']
    foo(*l) # foo('egon','alex','lxx')
    foo(*[1,2,3,4,5]) #foo(1,2,3,4,5)

    ** 会将溢出的关键字实参存成字典,然后赋值给紧跟其后的变量名
    1.1 形参中带**
    def foo(x,y,m,n,**z): #
        print(x)
        print(y)
        print(m)
        print(n)
        print(z)
    
    foo(1,2,n=10,m=20,a=1,b=2,c=3)
    1.2 形参中带**,实参中带**, 窍门:但凡碰到实参中带**,都先将其打散成关键字实参,然后考虑传值
    def foo(x,y,**z): #
        print(x,y,z)
    
    foo(1,2,**{'a':1,'b':2,'c':2}) #foo(1,2,c=2,a=1,b=2)
    foo(1,**{'a':1,'b':2,'c':2,'y':111}) #foo(1,c=2,a=1,b=2,y=111)
    

      

    1.3 实参中带**,
    def foo(x,y,z):
        print(x,y,z)
    # foo(1,**{'a':1,'b':2,'y':111,'z':222}) #foo(1,b=2,a=1,y=111,z=222)
    # foo(1,**{'y':111,'z':222}) #foo(1,y=111,z=222)
    foo(**{'z':1,'y':2,'x':3}) #foo(y=2,z=1,x=3)
    如果我们的需求是
    需要将外层的函数的参数格式原方不动地转嫁给器内部调用的函数,就需要用到下述形式
    def index(name,age,sex):
        print('name:%s age:%s sex:%s' %(name,age,sex))
    
    
    def wrapper(*args,**kwargs): #args=(1,2,3), kwargs={'a':10,'b':20,'c':30}
        # print(args,kwargs)
        index(*args,**kwargs)
        #index(*(1,2,3),**{'a':10,'b':20,'c':30}) #index(1,2,3,a=10,b=20,c=30)
    
    # wrapper(1,2,3,a=10,b=20,c=30)

    我们虽然调用的是wrapper函数,但是我们遵循的其实是index函数的参数规则
    def index(name,age,sex):
        print('name:%s age:%s sex:%s' %(name,age,sex))
    
    def wrapper(*args,**kwargs): #args=('egon',), kwargs={'sex':'male','age':18}
        index(*args,**kwargs)
        # index(*('egon',),**{'sex':'male','age':18})
        # index('egon',sex='male',age=18)
    
    
    wrapper('egon',sex='male',age=18) #

    命名关键字参数(了解):但凡是在*后**之前定义的参数称之为命名关键字参数
    注意点:
    在调用函数时,传值的形式必须是key=value
    def foo(x,y,*args,m=1,n):
        print(x,y,m,n)
        print(args)
    
    
    # foo(1,2,n=3,m=4)
    # foo(1,2,n=3)
    
    foo(1,2,3,4,5,n=222,m=11)
    常用形式
    def foo(x,y=100,*args,m,**kwargs):
        print(x,y,args,m,kwargs)
    
    
    foo(1,2,3,4,5,6,m=200,n=300,a=400)
    
    def foo(x,y):
        pass
    
    def foo(x,y=1):
        pass
    
    #
    def wrapper(*args,**kwargs):
        index(*args,**kwargs)
    
    
    
    def foo(x,*args):
        pass
    
    def foo(x,**wkargs):
        pass
    
    def foo(x,y,*args,**kwargs):
        pass
    
    #
    def my_sum(*args):
        res=0
        for item in args:
            res+=item
    
        return res
    
    print(my_sum(1,2,3,4,5,6))
    

      

  • 相关阅读:
    getchar()详解
    ACM错误提示
    关于printf()函数和浮点数
    PCB蚀刻,盐酸不好买,三氯化铁不方便,用这个吧【转】
    wps自动半角符转全角符取消笔记
    万恶的oj笔记之【111028】
    hdu1142 深搜+dp+最短路径。
    pl2303电路图。。
    sencha touch 监控 Carousel 旋转事件
    正则表达式限制文本框输入内容
  • 原文地址:https://www.cnblogs.com/zhutiancheng/p/9323866.html
Copyright © 2011-2022 走看看