代码复用和递归
学习自中国大学mooc
代码复用和函数递归
代码复用
把代码当成资源进行抽象
- 代码资源化:程序代码是一种用来表达计算的"资源"
- 代码抽象化:使用函数等方法对代码赋予更高级别的定义
- 代码复用:同一份代码在需要时可以被重复使用
函数 和 对象 是代码复用的两种主要形式
函数:实现一个问题的解决,给代码一个名字,在代码的层面上进行初级抽象
对象:属性 和 方法,<a>.<b> 和 <a>.<b>()
,在函数之上再次进行抽象
模块化设计
分而治之
- 通过函数或对象封装将程序划分为模块及模块间的表达
- 具体包括:主程序、子程序和子程序间关系
- 分而治之:分而治之、分层抽象、体系化的设计思想
紧耦合 松耦合
- 紧耦合:两个部分之间交流很多,无法独立存在。
- 松耦合:两个部分之间交流较少,可以独立存在。
- 模块内部紧耦合、模块之间松耦合。
函数递归的理解
函数定义中调用函数自身的方式(自己调用自己)
两个重要特征:
- 链条:计算过程存在递归链条
- 基例:存在一个或多个不需要再次递归的基例
所谓链条就是反复调用自己,但不可以是没有尽头的,存在递归头递归尾,没有尽头也就是所谓基例,二者缺一不可。
数学归纳法
- 证明当n取第一个值n0时命题成立
- 假设当nk时命题成立,证明当n=nk+1时命题也成立
递归是数学归纳法思维的编程体现
函数递归的调用过程
n的阶乘用Python递归代码完成
def fact(n):
if n == 0 :
return 1
else :
return n*fact(n-1)
- 1
- 2
- 3
- 4
- 5
递归的基本实现需要 函数 + 分支语句
- 递归本身是一个函数,需要函数定义方式描述
- 函数内部,采用分支语句对输入参数进行判断
- 基例和链条,分别编写对应代码
调用过程:
递归实例
- 字符串反转
其实之前就学过字符串的切片操作,就可以完成字符串的反转。s[::-1]
它表示这个字符串从前到后参数-1让它反转。接下来我们用递归试着实现。
def fz(s):
if s=="":
return s
else:
return fz(s[1:])+s[0]
- 1
- 2
- 3
- 4
- 5
通过定义函数使得它可以调用自己,然后通过分支,如果字符串是空,那么返回空,否则我们将字符串进行切片,除去第一个字符其他全部反转,然后将第一个字符放在反转好的字符后面,实现整体的反转。
- 斐波那契数列
def f(n):
if n==1 or n==2:
return 1
else:
return f(n-1) +f(n-2)
- 1
- 2
- 3
- 4
- 5
这个很简单,直接通过定义写出来就好了
领会:递归是一种思维,而我们将这种思维交给计算机完成时,我们只需要将问题拆分成 n 和 n-1 的阶乘的问题,至于这些计算机如何实现,我们不去关心。
递归其实很简单,就是自己调用自己,使用递归可以用很少量的代码实现一些很棘手麻烦的问题。
A:从前有个庙,庙里有个老和尚,老和尚在讲故事
A:在讲什么故事?
A:从前有个庙,庙里有个老和尚,老和尚在讲故事
A:在讲什么故事?
A:……
PyInstaller库基本介绍
将.py源代码转换成无需源代码的可执行文件
(01文件,好处跨平台,无需环境一样执行)
PyInstaller库是第三方库
- 官方网站:http://www.pyinstaller.org
- 第三方库:使用前需要额外安装
- 安装第三方库需要使用pip工具
(cmd命令行) pip install pyinstaller
等它跑完
看到这个说明🆗了,下面还有路径。好,欧克,说说怎么生成可执行文件
我们打开写好的代码的文件夹
进来
这里输入cmd,注意空格,进入我们当前目录的命令行窗口
输入 pyinstaller -F 文件名
我这个文件名是 七段数码管.py
然后回车,稍等……
然后我们看到building EXE successfully,说明已经生成了EXE文件。
返回文件,我们可以看到多出来了很多文件
我们打开dist文件夹,就可以看到打包好的exe文件了。
这相当于01010二进制代码,可跨平台,不需要Python环境,nice
这是库的一些常用命令
递归的魅力
目的:
理解递归,感受递归的魅力
实现效果:
科赫雪花绘制
- 递归思想:函数+分支
- 递归链条:线段的组合
- 递归基例:初始线段
这个就相当于一条直线,平分3份,去掉中间的一份,画一个60°的三角,之后被划分成了四条线,四条都做上一步的3等分话三角,于是我们先用函数完成这个然后用递归,自己调用自己
首先,引入turtle库,递归写函数,给两个参数size长度,n来表示阶数
import turtle as t
def k(size, n):
if n == 0:
t.fd(size)
else:
for angle in [0, 60, -120, 60]:
t.left(angle)
k(size/3, n-1)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
下面定义主函数
def main():
t.setup(600,600)
t.penup()
t.goto(-210, 130)
t.pendown()
t.pensize(1)
n = 3
k(400, n)
t.hideturtle()
input()
main()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
input()使画完不会退出程序,好好欣赏
但是我们发现结果好像没有那个效果,想要实现雪花的效果,❄,也很简单,只要让海龟旋转3次,实现180°等边三角即可实现
完整代码:
import turtle as t
def k(size, n):
if n == 0:
t.fd(size)
else:
for angle in [0, 60, -120, 60]:
t.left(angle)
k(size/3, n-1)
def main():
t.setup(600,600)
t.penup()
t.goto(-210, 130)
t.pendown()
t.pensize(1)
n = 3
k(400, n)
t.right(120)
k(400, n)
t.right(120)
k(400, n)
t.hideturtle()
input()
main()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
最后给我们的代码打包,可以发给小伙伴。哈哈哈
图标这里要用 .ico格式的文件,可以在网上找一个转一下格式就🆗了
输入以下命令
打包完成
Perfect
自己想要什么,不是别人期望你要什么 Bye~~~
文章来源: blog.csdn.net,作者:周棋洛ყ ᥱ ᥉,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/m0_53321320/article/details/118355457
- 点赞
- 收藏
- 关注作者
评论(0)