函数和代码复用---Python语言程序设计笔记5(北理工mooc)

文章目录

    • Python语言程序设计笔记5(北理工mooc)
    • 函数和代码复用
      • 函数定义与使用
        • 函数的参数
        • 局部变量和全局变量
        • lambda函数
      • 代码复用与函数递归
        • 代码复用
        • 模块化设计
        • 函数递归

Python语言程序设计笔记5(北理工mooc)

函数和代码复用

函数定义与使用

函数是一段有特定功能,可重复使用的语句组,函数也是一种特定功能的抽象,一般函数代表某个特定功能。函数可以降低编程难度以及实现代码的复用。
函数结构:

def <函数名>(<参数(0个或多个)>)<函数体>
    return <返回值>

返回值可有可无,return也可有可无。返回多个值时每个值之间用逗号分隔,用小括号,中间以逗号分隔来体现,这便是元组类型,如(1,2,3)。
函数在执行到return时,立即执行return函数返回数值并结束本次函数的执行,即后面的语句不再执行。

函数的参数

可选参数:函数的参数分为非可选参数和可选参数,可选参数必须放在非可选参数的后面,参数设置如:def fact(n, m=1),其中n为非可选参数,m为可选参数,当m不设置时,则默认m=1。
可变参数:函数定义时设定可变数量的参数,即不确定参数总数量。示例如下:
函数和代码复用---Python语言程序设计笔记5(北理工mooc)_第1张图片

参数传递分为位置传递和名称传递两种方式,以def fact(n, m=1)为例,可以使用位置传递:fact(5,10),也可以使用名称传递:fact(m=10, n=5)。

局部变量和全局变量

局部变量为函数内部使用的变量,全局变量为程序内函数外部使用的变量,局部变量和全局变量可以重名但依然不同,可以使用global保留字在函数内使用全局变量,在函数内部使用global s这个语句即可声明在函数内的s是全局变量。
局部变量(在函数外部被声明)为组合数据且未被创建(未用global声明)时,等同于全局变量。

lambda函数

用于定义匿名函数
结构:

<函数名> = lambda <参数>:<表达式>

是一种函数的紧凑表达形式,等价于使用def和return定义的函数,但它不能用函数体而只能用表达式,例如

f = lambda x, y : x+y

输入f(1, 2)时,输出3。
lambda函数一般用作一些特定方法和函数的参数,一般不使用lambda函数定义函数。一般情况,建议使用def来定义函数。

代码复用与函数递归

代码复用

  • 代码资源化:程序代码是一种用来表达计算的资源
  • 代码抽象化:使用函数的方法对代码赋予更高级别的定义
  • 代码复用:同一段代码在需要时可被重复利用。一般使用“函数”和“对象”实现对代码的复用,“函数”(初步抽象)和“对象”(高度抽象)也是代码抽象的不同级别。

模块化设计

核心:分而治之
即通过“函数”和“对象”封装将代码划分为模块和模块之间的表达。在模块化的设计中,一般要关注主程序、子程序和子程序之间的关系,一般将子程序看作模块,主程序看作模块与模块间的关系。模块化是一种分而治之、分层抽象、体系化的设计思想。

  • 紧耦合:两个部分交流较多,无法独立存在
  • 送耦合:两个部分交流较少,可以独立存在。它们之间有非常清晰简单的接口。
    一个函数的参数和返回值越少,它和其他模块之间的关系越清晰,复用的可能性就越高,模块化设计追求模块内部紧偶像、模块之间松耦合。

函数递归

递归指调用函数自身的方式。
递归的两个关键特征:
n ! = { 1 , n = 0 n ( n − 1 ) ! , n > 0 n !=\left\{\begin{array}{c}1, n=0 \\ n(n-1) !, n>0\end{array}\right. n!={1,n=0n(n1)!,n>0为例:

  • 链条:计算存在递归链条。如n!=n*(n-1)!,则n!和(n-1)!之间构成了递归链条
  • 基例:存在一个或多个不需要再次递归的基例。如n=0时,n!=1。

代码上可写为:

def fact(n):
    if n == 0:
        return 1
    else:
        return n*fact(n-1)

因此递归在程序上一般用函数加分支语句来进行实现。

  • 递归本身就是一个函数,需要函数定义的方式进行描述
  • 函数内部,采用分支语句对输入参数进行判断,并针对链条和基例分别编写代码。

你可能感兴趣的:(Python基础学习笔记)