-
2019-06-21 16:05:55
1.面向过程编程
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为目标进行编程,不同于面向对象的是谁在受影响。与面向对象明显的不同就是封装、继承、类。
特性:模块化 流程化
优点:性能比面向对象高, 因为类调用时需要实例化,开销比较大,比较消耗资源;
单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展例如下面这个学生入学的例子:
第一个用户的信息 student_a = { 'name': '小明', 'age': 23, 'gender': '男', # 座右铭 'matto': '人生苦短, 我用python!' } 第二个用户的信息 student_b = { 'name': '小红', 'age': 21, 'gender': '女', # 座右铭 'matto': '合理安排时间,就等于节约时间。' } 第三个用户的信息 student_c = { 'name': '小李', 'age': 26, 'gender': '男', # 座右铭 'matto': '挫折不是惩罚而是学习的机会。' } def roll(studentDict): """ 入学过程封装的函数 :return: """ # 字典的get方法: 如果key值不存在, 直接返回为空; print("正在办理手续".center(20, '*')) print("正在注册用户[%s]信息" %(studentDict.get('name'))) print("用户[%s]正在入学" %(studentDict.get('name'))) print("用户[%s]正在上课" %(studentDict.get('name'))) print("用户[%s]正在自我介绍" %(studentDict.get('name'))) for key, value in studentDict.items(): print(key, ':', value) roll(student_a) roll(student_b) roll(student_c)
上面的代码就是典型的面向过程编程。
面向过程:根据业务逻辑从上到下写代码 。面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑。考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介
绍。而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁。
用我们的现实思维方式该怎么用程序表达呢?这就要用到面向对象的编程思想了。面向对象:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
2. 函数式编程
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
主要思想: 把运算过程尽量写成一系列嵌套的函数调用。
例如:def add(a,b): return a+b def multi(a,b): return a*b print(multi(add(1,2),add(2,3)))
Python 不是也不大可能会成为一种函数式编程语言,但是它支持许多有价值的函数式编程语言构建。也有些表现得像函数式编程机制(如:内建函数 filter()、map()、reduce()),但是从传统上也不能被认为是函数式编程语言的构建。
3.面向对象编程
面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
特性:抽象 封装 继承 多态
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
缺点:性能比面向过程低4.面向过程与面向对象的区别
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。可以拿生活中的实例来理解面向过程与面向对象,例如五子棋。
面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。
如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
更多相关内容 -
23种设计模式详解及编程思想
2021-07-11 19:22:4723种设计模式详解及编程思想 -
【python技能树】python程序设计思想
2022-04-30 16:47:19面向对象是按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。 特性:抽象 ...0 Python编程思想
Python是一种面向对象oop(Object Oriented Programming)的脚本语言。
面向对象是采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。
在面向对象程序设计中,对象包含两个含义,其中一个是数据,另外一个是动作。面向对象的方法把数据和方法组合成一个整体,然后对其进行系统建模。
python编程思想的核心就是理解功能逻辑,如果对解决一个问题的逻辑没有搞清楚,那么你的代码看起来就会非常的紊乱,读起来非常的拗口,所以一旦逻辑清晰,按照模块对功能进行系统编程,那么你的代码设计肯定是漂亮的!!!
1 基本的程序设计模式
任何的程序设计都包含IPO,它们分别代表如下:
-
I:Input 输入,程序的输入
-
P:Process 处理,程序的主要逻辑过程
-
O:Output 输出,程序的输出
因此如果想要通过计算机实现某个功能,那么基本的程序设计模式包含三个部分,如下:
-
确定IPO:明确需要实现功能的输入和输出,以及主要的实现逻辑过程;
-
编写程序:将计算求解的逻辑过程通过编程语言进行设计展示;
-
调试程序:对编写的程序按照逻辑过程进行调试,确保程序按照正确逻辑正确运行。
2 解决复杂问题的有效方法:自顶向下(设计)
2.1 自顶向下-分而治之
如果要实现功能的逻辑比较复杂的时候,就需要对其进行模块化设计,将复杂问题进行分解,转化为多个简单问题,其中简单问题又可以继续分解为更加简单的问题,直到功能逻辑可以通过模块程序设计实现,这也是程序设计的自顶向下特点。总结如下:
- 将一个总问题表达为若干个小问题组成的形式
- 使用同样方法进一步分解小问题
- 直至,小问题可以用计算机简单明了的解决
2.2 举例1:体育竞技分析
2.2.1 程序总体框架
printlnfo() 步骤1:打印程序的介绍性信息
getlnputs() 步骤2:获得程序运行参数:proA, proB, n
simNGames() 步骤3:利用球员A和B的能力值,模拟n局比赛
printSummary() 步骤4:输出球员A和B获胜比赛的场次及概率2.2.2 程序设计
# 导入python资源包 from random import random # 用户体验模块 def printIntro(): print("这个程序模拟两个选手A和B的某种竞技比赛") print("程序运行需要A和B的能力值(以0到1之间的小数表示)") # 获得A和B的能力值与场次模块 def getIntputs(): a = eval(input("请输入A的能力值(0-1):")) b = eval(input("请输入B的能力值(0-1):")) n = eval(input("模拟比赛的场次:")) return a, b, n # 模拟n局比赛模块 def simNGames(n, probA, probB): winsA, winsB = 0, 0 for i in range(n): scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB # 判断比赛结束条件 def gameOver(a, b): return a == 15 or b == 15 # 模拟n次单局比赛=模拟n局比赛 def simOneGame(probA, probB): scoreA, scoreB = 0, 0 serving = "A" while not gameOver(scoreA, scoreB): if serving == "A": if random() < probA: scoreA += 1 else: serving = "B" else: if random() < probB: scoreB += 1 else: serving = "A" return scoreA, scoreB # 打印结果模块 def printSummary(winsA, winsB): n = winsA + winsB print("竞技分析开始,共模拟{}场比赛".format(n)) print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA / n)) print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB / n)) def main(): printIntro() probA, probB, n = getIntputs() # 获得用户A、B能力值与比赛场次N winsA, winsB = simNGames(n, probA, probB) # 获得A与B的场次 printSummary(winsA, winsB) # 返回A与B的结果 main()
2.2.3 测试结果
2.3 举例2:的斐波那契数列
自顶向下的方式其实就是使用递归来求解子问题,最终解只需要调用递归式,子问题逐步往下层递归的求解。
程序设计:
cache = {} def fib(number): if number in cache: return cache[number] if number == 0 or number == 1: return 1 else: cache[number] = fib(number - 1) + fib(number - 2) return cache[number] if __name__ == '__main__': print(fib(35))
运行结果:
14930352 >>>
理解自顶向下的设计思维:分而治之
3 逐步组建复杂系统的有效测试方法:自底向上(执行)
3.1 自底向上-模块化集成
自底向上(执行)就是一种逐步组建复杂系统的有效测试方法。首先将需要解决的问题分为各个三元进行测试,接着按照自顶向下相反的路径进行操作,然后对各个单元进行逐步组装,直至系统各部分以组装的思路都经过测试和验证。
理解自底向上的执行思维:模块化集成
自底向上分析思想:
- 任何时候栈中符号串和剩余符号串组成一个句型,当句柄出现在栈顶符号串中时,就用该句柄进行归约,这样一直归约到输入串只剩结束符、栈中符号只剩下开始符号,此时认为输入符号串是文法的句子,否则报错。
自底向上是⼀种求解动态规划问题的方法,它不使用递归式,而是直接使用循环来计算所有可能的结果,往上层逐渐累加子问题的解。在求解子问题的最优解的同时,也相当于是在求解整个问题的最优解。其中最难的部分是找到求解最终问题的递归关系式,或者说状态转移方程。
3.2 举例:0-1背包问题
3.2.1 问题描述
你现在想买⼀大堆算法书,有一个容量为 V 的背包,这个商店⼀共有 n 个商品。问题在于,你最多只能拿 W kg 的东西,其中 wi 和 vi 分别表示第 i 个商品的重量和价值。最终的目标就是在能拿的下的情况下,获得最大价值,求解哪些物品可以放进背包。
对于每⼀个商品你有两个选择:拿或者不拿。
3.2.2 自底向上分析
⾸先要做的就是要找到“子问题”是什么。通过分析发现:每次背包新装进⼀个物品就可以把剩余的承重能力作为⼀个新的背包来求解,⼀直递推到承重为0的背包问题。
用 m[i,w] 表示偷到商品的总价值,其中 i 表示⼀共多少个商品,w 表示总重量,所以求解 m[i,w]就是子问题,那么看到某⼀个商品i的时候,如何决定是不是要装进背包,需要考虑以下:
- 该物品的重量大于背包的总重量,不考虑,换下⼀个商品;
- 该商品的重量小于背包的总重量,那么尝试把它装进去,如果装不下就把其他东西换出来,看看装进去后的总价值是不是更高了,否则还是按照之前的装法;
- 极端情况,所有的物品都装不下或者背包的承重能力为0,那么总价值都是0;
由以上的分析,可以得出m[i,w]的状态转移方程为:
m[i,w] = max{m[i-1,w], m[i-1,w-wi]+vi}
3.2.3 程序设计
# 循环的⽅式,自底向上求解 cache = {} items = range(1,9) weights = [10,1,5,9,10,7,3,12,5] values = [10,20,30,15,40,6,9,12,18] # 最⼤承重能⼒ W = 4 def knapsack(): for w in range(W+1): cache[get_key(0,w)] = 0 for i in items: cache[get_key(i,0)] = 0 for w in range(W+1): if w >= weights[i]: if cache[get_key(i-1,w-weights[i])] + values[i] > cache[get_key(i-1,w)]: cache[get_key(i,w)] = values[i] + cache[get_key(i-1,w-weights[i])] else: cache[get_key(i,w)] = cache[get_key(i-1,w)] else: cache[get_key(i,w)] = cache[get_key(i-1,w)] return cache[get_key(8,W)] def get_key(i,w): return str(i)+','+str(w) if __name__ == '__main__': # 背包把所有东西都能装进去做假设开始 print(knapsack())
29 >>>
-
-
SQL 编程思想:一切皆关系
2020-12-14 18:54:14在计算机领域有许多伟大的设计理念和思想,例如: 在 Unix 中,一切皆文件。 在面向对象的编程语言中,一切皆对象。 关系数据库同样也有自己的设计思想:在 SQL 中,一切皆关系。 关系模型 关系模型(Relational ... -
伺服电机编程思路.pdf
2019-09-05 18:15:23伺服电机编程思路 -
ARM设计思想与高效C编程
2020-08-13 16:48:13文章主要介绍RISC设计思想,ARM设计思想以及如何进行高效的C编程 -
Java编程思想及设计模式
2019-03-18 01:58:12NULL 博文链接:https://wuhui520.iteye.com/blog/648904 -
C高级编程 基于模块化设计思想的C语言开发
2019-01-23 14:39:47C高级编程 基于模块化设计思想的C语言开发 C高级编程 -
C高级编程 基于模块化设计思想的C语言开发 高清 带书签.pdf
2019-06-20 07:01:35C高级编程 基于模块化设计思想的C语言开发 高清 带书签 -
浅析PHP程序设计中的MVC编程思想
2020-10-25 14:57:27主要介绍了PHP程序设计中的MVC编程思想,对于深入理解MVC程序设计思想有一定的帮助,需要的朋友可以参考下 -
基于AVR单片机的大棚室内温度无线数据采集的设计.zip_AVR单片机 温度采集 无线_avr_硬件设计_编程思路_软件...
2022-07-14 10:18:00采用AVR单片机实现对无线温度数据采集存储和处理,提供硬件方案及软件编程思路。 -
Scala编程思想
2018-12-17 16:05:51Scala是一门多范式的编程语言,一种类似java的编程语言 [1] ,设计初衷是实现可伸缩的语言 [2] 、并集成面向对象编程和函数式编程的各种特性。 -
C高级编程:基于模块化设计思想的C语言开发
2018-01-14 15:11:14C语言是一个“古老”的编程工具。在嵌入式系统、自控系统及计算机底层操作系统、数据处理中间件等系统开发中仍然是优先...如果你想有效地使用C语言,在系统设计中灵活地应用模块化设计思想,本书是一个很不错的参考。 -
C++编程思想源码
2018-06-25 23:23:18《c++编程思想(两卷合订本)》曾荣获美国《软件开发》杂志评选的1996年jolt生产力大奖,中文版自2000年推出以来,经久不衰,获得了读者的充分肯定和高度评价。 《c++编程思想(两卷合订本)》的第1卷是在第1版的... -
C#编程思想.pdf
2019-07-16 16:39:53C# 是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的。 C# 是由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的。 C# 是专为公共语言基础结构(CLI)... -
C-C++语言趣味程序设计编程百例精解.rar_例题讲解_编程思路_趣味C程序
2022-07-14 12:41:13几个C/C++的趣味编程的例题讲解,思路清晰,可读性较强 -
《冒号课堂——编程范式与OOP思想》PDF 下载
2019-01-06 10:41:06本书是以编程范式和抽象机制为主线阐述编程设计思想的图书。它以编程语言为形、以编程范式为神、以抽象机制为本,采用课堂对话的形式讲述编程要义,深入浅出、寓教于乐。其中编程范式以OOP为重点,编程语言以C++、... -
剖析C++的面向对象编程思想
2021-01-20 05:43:12面向对象编程(Object Oriented Programming,OOP,面向对象程序设计) 的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一个事物在整个解决问题的步骤中的行为。... -
少走弯路!从裸机编程到嵌入式Linux编程思想的转变
2020-07-27 23:17:03笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为基于Linux操作... -
设计思想与编程艺术
2013-05-15 17:21:25设计思想与编程艺术 设计思想与编程艺术 -
四种FPGA设计思想.pdf
2020-07-02 09:15:08FPGA与CPU编程有很大不同,但在编程思想上基本上可以借鉴C语言编程。对于FPGA的不同功能块,相互之间时并行执行的,互不干扰;但现实中,实现一个较小的完整的功能块,必然是顺序操作的。 先介绍下主流设计方式。... -
Java编程思想(第4版)
2019-03-03 21:03:48java经典名著,真正第四版中文完整高清PDF版 ,有完整的书籍目录,内容文字可复制,非常适合java学习和编程,豆瓣评分9.1分。是高等院校讲授面向对象程序设计语言以及Java语言的绝佳教材和参考书。适合春招秋招的java... -
嵌入式软件设计及编程思想.pptx
2020-04-13 06:33:06单片机软件设计及编程思想;一个嵌入式设计系统一般包含;一个嵌入式设计系统一般包含;设计原则;功能模块分类 编程时分文件处理一般一个驱动一个功能模块一个文件 原则 1.一个驱动芯片相应的操作封装到一个文件中 2.一... -
中文编程完整软件实例编程解析之工程设计流水管理系统
2021-06-10 12:17:34通过对完整软件实例(工程设计流水管理系统)编程讲解,让学员熟悉完整软件布局架构及开发思路。比如从界面布局、登录验证、软件注册程序、到软件发布等知识点,贯穿知识点间联系,提升编程整合能力。 -
C语言面向对象编程与设计模式
2017-07-28 14:44:25C语言面向对象编程与设计模式 -
嵌入式软件设计及编程思想PPT学习教案.pptx
2021-10-05 09:25:12嵌入式软件设计及编程思想PPT学习教案.pptx -
C++编程思想课后编程答案
2019-01-10 16:12:30C++编程思想是C++编程者进阶的必读书籍,其内容注重于软件设计和架构思想而非仅仅停留在编程语法方面。这个课后习题的编程答案能够对学习者有很好的辅助作用,良心推荐请放心下载。 -
C#编程思想
2014-05-20 16:13:20编程思想书籍,指导软件工程的开展,一个好的架构设计是根本!