zoukankan      html  css  js  c++  java
  • 函数第二天

    形参:在定义函数时的参数
    实参:在调用函数时的参数
    形参与实参的关系:

    1. 在调用时实参会绑定形参
    2. 绑定关系只能在函数体内使用
    3. 实参与形参的绑定关系只有调用时生效,而调用结束后则解除绑定关系

    实参传值:

    复制代码
    # 形式一:
    func(1, 2)
    
    # 形式二:
    a = 1
    b = 2
    func(a, b)
    
    # 形式三:
    func(int('1'), 2)
    复制代码

    形参与实参的使用:

    位置参数:

      位置形参:在函数定义时,按照从左到右的顺序定义

        特点:必须被传值,形参有几个值,就要传入几个值

      位置实参:调用时按照从左到右的顺序依次传值

        特点:按照形参顺序对应传值

    def func(x,y):
        print(x,y)
    func(1,2)

    关键字参数:

      关键字形参:在函数调用时按照 keys 与 value 的形式传值

        特点:根据“变量名”传值且可以不按照顺序传值

    def func(x,y):
        print(x,y)
    
    func(y=2,x=1)

    位置参数与关键字参数的混合使用:

      1,位置实参必须放在关键字实参前

    func(1,y=2)

      2,不能同时给同一个形参传多个值

    func(1,y=2,x=3) #错误的演示

    默认参数:在定义函数时就已经被赋值的形参

        特点:定义时被赋值了调用时就可以不用赋值,当然也可以在重新赋值

    def func(x,y=3):
        print(x,y)
    
    
    func(x=1,y=44444)#y在形参定义时已经赋值了,但是调用函数时也可以在重新赋值
    复制代码
    def register(name,age,gender='男'):
        print(name,age,gender)
    
    register('三炮',18)
    register('二炮',19)
    register('大炮',19)
    register('没炮',19,'女')
    复制代码

    位置参数与默认参数的混合使用:

      1,位置形参必须在默认形参的左边

    def func(y=2,x):
        pass

      2,默认参数的值是在函数定义赋值的,准确的说是赋予了内存地址

    m=2
    def func(x,y=m): # y=>2的内存地址
        print(x,y
    m=3333333333
    func(1)

      3,默认值可以指定任意类型,但是不推荐使用可变类型,因为这样会使整个函数的逻辑关系变的混乱。

          函数理想的状态:函数的调用只跟函数本身有关系,不被外界代码影响。

    复制代码
    def func(x,y,z,l=None):
        if l is None:
            l=[]
        l.append(x)
        l.append(y)
        l.append(z)
        print(l)
    
    func(1,2,3)
    func(4,5,6)
    
    new_l=[111,222]
    func(1,2,3,new_l)
    复制代码
    可变长度的参数(*与**的用法)
      可变长度指的是在调用函数时,传入的值(实参)的个数不固定
      而实参是用来为形参赋值的,所以对应着,针对溢出的实参必须有对应的形参来接收

    可变长度的位置参数
    I:*形参名:用来接收溢出的位置实参,溢出的位置实参会被*保存成元组的格式然后赋值紧跟其后的形参名
    *后跟的可以是任意名字,但是约定俗成应该是args
    复制代码
    def my_sum(*args):
        res=0
        for item in args:
            res+=item
        return res
    
    res=my_sum(1,2,3,4,)
    print(res)
    复制代码
     II: *可以用在实参中,实参中带*,先*后的值打散成位置实参
    复制代码
    def func(x,y,z):
        print(x,y,z)
    
    # func(*[11,22,33]) # func(11,22,33)
    # func(*[11,22]) # func(11,22)
    
    l=[11,22,33]
    func(*l)
    复制代码
    III: 形参与实参中都带*
    def func(x,y,*args): # args=(3,4,5,6)
        print(x,y,args)
    
    func(1,2,[3,4,5,6])
    func(1,2,*[3,4,5,6]) # func(1,2,3,4,5,6)
    func(*'hello') # func('h','e','l','l','o')
    可变长度的关键字参数
    I:**形参名:用来接收溢出的关键字实参,**会将溢出的关键字实参保存成字典格式,然后赋值给紧跟其后的形参名
    **后跟的可以是任意名字,但是约定俗成应该是kwargs

    def func(x,y,**kwargs):
        print(x,y,kwargs)
    
    func(1,y=2,a=1,b=2,c=3)
    II: **可以用在实参中(**后跟的只能是字典),实参中带**,先**后的值打散成关键字实参
    def func(x,y,z):
        print(x,y,z)
    
    func(*{'x':1,'y':2,'z':3}) # func('x','y','z')
    func(**{'x':1,'y':2,'z':3}) # func(x=1,y=2,z=3)
    III: 形参与实参中都带**
    def func(x, y, **kwargs):
        print(x, y, kwargs)
    
    
    func(y=222, x=111, a=333, b=444)
    func(**{'y': 222, 'x': 111, 'a': 333, 'b': 4444})
    混用*与**:*args必须在**kwargs之前
    复制代码
    
    
    def index(x, y, z):
    print('index=>>> ', x, y, z)


    def wrapper(*args, **kwargs): # args=(1,) kwargs={'z':3,'y':2}
    index(*args, **kwargs)
    # index(*(1,),**{'z':3,'y':2})
    # index(1,z=3,y=2)


    wrapper(1, z=3, y=2)
     
    复制代码
  • 相关阅读:
    Samba.conf案例 Ubuntu
    samba服務器下文件夾chmod權限技巧
    华为AR1220
    vsftpd.conf案例
    FTP指令说明
    Ubuntu 16.04 LTS 搭建LAMP
    记录踩过的坑——代理IP
    重写验证时重定向
    顶级页面
    文件中用WriteLine追加内容的两种方法
  • 原文地址:https://www.cnblogs.com/zhangjinyi97/p/12520098.html
Copyright © 2011-2022 走看看