Python编程基础-5(模块与函数)

博客主要用于自学记录,内容参考国科大张晋连老师的Python编程课的课件

第五章 模块与函数

5.1 概述

        Python的程序由包、模块和函数组成。

  • 函数是一段可以重用的有名称的代码。通过输入的参数值,返回需要的结果。
  • 模块是处理某一类问题的集合,模块由函数和类组成 模块和常规的Python程序区别是用途不同:
    • 模块用于编写其他函数。因此模块没有所谓的main函数,即可执行语句
  • 包是一个完成特定任务的工具箱
  • 函数、模块、包都可以自定义
  • Python 的程序结构: 

    • Python自带的工具包和模块安装在安装目录的Lib子目录中
      • 例如:Lib目录中的xml文件夹。xml文件夹就是一个包,该包用于完成XML的应用开发,xml包中包含四个子包:dom、sax、etree和parsers。文件__init__.py是xml包的注册文件,若无此文件,Python将不能识别xml包。
      • 注意:包必须至少含有一个__init__.py文件。 __init__.py文件的内容可以为空,它用于标识当前文件夹是一个包。

5.2 函数

  • 1.函数的定义及调用
    • 函数定义格式:

      def 函数名([形参表]):

          函数体语句序列

          [return 表达式]    #可选项,即有的函数可以没有返回
    • 函数调用格式:

      函数([实参表])

      • 说明:函数必须先定义,后使用

      • 函数名与变量名命名规则相同,只能包含字母、数字和下划线_,且不能以数字开头

  • 2.函数的参数

    • 在C、C++中,参数的传递有值传递和引用传递两种方式。Python中任何东西都是对象,所以参数只支持引用传递的方式
    • Python通过名称绑定的机制,把实际参数的值和形式参数的名称绑定在一起,即把形式参数传递到函数所在的局部命名空间中,形式参数和实际参数指向内存中同一个存储空间
      • 按引用传递参数 

        •  向函数传递参数时,Python采用按引用传递的方式

        • 这意味着当传递参数时,函数将使用新变量名来引用原始值

        • 这种方式形参按位置引用实参值,也称位置参数 

      • 默认值参数
        • 函数的参数支持默认值,当某个参数没有传递实际的值的时候,函数将使用默认参数计算。
        • 带默认值的参数不能位于没有默认值参数的前面。
      • 关键字参数
        • 关键字参数有两大好处:
          • 清晰的指出了饿参数值,提高可读性
          • 关键字参数的顺序无关紧要
        • 条用使用关键字参数的函数时,以param = value 的方式传递参数
      • 不定长参数
        • 不定长参数,即在调用函数时可以接收任意数量的实参,这些实参在传递给函数时会被封装成元组(位置参数)或字典(关键字参数)形式
        • 在参数名前面加一个“*”,表示参数是以形参名为标识符的元组
        • 在参数名前加两个“*”,表示参数是以形参名为标识符的字典,其中关键字为“键”,参数值为“值”
        • 参数传递顺序
          • ​​​​​在定义函数时,可以混合使用多种参数传递方式,此时要遵循以下规则;
            • 关键字参数应放在位置参数后面
            • 元组参数必须在关键字参数后面
            • 字典参数要放在元组参数后面
          • 在调用函数时,首先按位置顺序传递参数,其次按关键字传递参数。多余的非关键字参数传递给元组,多余的关键字参数传递给字典

            def 函数名([普通形参列表,] *不定长参数名 [,普通形参列表]):

                函数体

          • 或:

            def 函数名([普通形参列表,] **不定长参数名):

                函数体

      • 拆分参数列表

        • 如果一个函数所需要的参数已经存储在了列表、元组或字典中,则可以直接从列表、元组或字典中拆分出来函数所需要的这些参数。

        • 其中列表、元组拆分出来的结果作为位置参数,而字典拆分出来的结果作为关键字参数

  • 3. 函数的调用
    • 函数调用执行的四个步骤:
      • 调用程序在调用处暂停执行
      • 函数的形参在调用时被赋值为实参
      • 执行函数体
      • 函数被调用结束,给出返回值
  • 4.函数的返回值
    • return语句:程序退出该函数,并返回到函数被调用的地方(一般来说,若函数有返回值,则返回至函数调用那条语句参与运算,否则返回至函数调用语句的下一条继续向后执行)
    • return语句返回的值传递给调用程序,
    • Python函数的返回值的形式:
      • 没有返回值
        • 等价于return None
      • 返回一个值
        • 返回值可以是一个变量,也可以是一个表达式
      • 返回多个值
  • 5.函数的嵌套
    • Python 不仅支持函数的嵌套调用,还支持函数的嵌套定义,即在函数内部再定义函数
    • 但是不建议在函数内部定义函数,不便于程序的维护,容易造成逻辑上的混乱,且嵌套定义的函数层次越多,程序维护的代价就越大。
  • 6.变量的作用域
    • 变量的作用域是指变量的作用范围,即定义一个变量后,在哪些地方可以使用这个变量。
    • 按照作用域的不同,Python中的变量可分为局部变量和全局变量
      • 局部变量
        • 只能在函数内部使用的变量
        • 函数一旦结束,局部变量的生命周期也就结束
        • 局部变量的作用范围只在其被创建的函数内有效,函数形参也属于局部变量
      • 全局变量
        • 在函数之外定义的变量都可以称之为全局变量
        • 全局变量是能够被不同的函数、类或者文件共享的变量
        • 全局变量可以被文件内部的任何函数和外部文件访问
        • 全局变量通畅在文件的开始处定义
        • 若要在函数内部修改全局变量的值,必须用global语句声明
        • 全局变量使用注意事项
          • 统一管理全局变量
            • 可以将全局变量放到一个专门的文件中,便于统一管理
            • gl.py
          • 应该尽量避免使用全局变量。因为不同的模块都可以自由的访问全局变量,可能会导致全局变量的不可预知性。
          • 全局变量降低了函数或模块之间的通用性,不同的函数或模块都要依赖全局变量。同样,全局变量降低了代码的可读性,阅读程序者并不知道调用的某个变量是全局变量。
  • 7.递归函数
    • 递归的概念
      • 递归函数可以在函数主题内直接或者间接的调用自己,即函数的嵌套是函数本身
      • 在进行问题分解时,若发现分解之后待解决的子问题和原问题有着相同的特性和解法,只是在问题的规模上比原问题小,此时就可以设计递归函数进行求解
      • 递归是一种程序设计方法,使用递归可以减少重复的代码,使程序变得简洁
      • 递归的过程分为两个阶段,递推和回归
    • 递归函数的原理
      • 第一阶段,递归函数在内部调用自己。每一次函数调用又重新开始执行此函数的代码,知道某一级递归程序结束。
      • 第二阶段,递归函数从后往前返回。递归函数从最后一级开始返回,一直返回到第一次调用的函数体内,即递归函数逐级调用完毕后,再按相反的顺序逐级返回
    • 递归的实现
      • 判断问题能否使用递归,看看是否具有两个特点
        • 需有完成任务的递推公式
        • 结束递归的条件
      • 编写递归函数时,程序中必须有相应的语句
        • 一个递归调用语句
        • 测试结束语句。先测试,后递归调用
    • 递归的评价与消除递归
      • 递归程序虽然易读、易编,但需要占用额外的内存空间,并且执行速度也受影响。当问题规模较大时,递归调用会涉及到很多层的函数调用,一方面会由于栈操作影响程序运行速度,另一方面在Python中有栈的限制、太多层的函数调用会引起栈溢出问题
      • 是否利用递归编程要看实际问题,如果要节约内存就用循环语句实现。若对内存要求并不高,可以用递归编程。
  • 8.lambda 函数
    • lambda函数用于创建一个匿名函数,函数名未和标识符进行绑定
    • lambda函数是一种不适用def定义函数的形式,其作用是能够快速定义一个函数
    • lambda函数的函数体只是一个表达式,所以lambda函数只能实现比较简单的功能,返回一些比较简单的运算结果
  • 9.生成器(Generator)函数
    • 生成器是用来创建Python序列的一个对象,可以将其看作是一个不断产生值的函数
    • 使用它可以迭代庞大的序列,且不需要在内存中创建和存储整个序列
    • 生成器函数的定义与普通函数相同,只是将return 换成了yield
    • 生成器每次产生一个值(yield),函数被冻结后,被唤醒后再产生一个值
    • 如果生成的序列比较简单,可以使用生成器推导式
  • 10.高阶函数
    • 高阶函数是指把函数作为参数的一种函数
    • 函数不仅可以赋给形参,也可以赋给普通变量。复制后,既可以用变量名代替函数名完成函数调用
  • 11.猴子补丁
    • 猴子补丁是指在运行时动态替换已有的代码。主要用于在不修改已有代码情况下修改其功能或增加新功能的支持
    • 例如,在使用第三方模块时,模块中的某些方法可能无法满足需求。此时,可以在不修改这些方法代码的情况下,通过猴子不定用自己编写的新方法进行替代,从而实现一些新的功能

