目录

1. 函数的定义与使用

1.1 函数的理解和定义

1.1.1 函数的理解

1.1.2 函数的定义

1.2 函数的使用及调用过程

1.3 函数的参数传递

1.3.1 无参数传递

1.3.2 可选参数传递

1.3.3 可变参数传递

1.3.4 参数传递的两种方式

1.4 函数的返回值

1.5 局部变量和全局变量

1.5.1 定义

1.5.2 简单数据类型的使用

1.5.3 组合类型的使用

1.6 lambda函数

1.6.1 定义与语法格式

1.6.2 使用注意事项

2. 七段数码管绘制实例

3. 代码复用与模块化设计

3.1 代码复用的含义

3.2 代码复用的形式

3.3 模块化设计

4. 函数的递归

4.1 函数递归的定义

4.2 函数递归的关键

4.3 函数递归的调用过程

4.4 函数递归实例解析

4.4.1 字符串反转

4.4.2 斐波那契数列

4.4.3 汉诺塔

4.4.4. 科赫雪花实例

5. Python内置函数


1. 函数的定义与使用

1.1 函数的理解和定义

1.1.1 函数的理解

① 函数是一段具有特定功能的、可重用的语句组,是一种功能的抽象

② 用函数名来表示并通过函数名进行功能调用

③ 使用函数的作用:

a. 降低编程难度

b. 代码复用

1.1.2 函数的定义

说明1:函数名

函数名可以是任何有效的Python标识符

说明2:函数参数

① 函数定义时,参数列表中的参数是形式参数

② 函数参数可以由零个、一个或多个,当有多个参数时,各参数由逗号分隔;当没有参数时,圆括号要保留

说明3:函数返回值

当需要返回值时使用保留字return和返回值列表,否则函数可以没有return语句

1.2 函数的使用及调用过程

函数定义后,不经过调用,不会被执行;而调用就是运行函数代码的方式

① 调用时要给出实际参数

② 实际参数替换定义中的参数

③ 函数调用后得到返回值

说明:函数调用过程

① 调用程序在调用处暂停执行

② 在调用时将实参复制给函数的形参

③ 执行函数体语句

④ 函数调用结束给出返回值,程序回到调用前的暂停处继续执行

1.3 函数的参数传递

1.3.1 无参数传递

说明:函数可以没有参数,但是圆括号必须保留

1.3.2 可选参数传递

说明1:函数定义时可以为某些参数指定默认值,构成可选参数

说明2:考虑到参数匹配,可选参数必须定义在参数列表最右边

示例:

tips:在C++中称为缺省参数

1.3.3 可变参数传递

说明1:函数定义时可以设计可变数量参数,即不确定参数总数量,通过在参数前增加星号(*)实现

说明2:考虑到参数匹配,可变参数也必须定义在参数列表最右边。

说明3:调用时,可变参数以元组类型传递到函数中

示例:

tips:Python中的max & min内置函数就是可变参数函数

1.3.4 参数传递的两种方式

函数调用时,参数可以按照位置或名称方式传递

说明1:实参默认采用按位置方式传递

说明2:如果按名称方式传递,那么参数之间的顺序可以任意调整

说明3:引入按名称方式传递,是为了提高程序的可读性,便于理解输入参数的含义

1.4 函数的返回值

说明1:return语句用来退出函数并将程序返回到函数被调用的位置继续执行

说明2:return语句可以将0个、1个或多个函数运算后的结果返回给函数调用者

说明3:函数可以没有return语句,此时函数并不返回值

说明4:如果函数使用return语句返回多个值,这些返回值以元组类型保存

1.5 局部变量和全局变量

1.5.1 定义

说明1:全局变量

全局变量指在函数之外定义的变量,一般没有缩进,在程序执行全过程中有效

说明2:局部变量

局部变量指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将被释放

1.5.2 简单数据类型的使用

在上述示例中,s = 1语句被理解为生成一个局部变量s,并将1赋值给他,此时func函数并没有将s作为全局变量使用

如果希望将s作为全局变量使用,需要在变量s使用前显式声明该变量为全局变量

1.5.3 组合类型的使用

