zoukankan      html  css  js  c++  java
  • Python—day10 函数的参数分类

    一、实参与形参

    1、形参:定义函数,在括号内声明的变量名,用来接受外界传来的值

          def fn(形参们):
                    pass

    def fn(a,b,c):#   形参就是考虑实参的值,随着函数的调用才会产生,并随着函数调用结束而销毁
        # a,b c必须从外界获取值,才有意义
        print(a)
        print(b)
        print(c)
        # 外部提前产生了变量,内部可以使用(x,y,z)
        print(x)
        print(y)
        print(z)
    # x,y,z 是实际存在的值
    x=10
    y=20
    z=30 

    2、实参:调用函数,在括号内传入的实际值,值可以为常量、变量、表达式或三者的组合

    fn(x,y,z)
    fn(10,20,30)
    fn(x+10,y*2,z/5)
    

      

    注:形参随着函数的调用而产生,随着调用结束而销毁(有特例)

     
    混用
    位置形参与默认形参同时存在,默认形参必须在后
    def fn1(a,b,c=10,d=20):
        print(a, b, c, d)
    位置形参必须传值,默认形参分情况传值
    fn1(100, 200, d=1000)
    
     在函数的外部不能直接使用函数的形参,原因:函数调用完毕后,形参被销毁了
    print(a)
    print(b)
    print(c)
    

      

    二、实参与形参的分类

    注:各种形参出现的先后
    位置形参 - 默认形参 - 可变长位置形参 - 无|有初值关键字形参 - 可变长关键字参数

     

    def fn(a, b, c=10, *args, d, e=20, f, **kwargs):
        pass
    # 位置形参:a、b
    # 默认形参:c
    # 可变长位置形参:args
    # 无初值关键字形参:d、f
    # 有初值关键字形参:e
    # 可变长关键字参数:kwargs
    

      

    1、实参分类:

    位置实参:必须按照顺序给形参传值
     
    def fn (a,b,c):
        print(a,b,c)
    
    位置形参可以由位置实参与关键字实参来传值
    fn(10,20,30)
    fn(a=10,b=20,c=30)
    

      

    关键字实参:按照关键字给形参传值,所以顺序可以颠倒

    
    
    fn1(a=10,b=20,c=30)
    fn1(c=30,b=20,a=10)
    

      

    注:混用
    1.关键字实参必须出现在位置实参后
    2.多个位置实参还是按照位置传参
    3.关键字实参为没有从位置实参拿到值的形参传值,可以不用按照指定顺序
    
    def fn2(a, b, c, d, e, f):
        print(a, b, c, d, e, f)
    fn2(10, 20, 30, e=100, f=500, d=200)
    

      

    注:位置实参、关键字实参共存是,关键字实参必须出现在所有位置实参之后

     2、形参分类:

    2-1、位置形参:位置实参与关键字实参都可以对其传参
    #  positional argument
    def fn(a, b, c):
        print(a, b, c)

       

     
     2-1、位置形参可以由 位置实参 与 关键字实参 来传值
    fn(10, 20, 30)
    fn(a=10, b=20, c=30)
    

      


    2-3、默认形参:位置实参关键字实参都可以对其传参,也可以不被传参(采用自身默认值)

    fn()
    fn(20, 30)
    fn(a=200, b=300)
    fn(100)  # 就给a传
    fn(b=100)  # 就给b传
    

        


    2-4、可变长位置形参:可变长形参会以 元组 形式接受 位置形参默认形参未接受完的 所有传入的位置实参,用索引来取第几个
    可变长形参只能由 位置实参传值  *****

    def fn(a, b=10, *args):
        print(a, b)
        print(args)    

       
    小细节:可变长形参只能接受位置实参的值,位置实参还必须在关键字实参前,
    导致默认形参只能由位置实参来传值

    fn(1, 20, 100, 200) # 1给a  20给b,不能用b=20传  100,200给args
    def fn(*args):
        print(args)
    fn(1,2,3,4,5)# 输出(1,2,3,4,5)
    
    a='ab'
    b=[1,2]
    c=(1,2)
    d={1,2}
    
    fn(a) #('ab',)
    fn(b)#([1,2],)
    fn(c)#((1,2),)
    fn(d)#({1,2},)
    
    *单列集合(保护字符串)将该变量进行  打散 传值(本质传递的是地址)
    fn(*a)
    fn(*b)
    fn(*c)
    fn(*d)
    
    打散
    def fn1(*args):
        print(args)
    ls=[1,2,3,4,5]
    fn1(ls)#  输出的结果是([1,2,3,4,5],)
    
    
    fn1(*ls)
    将ls打散为1,2,3,4,5再进行传值=》》(1,2,3,4,5


    2-5、无初值关键字形参:只能由关键字实参传值

    前提:出现在 * 之后的形参
    def fn(a, b=10, *, c, d=20, e):
     pass
    # c,d,e都是出现在*之后,都是关键字形参,由于必须由 关键字实参 来传值,没有顺序的强行要求
    


    2-6、有初值关键字形参:只能由关键字实参传值,也可以不被传值

    * 为分割线,可以有变量名如*args,也可以只用做分隔
    a:位置
    b:默认
    c,e:无值关键字形参
    d:有值关键字形参
    
    注
    a和b有先后顺序
    c,d,e无先后顺序
    


    2-7、可变长关键字形参:用来接收没有被关键字形参接收完的关键字形参,也只能由关键字实参来传值

    用字典来存放数据

    例题一
    def fn(**kwargs):
        print(kwargs)
    fn(a=10,b=20)  # {'a': 10, 'b': 20}
    dic = {'x': 100, 'y': 200}
    fn(**dic)  # {'x': 100, 'y': 200}
    

      

    例题二
    def fn(*,a,b=20,c,**kwargs):
        print(a,b)
        print(kwargs)
    fn(d=40,e=50,a=10,c=30) # 随便定义一些值,输出a,b的值
    
    
    
    
    整体赋值
    dic={'name':'Owen','age':18}
    def fn1(**kwargs):
        print(kwargs)
    
    fn1(**dic)  #输出结果{'name':'Owen','age':18}
    
    
    def fn1(**dic):
        print(**dic)
    dd={
        'k1':[1,2,3,4,5],
        'k2':{'name':'Bob'}
    
        }
    fn1(**dd)
    
    def fn2(*args):
        print(args)
    ll=[1,[1,2],{'name':'Bob'}]
    fn2(*ll)  # 输出结果(1,[1,2],{'name':'Bob'})

    三、可变参数的整体使用

    1、可变位置形参以元组方式接收值
    如:接收10,20,30三个数
    def fn1(*args):
        print(args)  # (10, 20, 30)
        
    第一种传参
    fn1(10, 20, 30)
    第二种传参
    t = (10, 20, 30)  # 单列集合及字符串类型都可以
    fn1(*t)
    

      

    2、可变位置实参以字典方式接收值
    def fn2(**kwargs):
        print(kwargs)  # {'name': 'Owen', 'age': 18}
    
    第一种传参
    fn2(name='Owen', age=18)
    第二种传参
    d = {'name': 'Owen', 'age': 18}  # 单列集合及字符串类型都可以
    fn2(**d)
    

     

  • 相关阅读:
    github上比较有名的一个前端面试题,随便做做(4)
    常见动态内存的管理程序错误
    .Net笔记(一)is和 as
    消息映射宏
    组态软件分析(第一节)
    指针形参与引用形参区别
    MFC 消息映射的产生
    WPF 路由事件(一)
    C# 封装集合
    Xaml Code Behind Generator (XAML 转成C#代码)
  • 原文地址:https://www.cnblogs.com/zhouqinmei/p/10622707.html
Copyright © 2011-2022 走看看