• Python之第七章 函数 --- 基础


    目录

    Python之第七章 函数 --- 基本

    1.模块化程序设计

    1.基本思想

    2.特点

    2.定义函数

    1.格式:

    2.函数名:

    3.形式参数:

    4.函数体

    ​编辑

    3.函数调用

    1.作用

    2.格式

    3.调用方式

    4.实例

    4.return语句

    1.作用

    2.注意

    3.return可以返回任意Python的对象

    5.函数参数

    1.位置参数

    ​2.关键字参数

    3.默认参数

    4.不定长参数(可变参数)

    6.变量作用域

    1.作用域

    2.编程语言中变量的作用域从结构形式分成

    3.Python的作用域共分4层

    4.Python查找规则

    5.全局变量和局部变量

    ​6.global 和 noniocal关键字

            global --- 指定当前变量使用外部的全局变量

    面试真题:

            ​nonlocal --- 修改签到作用域中的变量

    7.函数递归调用

    1.作用

    2.例 递归算法计算n!

    3.注意:

    8.匿名函数

    1.使用lambda关键字创建匿名函数

    2.格式

    3.匿名函数只能有一个表达式,有自己的命名空间,不用再写return语句,表达式的结果就是其返回值


    Python之第七章 函数 --- 基本

    1.模块化程序设计

    1.基本思想

            将一个大型程序按照功能分隔成若干个小型模块

    2.特点

            1. 模块相对独立,功能单一、结果清晰、接口简单(内聚、耦合)

            2. 减少程序的复杂性

            3. 提高元器件的可靠性

             4. 缩短软件开发周期

            5.避免程序开发的重复劳动

    2.定义函数

    1.格式:

    1. def 函数名(形参列表):#函数首部
    2. 内部功能代码      # 函数体
    3. return 表达式

    2.函数名:

            函数名区分其他函数作用,本质是该函数在内存所占空间的首地址,是一个常量,命令要求见名知意

    3.形式参数:

            作用 --- 函数接收数据的变量空间

            原则 --- 调用函数的时候,形参变量会分配空间,调用结束后释放空间

            设计 --- 形参名称、个数,多个参数使用逗号分隔

    4.函数体

            编写程序实现函数功能

    1. def summer(lis):
    2.    '''这里写函数的说明文档,
    3.   :param lis : 参数列表说明,
    4.   :return:返回值说明
    5.   '''
    6.    t = 0
    7.    for i in lis:
    8.        t += i
    9.    return t
    10. summer()

    3.函数调用

    1.作用

            使用函数功能,传递参数

    2.格式

            函数名 ( 实参列表 )

    3.调用方式

    1. fun(m) # 调用fun函数,将实参m传递给形参
    2. n = fun(m) # 调用fun函数,返回值赋值给n变量
    3. s = s*fun(m) # 调用fun函数,返回值参与后续运算
    4. fun() # 无返回值、无参,只是执行一次

    4.实例

    例 计算C(m,n) = m! / (n! * (m-n)!)

    1. # 例 计算C(m,n) = m! / (n! * (m-n)!)
    2. def fun(x):
    3.    '''
    4.   :param x: 需要进行阶乘的参数
    5.   :return: 返回X的阶乘
    6.   '''
    7.    funx = 1
    8.    for i in range(1, x + 1):
    9.        funx = funx * i
    10.    return funx
    11. m = int(input("请输入m的值:"))
    12. n = int(input("请输入n的值:"))
    13. C = fun(m) / (fun(n) * fun(m - n))
    14. print('结果:', C)
    15. 结果:
    16. 请输入m的值:5
    17. 请输入n的值:2
    18. 结果: 10.0

    4.return语句

    1.作用

            表示函数执行到此结束,返回其后的对象,函数执行到此结束,若无返回值,省略return语句,会返回None

    2.注意

            一旦函数执行过程中遇到return语句,之后的函数体代码都不会执行,会跳出函数体

    1. def func():
    2.    pass
    3.    return # 此时,后边的代码都不会执行
    4.    print()
    5.    pass

    3.return可以返回任意Python的对象

    5.函数参数

    1.位置参数

            不许参数、必备参数,必须按照正确的顺序传到函数中,实参和形参按位置对齐,个数相同

    1. def fun(str1, str2):  # 形参
    2.    print(str1, str2)
    3. fun('hello', 'world')  # 实参

    ​2.关键字参数

            使用形参的名字来确定输入的参数值,实参不再需要与形参的位置完全一直

    1. def fun(str1, str2):  # 形参
    2.    print(str1, str2)
    3. fun(str2='hello', str1='world')  # 实参

    3.默认参数

            调用参数时,如果没有传递参数,会默认使用默认阐述

    1. def fun(str1, str2):  # 形参
    2.    print(str1, str2)
    3. fun('hello')  # 实参
     
    

    注意 :

            默认参数必须写到形参列表的最右边,否则报错

            默认参数尽量不要指向不变的对象

    例 国内上市某互联网公司的Python面试题:

    1. def func(a=[]):
    2. a.append('A')
    3. return a
    4. print(func())
    5. print(func())
    6. print(func())
    7. 结果:
    8. ['A']
    9. ['A', 'A']
    10. ['A', 'A', 'A']
    11. 而不是:
    12. ['A']
    13. ['A']
    14. ['A']
    15. #原因:函数体装入内存后,a列表会被创建,内存中有a列表内容,伴随着每一次调用a列表都不会清空回收,会继续使用直到程序结束
    16. def func(a=[]):
    17. print('函数内部a的地址为:%s' % id(a))
    18. a.append('A')
    19. return a
    20. b = print(func())
    21. print('b的地址为:%s' % id(b))
    22. print(b)
    23. c = print(func())
    24. print('c的地址为:%s' % id(c))
    25. print(c)
    26. d = print(func())
    27. print('d的地址为:%s' % id(d))
    28. print(d)
    29. 结果:
    30. 函数内部a的地址为:2915279324672
    31. ['A']
    32. b的地址为:140722425179352
    33. None
    34. 函数内部a的地址为:2915279324672
    35. ['A', 'A']
    36. c的地址为:140722425179352
    37. None
    38. 函数内部a的地址为:2915279324672
    39. ['A', 'A', 'A']
    40. d的地址为:140722425179352
    41. None

            需要输出结果为 --- 使用不变的类型作为默认值修改

            ['A']
            ['A']
            ['A']
    1. def func(a=None):
    2. if a is None:
    3.     a = []
    4. a.append('A')
    5. return a
    6. print(func())
    7. print(func())
    8. print(func())
    9. 结果:
    10. ['A']
    11. ['A']
    12. ['A']

    4.不定长参数(可变参数

            定义 --- 传入的参数可以是任意多个

            格式1 --- * 形参,增加一个星号,可以接受多个参数并存储到元组中

    1. def func(str1, *str2):
    2.    print(str1, str2)
    3. func('hello', 'world', 'china', '123456')
    4. 结果:
    5. hello ('world', 'china', '123456')

            格式2 --- ** 参数,增加两个星号,以关键字参数形式传递,以字典形式存储

    1. def func(str1, **str2):
    2.    print(str1, str2)
    3. func('hello', a='world', b='china', c='123456')
    4. 结果:
    5. hello {'a': 'world', 'b': 'china', 'c': '123456'}

    注意:

            若形参列表中只有单独的星号,则对实参必须以关键字参数形式传入

    1. def func(str1, *,str2):
    2. print(str1, str2)
    3. func('hello', str2='world')
    4. 结果:
    5. hello world

    6.变量作用域

    1.作用域

            作用域指变量的有效范围,决定访问权限

    2.编程语言中变量的作用域从结构形式分成

            块级、函数、类、模块、包(由小到大),Python没有块级 等同于普通语句

    3.Python的作用域共分4层

    作用
    L(local)局部
    E(enclosing)闭包函数外的函数中
    G(global)全局
    B(built-in)内建
    1. x = int(2, 9)  # 内建作用域
    2. global_bar = 0  # 全局作用域
    3. def outer():
    4.    out_ver = 1  # 闭包函数外的函数中
    5.    def inner():
    6.        in_var = 2  # 局部作用域

    4.Python查找规则

            L -> E -> G -> B的顺序查找变量,即在局部找不到变量则回到局部外去找,再找不到则到全局去找,最后到内建去找变量,若还找不到则报错

    5.全局变量和局部变量

            定义在函数内部的称为局部变量,定义在函数外的变量全局的作用域,称为全局变量

    1. a = 1  # 全局变量
    2. def func():
    3.    b = 2  # 局部变量
    4.    print(a)
    5.    
    6.    def inner():
    7.        c = 3  # 更局部的变量
    8.        print(a)
    9.        print(b)  # b外部变量
    10.        print(c)
    11. func()
    12. 结果:
    13. 1

    ​6.global 和 noniocal关键字

    1. total = 0  # 全局变量
    2. def plus(arg1, arg2):
    3.    total = arg1 + arg2
    4.    print('函数内局部变量total =', total)
    5.    print('函数内局部变量total地址为:%s' % id(total))
    6.    return total
    7. plus(10, 20)
    8. print('函数外的全局变量total=', total)
    9. print('函数外的全局变量total地址为:%s' % id(total))
    10. 结果:
    11. 函数内局部变量total = 30
    12. 函数内局部变量total地址为:3010629299408
    13. 函数外的全局变量total= 0
    14. 函数外的全局变量total地址为:3010629298448

    global --- 指定当前变量使用外部的全局变量

    1. total = 0  # 全局变量
    2. def plus(arg1, arg2):
    3.    global total # 使用global声明此处total引用外部的total
    4.    total = arg1 + arg2
    5.    print('函数内局部变量total =', total)
    6.    print('函数内局部变量total地址为:%s' % id(total))
    7.    return total
    8. plus(10, 20)
    9. print('函数外的全局变量total=', total)
    10. print('函数外的全局变量total地址为:%s' % id(total))
    11. 结果:
    12. 函数内局部变量total = 30
    13. 函数内局部变量total地址为:2221631892688
    14. 函数外的全局变量total= 30
    15. 函数外的全局变量total地址为:2221631892688

    面试真题:

    1. a = 10
    2. def test():
    3.    a += 1
    4.    print(a)
    5. test()
    6. #执行会报错,a += 1 相当于a = a+1 所覆盖,Python规定如果函数内部需要修改一个变量,那么该变量为内部变量,除非使用global声明
    7. #应修改为下列结果
    8. a = 10
    9. def test():
    10.    global a # 声明使用外部变量
    11.    a += 1
    12.    print(a)
    13. test()

    nonlocal --- 修改签到作用域中的变量

    1. a = 1
    2. print('全局变量a的地址:', id(a))
    3. def fun():
    4.    a = 2
    5.    print('函数fun内部a的地址为:', id(a))
    6.    def inner():
    7.        nonlocal a
    8.        a = 3
    9.        print('函数inner调用后闭包内部变量a的地址:', id(a))
    10.    inner()
    11.    print('函数 inner低啊用后,闭包外部的a的地址:', id(a))
    12. fun()
    13. 结果:
    14. 全局变量a的地址: 2248198875440
    15. 函数fun内部a的地址为: 2248198875472
    16. 函数inner调用后闭包内部变量a的地址: 2248198875504
    17. 函数 inner低啊用后,闭包外部的a的地址: 2248198875504

    7.函数递归调用

    1.作用

            一个函数在它的函数内部调用自身称为递归调用

    2.例 递归算法计算n!

    1. def fun(n):
    2.    if n == 0:
    3.        return 0
    4.    else:
    5.        if n > 1:
    6.            x = fun(n - 1) * n
    7.        else:
    8.            x = 1
    9.    return x
    10. m = int(input('请输入一个正整数:'))
    11. print('阶乘的结果为:', fun(m))
    12. 结果:
    13. 请输入一个正整数:30
    14. 阶乘的结果为: 265252859812191058636308480000000

    3.注意:

            1.每一次递归,整体问题的值都要比原来的要小,并且低轨道一定层次后必须给出结果。

            2.为了防止递归的无休止调用,必须在函数内部有终止递归的手段,一般配合if-else语句

            3.递归需要注意防止递归深度溢出,在Python中使用栈这种数据结构实现的,默认的深度为1000层,超出该深度会抛出异常,每当进入下一个递归时,栈会增加一层,当函数每返回一次。栈会减少一层

            4.递归可以使用程序变得简洁,增加程序可读性,但每次递归都要重新开辟内存空间

     

    8.匿名函数

            当创建函数时有时不需要显式的定义函数,直接省略函数名传入参数计算即可,省略函数的命名,通过水平不发生表达式实现函数

    1.使用lambda关键字创建匿名函数

            所谓匿名即不再使用def关键字来创建函数

            lambda --- 只是一个表达式,不是一个代码块,函数体比def定义的函数简单

            lambda --- 只能封装有限的逻辑语句

    2.格式

    lambda 参数 : 表达式

    1. lambda x: x * x
    2. # 相当于
    3. def fun(x):
    4.    return x * x

    lambda 势函数关键字

            lambda之后的x为函数参数,相当于原先的形参

            x*x为执行代码

    3.匿名函数只能有一个表达式,有自己的命名空间,不用再写return语句,表达式的结果就是其返回值

  • 相关阅读:
    K邻近算法k值选取以及kd树概念、原理、构建方法、最近邻域搜索和案例分析
    数字图像处理—— 实验五 基于图像分割的车牌定位识别
    “客户端到服务器的数据传递”和“服务器上的数据传递”这两种数据传递的方式的区别
    百度地图API使用指南 - Javascript API | JavaScript API GL | JavaScript API Lite
    Github 常用资源搜索技巧 & Git - Pycharm 项目推拉 - 基本使用
    线程的一些简单问题
    Mysql(多表查询)
    Tcp 协议的接口测试
    大数据算法系列10:字符串检验算法
    Scrum敏捷模式的优势点、实践经验及适用企业
  • 原文地址:https://blog.csdn.net/qq_57289939/article/details/127811273