组合数据类型由于操作多个数据,所以他们在使用中有创建和引用的区别,以列表为例,当列表变量被方括号([],无论是否为空)赋值时,这个列表才被真实创建;否则只是对之前创建列表的一次引用

说明:如果func函数内部存在一个真实创建过且名称为ls的列表,则func函数将操作该列表而不会修改全局变量

1.6 lambda函数

1.6.1 定义与语法格式

① lambda函数是一种匿名函数

② 使用lambda保留字定义

③ lambda函数返回函数名作为结果

④ lambda函数用于定义简单的、能够在一行内表示的函数

示例如下,

1.6.2 使用注意事项

① 一般定义函数,即使只有一行,也建议使用def方式定义

② lambda函数并不是定义函数的常用形式

③ lambda函数主要用作一些特定函数或方法的参数,而这些参数正是函数类型(个人:比如C语言快速排序函数qsort的参数就是函数,实现的是比较规则)

2. 七段数码管绘制实例

说明1:理解方法思维

模块化思维:确定模块接口,封装功能

规则化思维:抽象过程为规则,计算机自动执行

化繁为简:将大功能变为小功能组合,分而治之

在实现中,就是将数码管数字绘制拆分为每段的绘制,同时从中抽象出规则,即无论每段数码管是否被绘制出来,turtle画笔都按顺序"走完"7个数码管

3. 代码复用与模块化设计

3.1 代码复用的含义

代码资源化:程序代码是一种用来表达计算的资源

代码抽象化:使用函数等方法对代码赋予更高级别的定义

代码复用:同一份代码在需要时可以被反复使用

3.2 代码复用的形式

函数和对象是代码复用的两种主要形式,分别对应面向过程和面向对象编程思想,其中对象的方式抽象级别更高

3.3 模块化设计

① 通过函数或者对象封装,将程序划分为模块及模块间的表达

② 具体包括:主程序、子程序和子程序间的关系

③ 模块化设计体现了分而治之、分层抽象的设计思想

说明:紧耦合和松耦合

耦合性指程序结构中各模块之间相互关联的程度,他取决于各模块间接口的复杂程度和调用方式

紧耦合:两个部分之间交流很多,无法独立存在

松耦合:两个部分之间交流较少,可以独立存在

在设计时,应该做到模块内部紧耦合,模块之间松耦合

tips:松耦合一般基于消息或协议实现,系统间交互简单

4. 函数的递归

4.1 函数递归的定义

① 函数作为一种代码封装,可以被其他程序调用,当然也可以被函数内部代码调用

② 这种函数定义中调用函数自身的方式称为递归

说明:数学定义中就有递归(e.g. 阶乘的定义),并非程序设计特有,或者说编程中的递归函数是数学中递归的体现

4.2 函数递归的关键

① 链条:计算过程中存在的递归链条

② 基例:存在一个或多个不需要再次递归的基例(即递归出口)

说明:所有递归链条要以一个或多个基例结尾,无限制的递归将耗尽计算资源

默认情况下,当递归调用到第1000层时,Python解释器将终止程序。递归深度的设置是为了防止无限递归错误的发生,当用户的正确递归程序需要超过1000层时,可以通过如下代码设定,

import sys
sys.setrecursionlimit(2000) #设置2000为新的递归深度

4.3 函数递归的调用过程

递归的实现主要就是函数 + 分支语句

① 由于要递归调用,所以必须封装成函数才能在函数定义中调用自身

② 内部的分支语句用于判断当前是基例还是链条

③ 基例和链条的处理方式不同,需要不同的代码

上述求解阶乘的函数递归过程图示如下,

说明1:理解函数递归的关键是每次函数调用时,函数参数的副本会临时存储,递归中每个函数运算的是自己的参数,相互没有影响

tips:其实各级调用的参数都建立在自己的函数调用栈中

说明2:当基例结束运算并返回值时,各函数逐层结束运算,向调用者返回计算结果

4.4 函数递归实例解析

4.4.1 字符串反转

递归链条:反转s[1:]子串,然后反转s[0]和s[1:]

递归基例:字符串只有零个或一个字符时无需反转

补充:pdb库的使用

在上述递归函数中,每进入一层递归,局部变量均有所不同,所以如果有一种调试手段可供跟踪,将对程序分析提供帮助

