• python函数


    函数定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

    函数特性:

    def my_sum(x,y): #定义函数名
        res = x+y
        return res #返回函数执行结果
    
    c = my_sum(4,5) #结果赋值给c变量
    print(c)
    

    减少重复代码

    使程序变的可扩展

    使程序变得易维护

    函数参数

    形参即变量名就是函数定义阶段的参数,实参即变量值就是函数调用阶段的参数,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定

    1. 位置参数:按照从左到右的顺序定义的参数
      • 位置形参:必选参数
      • 位置实参:按照位置给形参传值
    2. 关键字参数:按照key=value的形式定义的实参
      • 无需按照位置为形参传值
      • 注意1:关键字实参必须在位置实参右面
      • 注意2:对同一个形参不能重复传值
    3. 默认参数:形参在定义时就已经为其赋值
      • 可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
      • 注意1:只在定义时赋值一次
      • 注意2:默认参数的定义应该在位置形参右面
      • 注意3:默认参数通常应该定义成不可变类型
    4. 可变长参数:
      • 可变长指的是实参值的个数不固定
      • 而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
    5. 命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
      • 可以保证,传入的参数中一定包含某些关键字
    #===========默认参数===========
    
    
    def stu_register(name,age,course,country="CN"):
        print("----注册学生信息------")
        print("姓名:",name)
        print("age:",age)
        print("国籍:",country)
        print("课程:",course)
    stu_register("王山炮",22,"python_devops")
    
    #===========关键字参数===========
    
    
    def stu_register(name, age, course='PY' ,country='CN'):
        print("----注册学生信息------")
        print("姓名:", name)
        print("age:", age)
        print("国籍:", country)
        print("课程:", course)
    stu_register("王山炮",course='PY', age=22,country='JP' )
    
    
    #===========*args===========
    def foo(x, y, *args):
        print(x, y)
        print(args)
    foo(1, 2, 3, 4, 5)
    """
    1 2
    (3, 4, 5)
    """
     
     
    def foo(x, y, z):
        print(x, y, z)
    foo(*[1, 2, 3])
    """
    1 2 3
    """
     
    #===========**kwargs===========
    def foo(x, y, **kwargs):
        print(x, y)
        print(kwargs)
    foo(1, y=2, a=1, b=2, c=3)
    """
    1 2
    {'b': 2, 'c': 3, 'a': 1}
    """
     
     
    def foo(x, y, z):
        print(x, y, z)
    foo(**{'z': 1, 'x': 2, 'y': 3})
    """
    2 3 1
    """
     
    #===========*args+**kwargs===========
    def foo(x, y):
        print(x, y)
     
    def wrapper(*args, **kwargs):
        foo(*args, **kwargs)
     
    #===========*后定义的参数,必须被传值(有默认值的除外)且必须按照关键字实参的形式传递===========
    def foo(x,y,*args,b,a=1,**kwargs):
        print(x, y)
        print(args)
        print(a)
        print(b)
        print(kwargs)
    foo(1,2,3,4,5,b=3,c=4,d=5)
    """
    1 2
    (3, 4, 5)
    1
    3
    {'c': 4, 'd': 5}
    """
    

    函数返回值

    函数外部的代码要想获取函数的执行结果,就可以在函数里用return语句把结果返回

    def my_sum(x,y):
        res = x+y
        return x,y,res #返回函数执行结果
    c = my_sum(4,5) #结果赋值给c变量
    print(c)
    

    函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束

    如果未在函数中指定return,那这个函数的返回值为None,return 逗号分隔多个值返回元组。

     全局与局部变量

    在函数中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

    全局变量作用域是整个程序,局部变量作用域是定义该变量的函数。

    当全局变量与局部变量同名时,在定义局部变量的函数内,局部变量起作用,在其它地方全局变量起作用。

    name = "zhangsan"
    def change_name():
        global name
        name = "lisi"
        print("after change", name)
    change_name()
    print(name)
    

     global name的作用就是要在函数里声明全局变量name ,意味着最上面的name = "zhangsan"即使不写,程序最后面的print也可以打印nam,只是name变成了lisi

     
    LEGB 代表名字查找顺序: locals -> enclosing -> globals -> __builtins__
    locals 是函数内的名字空间,包括局部变量和形参
    enclosing 外部嵌套函数的名字空间(闭包中常见)
    globals 全局变量,函数定义所在模块的名字空间
    builtins 内置模块的名字空间
     

    嵌套函数

    name = "zhangsan"
    def change_name():
        name = "lisi"
        def change_name2():
            name = "wangwu"
            print("第3层打印", name)
        change_name2()  # 调用内层函数
        print("第2层打印", name)
    change_name()
    print("最外层打印", name)
    
    第3层打印 wangwu
    第2层打印 lisi
    最外层打印 zhangsan
    

    匿名函数

    匿名函数就是不需要显式的指定函数名

    lambda函数

    #这段代码
    def calc(x,y):
        return x**y
    
    print(calc(2,5))
    
    #换成匿名函数
    calc = lambda x,y:x**y
    print(calc(2,5))
    

     高阶函数

    变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    def add(x,y,f):
        return f(x) + f(y)
    res = add(3,-6,abs)
    print(res)
    

    只需满足以下任意一个条件,即是高阶函数

    • 接受一个或多个函数作为输入
    • return 返回另外一个函数

     

    递归函数

    在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

    def calc(n):
        print(n)
        if int(n/2) ==0:
            return n
        return calc(int(n/2))
    calc(10)
    

     输出

    10
    5
    2
    1
    
    def calc(n):
        v = int(n/2)
        print(v)
        if v > 0:
            calc(v)
        print(n)
    calc(10)
    


    输出

    5
    2
    1
    0
    1
    2
    5
    10
    

    递归特性:

    1. 必须有一个明确的结束条件
    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    递归函数实际应用案例,二分查找

    闭包

    • 创建闭包函数必须满足3点:
      1. 1、必须有一个内嵌函数
      2. 2、内嵌函数必须引用外部函数中的变量(非全局作用域的引用)
      3. 3、外部函数的返回值必须是内嵌函数
    • 闭包意义:
      1. 之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路
      2. 返回的函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
  • 相关阅读:
    Java修炼之道--I/O
    配置tomcat资源文件软连接
    配置tomcat按天输出日志文件
    Ubuntu 安装rabbitmq
    Ubuntu下 JDK、tomcat、redis离线安装
    Nginx+tomcat负载均衡环境搭建
    Tomcat性能调优及性能测试工具配置
    Tomcat搭建https并与APR模式兼容
    IDEA开发工具小技巧整理
    Ubuntu下Nginx+fastDFS环境安装
  • 原文地址:https://www.cnblogs.com/zhaohw127/p/10565953.html
Copyright © 2020-2023  润新知