python之函数和代码复用笔记
这一章的内容有点多,我也尝试一下这个目录是怎么用的,,哈哈
@TOC
一,前言
看小说都会有一个前言,我也整一个。
这节内容很多,很多,很多····对我来说也有点难理解。两天看完这块内容,比较赶时间,看的迷迷糊糊。
看目录函数部分比代码部分多,但是我个人感觉函数部分相对容易一些。代码部分仿佛是听天书!
二,函数的定义与使用
1,函数的理解与定义
函数是一段代码的体现,
函数是一段具有特定功能、可重用的语句。
函数是一种功能的体现,一般函数表达特定功能。
两个作用:降低编程难度和代码复用
这段功能可以多次使用,可以多次使用你就不用重复打好几段代码是不是就容易了。
记得上次我画机械猫,我要经常抬起画笔,goto定位,放下画笔,做了一天,就是重复这个动作好几遍。现在再一次审视,是不是就可以节约一点时间,大部分时间。
2,函数的使用及调用过程
听起来高大上,应该怎么用呢?
(1)函数的使用
def <函数名>(<参数(0个或多个)>):
<函数体>
return <返回值>
我们就一我是说的机械猫举个栗子
import turtle
def cat(n, m):
turtle.penup()
turtle.goto(n, m)
turtle.pendown()
turtle.fd(50)
但是呢。。。发现了吗没有返回值return,大佬自然懂,小白接着看!
还记得这个公式吗:y = f(x)中学阶段学的
函数定义时,所指的参数是一种占位符。
函数定义后,如果不经过调用,不会被执行。
函数定义时,参数是输入,函数体是处理,结果是输出(IPO)
(2)函数的调用过程
还是那个机械猫
import turtle
def cat(n, m):
turtle.penup()
turtle.goto(n, m)
turtle.pendown()
turtle.fd(50)
cat(10,100)
函数的调用
cat(10,100)
调用时要给出实际参数
实际参数代替定义中的参数
调用后得到返回值
做了个图
怎么看呢,听我分解。
cat(20, 100)作为实际参数,于是开始自动执行,程序会自动代替我们的参数(n, m)函数体开始解析代码,之后返回。
3,函数的参数传递
函数可以有参数,也可以没有参数,但是括号必须保留
def <函数名>():
<函数体>
return <返回值>
函数定义时,可以为某个参数定义一个值,构成可选参数
def <函数名>(<非可选参数>, <可选参数>):
<函数体>
return <返回值>
机械猫又来了
还是那个机械猫
import turtle
def cat(n, m=100):
turtle.penup()
turtle.goto(n, m)
turtle.pendown()
turtle.fd(50)
#调用
>>>cat(50)
>>>cat(50, 100)#他俩的位置相同
函数定义时可以设定可变参数的数量,就是不确定参数的数量
def <函数名>(<非可选参数>, *b):
<函数体>
return <返回值>
这个就不可以把机械猫当例子了
定义一个求和函数
咦!这是为什么,我还是从前那个少年,技术没有发生一丝改变,我还是多设定参数吧。
函数调用时,可以参数可以按照位置或名称方式传递
还是机械猫
#调用函数
>>>cat(50, 100)#以位置方式调用
>>>cat(n=50, m=100)#以方式调用
4,函数的返回值
函数可以返回0个或多个结果,
return保留字来传递f返回值
函数可以有返回值、也可以没有;所以return保留字也是可有可无
return可以返回0个值,也可以返回多个值
5,局部变量和全局变量
函数里的变量可不可以和全局中的变量一致,一致会怎么样,
先说一下两个名词局部变量、全局变量,
局部变量:函数内部的变量
全局变量:代码中的变量
局部变量是函数内部的占位符,与全局变量可以同名但是作用不用 。
运算结束后局部变量会被释放。
可以用global保留字在函数内部来使用全局变量
奇怪,这又是怎么回事,总而言之global保留字介绍是没错,估计我还不会书写格式
使用规则
在基本数据类型中无论是否重名,局部变量和全局变量不同。
可以通过global保留字在函数内部声明全局变量
在基本组合类型中,如果局部变量未真实创建,则是全局变量
6,lambda函数
lambda函数是一种匿名函数,也就是没有名字
用lambda保留字定义,返回值就是函数的名字
lambda用于定义简单、可以在意行表达的函数
<函数名> = lambda <参数>:<表达式>
就像
>>>f = lambda x,y,z:x*y+z
>>>a = f(1, 2, 3)
>>>print(a)
5
是不是像if-else二分支语句的简约形式
三,代码复用与函数递归
1,函数复用与模块化设计
(1)代码复用
把代码当成一种资源进行抽象
代码资源化:程序代码是一种用来表示计算的“资源”
程序抽象化:使用函数等方法对代码赋予更高级别的定义
代码复用:同一份代码在需要时可以被重复使用
我就明白了第四句,一段一段的代码可以重复使用。
个人猜测第二句第三句的意思是说把代码当作资源,可以实现各种我想要的,比如我的机械猫绘制。想要实现这些,有资源是远远不够的,还要对代码上使用函数、方法。pow()
函数、.format()
方法 等等·,这样就可以实现。
函数和对象是代码复用的主要形式
函数:将代码名命,在代码层面建立了初步抽象。
对象:属性和方法,<a>.<b>
和<a>.<b>()
在函数之上再次组织 进行抽象
(2)模块化设计
分而治之
通过函数或对象封装将程序划分为模块及模块间的表达
具体包括:主程序、子程序和子程序间的关系
分而治之:一种分而治之、分层抽象、体系化的设计思想
紧耦合、松耦合
紧耦合:两个部分之间交流很多,无法独立存在。
松耦合:两个部分之间交流很少,可以独立存在
模块内部紧耦合、模块之间松耦合
怎么理解
还是以我的机械猫为例吧
一个好的程序一定有很多功能 ,程序也有艺术,写出一段漂亮的代码一定很有成就感。就这两点而言我就喜欢一个功能一段函数,或是一个空格,逻辑清晰。这里指的应该肯定是函数。一段函数与一段的函数是否强烈,我离不开你或者说你在不在无所谓。这时就出现了紧耦合、松耦合。随之他们的概念也就此
我就是慢慢这样理解的。我感觉我理解的至少有一半是对的。
2,函数递归的理解
定义:函数定义中调用自身的方式
两个关键特征
链条:计算过程中存在递归链条
基例:存在一个或多个不需要再次递归的基例
类似数学的归纳法
证明当N取第一个值N1命题成立?
假设当Nr时命题成立,证明N=Nr+1命题也成立
递归是数学归纳法思维的体现
怎么说
数学归纳法对我有点陌生,不好理解
程序之间计算的过程,上一步与下一步、下一步与下下一步之间的互动,他们就构成了链条
基例,最基础的实例,就像当y=f(x)中x=0时y也=0
可能也不是
3,函数递归的调用过程
递归的实现
函数+分支语句
递归本事是一个函数,需要函数定义方式描述
函数内部采用分支语句对输入参数进行判断
链条和基例分别编写对应代码
递归的调用过程
1,
2,
这个流程怎么解释呢
看第一张图先调用函数fact (5)就是n=5,之后开始执行,判断n是否为0,因为不是0则不会返回1,。而是开辟一段新的内存运行fact(n-1)=4,n=4的值,以此类推,直到n=0时,接下来看第二张图,n=0时返回1,在第五步的n=1,则11=1;在第四步,n=2,则12=2
以此类推,得出120
4,函数递归实例解析
我们一起聊一聊汉诺塔的问题
(1)问题简述
就是说在你前面有三根柱子,在柱子以上由大到小排列的N个圆盘,问题来了,把柱子一上的圆盘移动到柱子三上需要多少步?当然,,有一个圆盘、两个圆盘、三个圆盘这种情况就比较好解决,动手能力比较强的小朋友也可解决,一下子给你一百个呢,慢慢弄,也行;但是用程序呢?
(2)上代码之代码实现
count = 0#计算需要的步骤
def hanoi(n, src, dst, mid):#此处参数分别是:圆盘数量;源柱子;目标柱子;辅助柱子
global count
if `n == 1`:
print("{}:{}->{}".format(1,src,dst))
count += 1
else:
hanoi(n-1, src, mid, dst)
print("{}:{}->{}".format(n,src,dst))
count += 1
hanoi(n-1, mid, dst, src)
调用这段代码
hanoi(5,"源柱子A","目标柱子C","辅助柱子B")
print(count)
(3)代码分析
首先这段代码符合函数递归,因为有函数还有分支语句、基例、链条。
由if n == 1:
判断当源柱子只有1个柱子,直接移动到目标柱子。count
步骤一步到位。
当不是一根柱子时,此时需要把n-1圆盘子移动到辅助柱子,思考一下,5个圆盘中有4个圆盘必须有个过渡,放到辅助柱子上,是不是?因此hanoi()
函数参数位置发生了变化。计算出步骤
那好,辅助柱子上的圆盘是不是就不用管了,No!移动到目标柱子,因此hanoi()
函数参数位置有一次发生变化。
就这样结束了。
四,总结
这部分内容虽然有点多,但是在告诉我们如何写成高质量的代码。使你的代码一目了然。但是写出高质量代码还是有很多知识在背后支撑,还是、紧耦合、松耦合····还是尤为重要。
但这里就结束了,这章知识用了四天时间。在前言中我提到了这部分的知识我不太理解 ,我也是反复看视频,在回来写得博客。比开始写有一次加深。在这篇博客中我加了许多个人观点,我自己理解的,如果您有更好的观点,欢迎评论。一群人的学习效率远远大于一个人的学习效率,我是这样觉得。
也不是想让更多人看见,我只是喜欢通过这种方法记笔记,加深印象。我自己是不喜欢写字的,字写得也很丑。当然如果帮到你了,我很荣幸。
哈哈哈嗝