zoukankan      html  css  js  c++  java
  • python开发学习day12 (函数参数;函数对象)

    2020-06-16                             目录:

    一、函数的参数

    1.1  第一组形参与实参

    1.1.1  位置形参

    1.1.2  位置实参

    1.1.3  关键字实参

    1.1.4  默认参数

    1.2  第二组形参与实参(可变长参数)

    1.2.1   形参中带*与**

    1.2.2   实参中带*与**

    1.3  形参与实参中混用*与**

    二、函数对象

    2.1  可以赋值

    2.2  可以当做参数传给另一个函数

    2.3  可以当做函数的返回值

    2.4  可以当做容器类型的元素

    一、函数的参数

    1.1  第一组形参与实参

    1.1.1  位置形参

    位置形参:按照从左到右的顺序依次定义形参
    # 特点:必须被传值,多一个不行少一个也不行

    1.1.2  位置实参

    位置实参:按照从左到右的顺序依次定义实参
    # 特点:按照位置与形参一一对应
    def func(x,y):  
      print(x,y)
    
    func(1,2)  # 将1赋值给x,将2赋值给y,一一对应

    1.1.3  关键字实参

    关键字实参:按照key=value的形式为指定的形参传值
    # 特点:指名道姓为某个形参传值,可以完全打乱顺序
    def func(x,y):  
      print(x,y)
    
    func(y=1,x=2)
    
    注意点:可以混用位置实参与关键字实参,但是
        1、不能对同一个形参重复赋值
        2、关键字实参必须放在位置实参后面,否则会报错

    1.1.4  默认参数

    具有默认值的形参,指的是在定义函数阶段就已经为参数赋值
    # 特点:在调用函数阶段可以不用为默认参数传值
    def func(x,y=2):
      print(x,y)
    
    func(1)      # 默认y=2
    func(1,222)  # 如果y被再次传了值,那么本次调用以当前传的值为准
    
    # 注意点:① 位置形参必须放在默认形参的前面
          ② 默认形参的值是在函数定义阶段就被固定的,如果调用时没有为默认形参传值,那么不会每次调用都重新赋值           
           函数的调用彼此之间应该做到没有关联,所以说默认形参通常应该是不可变类型

    1.2  第二组形参与实参(可变长参数)

    可变长参数:可变长指的是在调用函数时,传入的实参个数不固定,而实参是为形参赋值的
    所以对应着也应该有新的形参格式来负责接收不固定长度的实参

    1.2.1   形参中带*与**

    ① *形参名:*会负责把溢出的位置实参存成元组然后赋值给后面的形参名,形参名通常使用args
    def func(x, y, *z):
    print(x, y, z)


    func(1, 2, 3) # >>>1 2 (3,)
    func(1, 2, 3, 4, 5) # >>>1 2 (3, 4, 5) 实参个数可以溢出,但是不能少于位置实参的个数,即*z可以不被赋值
    ②**形参名:**会负责把溢出的关键字实参存成字典然后赋值给后面的形参名,形参名通常使用kwargs
    def func(x, y, **z):
        print(x, y, z)
    
    
    func(1, 2, a=111, b=222, c=333)  #  >>>1 2 {'a': 111, 'b': 222, 'c': 333}

      注意:*与**在形参中混用,整体的顺序从左到右应该是:位置形参,默认形参,*args,**kwargs

    1.2.2   实参中带*与**

    ① 实参中带*号:
      *号后跟的那个值应该是一个可以被for循环遍历的值,
      *号会把后面的值打散成位置实参,如:
    func(*(111,222,333)) 就相当于 func(111,222,333)
    func(*"hello") 就相当于 func("h","e","l","l","o")
    ② 实参中带**:
      **后跟的那个值应该是一个字典
      **会把后面的那个值打散成关键字实参,如:
    func(**{"x": 111, "y": 222, }) 就相当于 func(y=222,x=111)

    1.3  形参与实参中混用*与**

    def func(*args, **kwargs):
        print(args, kwargs)
    
    
    func(1, 2, a=1, b=2)  # >>>(1, 2) {'a': 1, 'b': 2}
    func((1, 2, 3), {'a': 1, 'b': 2})  # >>>((1, 2, 3), {'a': 1, 'b': 2}) {}
    func(*(1, 2, 3,), **{'a': 1, 'b': 2}) # >>>(1, 2, 3) {'a': 1, 'b': 2}
      形参中带*与**是汇总操作
      实参中带*与**是打散操作

    了解级知识点:
    def func(*args, y, **kwargs):
        print(args, y, kwargs)
    
    
    func(1, 2, y=3, a=1, b=2, c=3)  # >>>(1, 2) 3 {'a': 1, 'b': 2, 'c': 3}   调用时y必须被赋值,否则会报错

    二、函数对象

    在python里,函数是第一类对象,简称函数对象
    函数对象指的就是可以把函数当做变量一样去使用

    2.1  可以赋值

    def func():
        print('from func')
    print(func)
    f=func  # 函数名func所指向的的内存地址绑定给了f
    f()  # f()也可以进行函数调用

    2.2  可以当做参数传给另一个函数

    def func(aaa): # aaa=函数foo的内存地址
        print(aaa)
        aaa()      # 只能在func()内调用aaa()
    
    def foo():
        print('from foo')
    
    func(foo)   # 将foo赋值给了变量aaa,那么aaa()也可以当做foo()使用来调用函数

    2.3  可以当做函数的返回值

    def func(aaa):   # aaa=函数foo的内存地址
        return aaa   # 返回的是函数foo的内存地址
    
    def foo():
        print('from foo')
    
    
    res=func(foo)    # 将foo赋值给aaa
    print(res)
    res()            # 相当于foo()

    2.4  可以当做容器类型的元素

    def foo():
        print('from foo')
    
    l=[foo]
    print(l)
    l[0]()   # 即 foo()

     

  • 相关阅读:
    伪类样式
    div 文字超出边框后,省略号显示
    关于常用的 meta
    js数组去重
    异步二进制文件下载
    JJWT现前后端分离身份验证
    ApachePOI快速入门
    axios兼容ie7
    vue解决跨域问题
    log4j模板
  • 原文地址:https://www.cnblogs.com/cui-cheng/p/13149544.html
Copyright © 2011-2022 走看看