5.3 模块

模块实际上是将一组函数放在一起共享公共的主题

将这些函数存储与一个.py文件中

使用import命令导入

  • 1.模块的创建及导入
    • 创建模块,即创建一个.py文件,在其中包含用于完成任务的变量、类和函数,不包括所谓的main函数,即嗲用该模块中函数的语句。
    • 模块使用之前要导入,方法之前已经说过。
  • 2.模块的属性
    • 模块有一些内置属性,用于完成特定的任务。dir(shapes)
      • __doc__:模块中用于描述的文档字符串
      • __name__:模块名
        • 作用是获取当前模块的名称
      •   __file__:模块保存的路径
  • 3.内置模块__builtins__的常用函数
    • P樱桃红提供了一个内置模块,无需导入
    • 该磨矿定义了一些常用函数,利用这些函数可以实现数据类型的转换、数据的计算、序列的处理等功能
    • 可用dir(__builtins__) 查看所包含的内容

5.4 包

        Python中的包(Package)的作用与操作系统中文件夹的作用相似,利用包可以将多个关系密切的模块组成在一起,方便进行程序的重用,也可以有效避免模块命名冲突问题。

        一个包,就是创建一个文件夹并在该文件定义夹下创建一个__init__.py文件(内容可以为空),文件夹的名字就是包名。当包被调用时(使用import也可导入包),则自动执行__init__.py文件

        另外,可以根据需要在该文件夹下再创建子文件夹,子文件夹中创建一个__init__.py文件,则又形成了一个子包

        模块可以放在任何一个包或子包中,在导入模块时需要指定所在的包和子包的名字。例如,如果要导入包A中的模块B,则需要使用“import A.B”

5.5第三方库的安装

  •  Pyton库的自定义安装
    • 找到库所在的网站,根据提示下载安装(适合pip中尚无登记后者安装失败的第三方库)
  • Python库的工具安装,使用PIP工具
    • 通过pip在线安装库函数,需要联网
  • Python库的文件安装
    • 下载安装包,通过.whl文件直接安装

5.6 综合举例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值