Python中的pdb库提供了一种交互式的调试手段,使用方式类似GDB,使用方式如下,

① 使用import pdb引入pdb库

② pdb.set_trace()用于进入debugger模式

③ 使用b(reak)设置断点,然后就可以观察每层递归调用中局部变量值的变化

参考资料:

https://docs.python.org/3/library/pdb.html

4.4.2 斐波那契数列

递归链条:F(n) = F(n - 1) + F(n - 2)

递归基例:当n == 1或n == 2时直接返回1

4.4.3 汉诺塔

将A上的圆盘借助B全部移动到C,此处有3个角色,起点 + 终点 + 中介

递归链条:

① 将"起点"上的(n - 1)个圆盘借助"终点",移动到"中介"

② 将"起点"上的第n个圆盘直接移动到"终点"

③ 将"中介"上的(n - 1)个圆盘借助"起点",移动到"终点"

递归基例:如果只有一个圆盘,直接从起点移动到终点

说明1:hanoi函数参数说明

n:圆盘数量

src:所有圆盘的起点

dst:所有圆盘的终点

mid:所有圆盘的中介

说明2:实现要点

① 真正搬移

真正搬移一个圆盘是通过print函数实现的,其中打印内容如下,

圆盘编号:起点 -> 终点(圆盘编号从上到下,由1到n)

也就是说真正的搬移都是一个圆盘直接从起点到终点,多个圆盘借助中介的搬移完全推向递归

② 角色转变

A是所有圆盘的起点,C是所有圆盘的终点,B是所有圆盘的中介,而在递归的不同阶段,他们的角色是有转变的

比如在移动最上面的(n - 1)个圆盘时,A是起点,B是终点,C是中介,这点体现在递归调用时的调用参数上

4.4.4. 科赫雪花实例

科赫曲线属于分形几何范畴,基本概念和绘制方法如下,

① 正整数n代表科赫曲线的阶数,表示生成科赫曲线过程的操作次数

② 对于长度为L的直线,将其等分为3段,中间一段用边长为L/3的等边三角形的两个边替代

③ 每增加一介,重复一次上面的操作

递归链条:n阶科赫曲线由4段(n - 1)阶科赫曲线构成,每段长度为n阶的1/3

递归基例:0阶科赫曲线就是直线,直接绘制

说明1:n阶科赫曲线的绘制相当于在画笔前进方向的0°、60°、-120°和60°分别绘制(n - 1)阶科赫曲线

说明2:科赫雪花则是使用3段科赫曲线拼接而成

5. Python内置函数

Python解释器共提供了68个内置函数,这些函数不需要引入库即可直接使用,列表如下,

简述其中几个函数的用法

① all & any

一般针对组合数据类型使用,

对于all函数,如果其中每个元素都是True,返回True,否则返回False

对于any函数,只要有一个元素是True,返回True;全部元素为False时,返回False

② sorted

对一个序列进行排序,默认从小到大排序

③ reversed

返回输入组合数据类型的逆序形式

④ id

对每一个数据返回唯一编号,可以通过比较两个变量编号是否相同判断数据是否一致,Python将数据存储在内存中的地址作为其唯一编号

④ type

返回每个数据的类型

补充:关于reversed函数的使用

当reversed函数作用于组合数据类型后,会产生相应的逆序组合数据类型,该类型无法直接打印

顺带可以验证下,id函数返回的对象编号,就是该对象在内存中的地址

此处id函数返回的地址是十进制的,转换为十六进行就是之前打印的结果

此时可以使用for循环访问逆序后的组合数据类型

