zoukankan      html  css  js  c++  java
  • 函数的参数

    函数的参数

    一、形参和实参的定义

    • 形参(形式参数,简称形参)

    形参是函数在定义阶段就规定的参数,相当于定义变量的变量名,用来接收外部传来的值

    • 实参(实际参数,简称实参)

    实参是函数在调用阶段传入的参数,相当于定义变量的变量值,值可以是常量、变量、表达式或三者的组合

    def index(a):	#形参:相当于变量名
        print(a)
    
    a = 1
    index(a)		#实参:相当于变量值
    

    在调用有惨函数时,实参(值)会赋值给形参(变量名)。在python中,变量名与值只是单纯的绑定关系,而对于函数来说,这种绑定关系只在函数调用时生效,在调用结束后解除


    二、形参和实参的具体使用

    位置就是顺序,指的是按顺序定义的参数

    • 位置参数

      • 在定义函数时,按照从左到右的顺序依次定义形参,称为位置形参
      def register(name, age, sex):  # 定义位置形参:name,age,sex三者都必须被传值
          print(f'Name:{name} Age:{age} Sex:{sex}')
      
      register()		#TyperError:报错,缺少3个位置参数
      
      • 在调用函数时,按照从左到右的顺序依次定义实参,成为位置实参
      register('yang', 18, 'male')	#对应关系为 name='yang', age=18,sex='male'
      Name:yang Age:18 Sex:male
      
    • 关键字参数

      在调用函数时,可以指定参数进行传参(key=value),成为关键字传参

      register(name='yang', age=18, sex='male')	#正确
      
      register(name='yang', 18, sex='male')	#报错:关键字参数name在位置参数18之前
      register('yang', name='yang', age=18, sex='male') #报错:形参name被重复赋值
      

    注意:位置参数和关键字参数连用的时候,位置参数一定一定要在关键字参数之前,而且不可以对用一个形参重复赋值

    • 默认参数

      在定义函数阶段时,就已经传入参数,这类形参称为默认参数,如果在实参的时候传入了一个新的参数,就会使用新参数

      def register(name, age, sex='male'):    #默认sex的值为male
          print(f'Name:{name} Age:{age} Sex:{sex}')
      
      register('yang', 18)	#大多数情况,无需为sex传值,默认为male
      Name:yang Age:18 Sex:male
      register('chen', 18, 'female')	#少数情况,可以为sex传值femal
      Name:chen Age:18 Sex:female
      

      默认参数在传值的时候,不要将可变类型当做参数传递

    应用场景:

    ​ 当参数对应值重复出现的情况下,使用默认参数

    • 可变长参数(*与**的用法)

      • *args:官方认证,也可以指定其他只要有 *的可变长参数

      接收所有溢出的位置参数,接收的值都被存入一个元组

      def foo(x, y, z=1, *args):	#在最后一个形参名args前加个*号
          print(x, y, z, args)
      
      
      foo(1, 2, 3, 4, 5, 6, 7)	#实参1,2,3按位置赋值给x,y,z,多余的4,5,6,7都被以元组的形式保存下来,赋值给args,args=(4,5,6,7)
      1 2 3 (4, 5, 6, 7)
      

      如果事先生成一个列表,也是可以传值给*args的

      def foo(x, y, *args):
          print(x, y, args)
      
      
      L = [3, 4, 5]
      foo(1, 2, L)
      1 2 ([3, 4, 5])
      

      实参中加个*号,可以打散传入的容器类型(需要放到实参中)

      def foo(x, y, *args):
          print(x, y, *args)
      
      
      L = [3, 4, 5]
      foo(1, 2, *L)	#相当于是foo(1,2,3,4,5)
      1 2 3 4 5
      

      例子:求多个值的和

      def add(*args):
          res = 0
          for i in args:
              res += i
          return res
      
      
      add(1, 2, 3, 4, 5)
      15
      
      • **kwargs:官方认证,也可以自定义指定

      接收所有溢出的关键字参数,接收的值都被存入一个字典

      def foo(x, **kwargs):	#在最后一个参数kwargs前加**
          print(x, kwargs)
      
      
      foo(x=1, y=2, z=3)	#溢出的关键字实参y=2,z=3会被**接收,以字典形式赋值给kwargs
      1 {'y': 2, 'z': 3}
      

      如果事先生成一个字典,也可以传值给**kwargs

      def foo(x, y, **kwargs):
          print(x, y, kwargs)
      
      
      dic = {'a':1, 'b':2}
      foo(1, 2, **dic)	
      #dic就相当于关键字参数a=1,b=2,foo(1,2,**dic)等同于foo(1,2,a=1,b=2)
      1 2 {'a': 1, 'b': 2}
      

      注意:如果在传入dic时没有加**,那么dic就只是个普通的位置参数了

      foo(1, 2, dic) #TypeError: 函数只要两个位置参数,但是传了3个
      

      如果形参为常规参数(位置或默认),实参仍然可以是**的形式

      def foo(x, y, z=3):
          print(x, y, z)
          
      
      foo(**{'x':1, 'y':2}) #等同于foo(x=1,y=1)
      1 2 3
      
  • 相关阅读:
    Opencv CamShift+Kalman目标跟踪
    Opencv混合高斯模型前景分离
    TTabControl、TMemo组件(制作一个简单的多文本编辑框)
    ShowMessage和MessageDlg消息对话框(VCL)
    TPageControl组件
    TImageList 和 TlistView 组件(C++Builder)
    C# 动态链接库的创建
    线程的并发与并行
    OpenCv haar+SVM训练的xml检测人头位置
    C++Builder组件
  • 原文地址:https://www.cnblogs.com/YGZICO/p/11843821.html
Copyright © 2011-2022 走看看