zoukankan      html  css  js  c++  java
  • 函数、可变参数、keyword-only参数、实参解构

    函数的数学定义:y=f(x) ,y是x的函数,x是自变量。y=f(x0, x1, ..., xn)

    python中的函数: 由函数名称、参数列表、和若干语句组成的语句块构成,完成一定的功能,是组织代码的最小单元。

    函数的作用

    • 结构化编程对代码的最基本的封装,一般按照功能组织一段代码
    • 封装的目的为了复用,减少冗余代码
    • 代码更加简洁美观、可读易懂

    函数的定义

    def 函数名(参数列表):
        函数体(代码块)
        [return 返回值]
    
    • 函数名就是标识符,遵守变量命名规范
    • 函数体必须缩进
    • 如果没有return语句,默认返回None
    • 定义中的参数列表称为形参,只是一种符号表达

    函数调用

    • 函数定义只是声明了一个函数,它不会被执行,需要被调用
    • 调用的方式,就是函数名加上小括号,括号内写上参数
    • 调用时写的参数是实参,是实际传入的值
    def add(x, y):
        result = x + y
        return result
    
    res = add(4, 5)
    print(res)
    
    • 计算的结果,通过返回值返回
    • 调用时通过函数名add加2个参数,返回值可使用变量接收
    • 定义需要在调用前,否则抛NameError异常
    • 函数是可调用的对象,callable()
    print(callable(add))
    # True
    

    调用时传入的参数要和定义的参数个数相匹配(可变参数除外)

    形参可以分为默认参数和非默认参数,默认参数必须在非默认参数后面
    实参可以分为位置参数和关键字参数,位置参数是按位置对应的,关键字参数必须在位置参数后面

    位置参数

    • def f(x, y, z) 调用使用f(1, 3, 5)
    • 按照参数定义顺序传入实参

    关键字参数

    • def f(x, y, z) 调用使用f(x=1, y=3, z=5)
    • 使用形参的名字来传入实参的方式,如果使用了形参名字,那么传参顺序就可以和定义顺序不同

    函数参数的默认值

    • 定义时在形参后跟上一个值
    • 函数调用时,没有传递的参数将使用默认值
    • 可以简化函数调用
    def add(x=4, y=5):
        result = x + y
        return result
    
    # 测试调用
    - add(6, 10)
    - add(6, y=7)
    - add(x=5, 6)   # 关键字参数必须在位置参数后面
    - add(x=5)
    - add(y=7)
    - add()
    - add(x=5, y=6)
    - add(y=6, x=5)
    

    可变参数

    • 函数定义时可以使用*args和**kwargs收集多个传递进来的实参
    • 一个形参可以匹配任意多个参数,包括0个
    • 可变位置参数,*args,收集多个实参的位置参数为一个元祖
    • 可变关键字参数,**kwargs,收集多个实参的关键字参数为一个字典,在整个形参列表的最后
    • 可混合使用
    def add(*args):
        sum = 0
        print(type(args))
        for i in args:
            sum += i
        return sum
    
    print(add(3, 6, 9))
    # <class 'tuple'>
    # 18
    
    def func(x, y, *args, **kwargs):
        print(x)
        print(y)
        print(args)
        print(kwargs)
    
    func(3, 5, 7, 9, a=1, b='keithTt')
    func(3, 5)
    func(3, 5, 7)
    func(3, 5, a=1, b='keithTt')
    func(3, 5, x=7, a=1, b='keithTt')     # 错误,这里3传递给了x,又传递x=7将抛出TypeError参数获得多个值异常
    

    keyword-only参数

    • 在一个星号参数后、或者一个可变位置参数后的形参
    • 函数调用时必须使用关键字参数传参
    • 调用时如果没有默认值,则必须传递实参,否则将抛出TypeError缺少keyword-only参数异常
    def func(*args, x=1, y, **kwargs):
    # def func(*, x=1, y, **kwargs):
        print(x)
        print(y)
        print(args)
        print(kwargs)
    
    func(3, 5, x=3, y=5, b='KeithTt')
    

    总的来说,函数定义时的形参顺序: 普通参数、默认参数、可变位置参数、keyword-only参数(可设置默认值)、可变关键字参数。

    实参解构

    • 传递实参时,可以使用*和**解构可迭代对象,提取出序列中的所有元素
    • 非mapping类型序列使用*解构
    • mapping类型(字典)使用**解构,如果使用*解构字典将提取出字典中元素的key
    # 可变位置参数解构
    def add(*args):
        return sum(args)
    
    print(add(1,2,3))
    print(add(*[1,2,3]))
    print(add(*range(10)))
    
    print(*range(10))
    # 0 1 2 3 4 5 6 7 8 9
    
    # 可变关键字参数解构
    def city_temp(**kwargs):
        for k,v in kwargs.items():
            print(k,':',v)
    
    d = {'bj':'32c','xm':'23c','sh':'31c'}
    city_temp(**d)
    # bj : 32c
    # xm : 23c
    # sh : 31c
    

    编写一个函数,能够接受至少2个参数,返回最小值和最大值

    def max_min(*args):
        # print(args)
        max_ = max(args)
        min_ = min(args)
        return min_,max_
    
    print(max_min(*range(10)))
    # (0, 9)
    
  • 相关阅读:
    浅谈 iOS 之 Crash log 符号化
    聊聊 Statsd 和 Collectd 那点事!
    如何使用 Zend Expressive 建立 NASA 图片库?
    Nagios 邮箱告警的方式太OUT了!
    如何从软硬件层面提升 Android 动画性能?
    这样查看告警邮件要慢一点……
    Android 共享文件的 Runtime 权限
    第38节:hashCode()与toString()与equals()函数的作用,内部类和匿名内部类
    第37节:多线程安全问题
    第37节:多线程安全问题
  • 原文地址:https://www.cnblogs.com/keithtt/p/7639337.html
Copyright © 2011-2022 走看看