Python程序设计语言基础05:函数和代码复用相关推荐

  1. python中组合数据类型、函数和代码复用的难点_Python电子教案5-2 函数和代码复用...

    <Python电子教案5-2 函数和代码复用>由会员分享,可在线阅读,更多相关<Python电子教案5-2 函数和代码复用(56页珍藏版)>请在人人文库网上搜索. 1.七段数码 ...

  2. Python程序设计语言基础01:Python基本语法元素

    目录 1. 编译和解释 1.1 编译 1.2 解释 2. 程序的基本编写方法IPO 2.1 含义 2.2 输入 2.3 输出 2.4 处理 3. 使用编程解决问题 3.1 问题的计算部分 3.2 编程 ...

  3. Python程序设计语言基础03:基本数据类型

    目录 1. 数字类型 1.1 整数类型 1.1.1 概述 1.1.2 四种进制 1.2 浮点数类型 1.2.1 概述 1.2.2 浮点数表示法 1.2.3 浮点数精度 1.3 复数类型 2. 数字类型 ...

  4. Python程序设计语言基础06(完):组合数据类型

    目录 1. 组合数据类型概述 2. 集合类型及操作 2.1 集合类型定义 2.1.1 集合类型概念 2.1.2 集合类型定义 2.2 集合操作符 2.3 集合处理方法 2.4 集合类型应用场景 2. ...

  5. Python程序设计语言基础02:Python基本图形绘制

    目录 1. 不同编程语言的适用对象 2. 蟒蛇绘制实例 3. 库或类的引用 3.1 Python计算生态 3.2 库引入与import语法 3.2.1 引入库整体 3.2.2 引入库函数 4. tur ...

  6. Python程序设计语言基础04:程序的控制结构

    目录 1. 程序的分支结构 1.1 单分支结构 1.2 二分支结构 1.3 多分支结构 1.4 条件判断及组合 1.4.1 条件判断 1.4.2 条件组合 2. BMI计算实例 3. 程序的循环结构 ...

  7. Java程序设计语言基础05:Java的类和对象

    目录 1. 类的定义与组成 1.1 类的定义 2.2 类的使用 2. 类.对象和引用 2.1 类 2.2 对象 2.3 引用 3. 类的知识扩展 3.1 成员变量初始值 3.2 在类中定义自己的引用 ...

  8. 第五章 函数和代码复用

    第五章 函数和代码复用 5.1 函数的基本使用 5.1.1 函数的定义 定义:函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进行功能调用. 使用函数的目的:降低编程难度和代码重用 ...

  9. Python基础(三)_函数和代码复用

    三:函数和代码复用 (一)函数的基本使用 1.函数的定义 函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进行功能调用.函数也可以看作是一段具有名字的子程序,可以在需要的地方调用执 ...

最新文章

  1. idea整合 spring boot jsp mybatis
  2. 个人开发者微信支付和支付宝支付
  3. Python:序列的copy() 方法和 copy 模块
  4. oracle 数据库查询多条数据的一列值
  5. 拳击 武术java父类,拳击是一种很有力量的武术类型
  6. 缓存与数据库的一致性
  7. HeadFirstJava——9_构造器与垃圾收集器
  8. EJB是什么,以及weblogic和tomcat的区别
  9. 拼多多和酷家乐面试经历总结(已拿offer)
  10. 测试记录2:APM32对比HK32
  11. 超级简单理解工厂模式
  12. 四个Channel的讲解
  13. 华硕无畏15i 2023评测 华硕无畏15i 2023值得入手吗
  14. Android开发学习——2.Android开发环境准备
  15. 软件测试周刊(第78期):你对未来越有信心,你对现在越有耐心。
  16. 多个excel工作簿、工作表合并
  17. 2023最新最全git安装教程,保姆级手把手式安装!!!
  18. 以图搜图 相似图片搜索的原理(一)
  19. Windows杀死端口进程
  20. 微信通讯录java实现_原生JS实现微信通讯录

热门文章

  1. Java Elasticsearch 使用
  2. c语言自定义函数案例情景,第4周 C语言及程序设计提高例程-3 体验自定义函数...
  3. java中输出拼json,java poi 解析excel 输出json 并且拼接字符串显示到jsp
  4. sql语句为什么大写居多_懂EXCEL就会SQL,从此查数不求人
  5. oracle中col 的用法,Oracle中的SUM用法讲解,
  6. 全局变量定义的时候左侧加了static_c语言中static 用法
  7. Python的第三方库pillow
  8. spring p2p项目html,springboot2.x项目实战视频教程p2p金融中等项目
  9. Linux的触屏手势软件安装,如何添加Mac的多点触控手势到Ubuntu | MOS86
  10. 使用volatile关键字的场景