一起聊聊python程序设计思想
本篇文章给大家带来了关于python的相关知识,其中主要整理了程序设计思想的相关问题,Python是一种面向对象oop(Object Oriented Programming)的脚本语言,编程思想的核心就是理解功能逻辑,下面一起来看一下,希望对大家有帮助。
推荐学习: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 >>>
推荐学习:python
以上是一起聊聊python程序设计思想的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

MySQL 有免费的社区版和收费的企业版。社区版可免费使用和修改,但支持有限,适合稳定性要求不高、技术能力强的应用。企业版提供全面商业支持,适合需要稳定可靠、高性能数据库且愿意为支持买单的应用。选择版本时考虑的因素包括应用关键性、预算和技术技能。没有完美的选项,只有最合适的方案,需根据具体情况谨慎选择。

文章介绍了MySQL数据库的上手操作。首先,需安装MySQL客户端,如MySQLWorkbench或命令行客户端。1.使用mysql-uroot-p命令连接服务器,并使用root账户密码登录;2.使用CREATEDATABASE创建数据库,USE选择数据库;3.使用CREATETABLE创建表,定义字段及数据类型;4.使用INSERTINTO插入数据,SELECT查询数据,UPDATE更新数据,DELETE删除数据。熟练掌握这些步骤,并学习处理常见问题和优化数据库性能,才能高效使用MySQL。

MySQL安装失败的原因主要有:1.权限问题,需以管理员身份运行或使用sudo命令;2.依赖项缺失,需安装相关开发包;3.端口冲突,需关闭占用3306端口的程序或修改配置文件;4.安装包损坏,需重新下载并验证完整性;5.环境变量配置错误,需根据操作系统正确配置环境变量。解决这些问题,仔细检查每个步骤,就能顺利安装MySQL。

MySQL下载文件损坏,咋整?哎,下载个MySQL都能遇到文件损坏,这年头真是不容易啊!这篇文章就来聊聊怎么解决这个问题,让大家少走弯路。读完之后,你不仅能修复损坏的MySQL安装包,还能对下载和安装过程有更深入的理解,避免以后再踩坑。先说说为啥下载文件会损坏这原因可多了去了,网络问题是罪魁祸首,下载过程中断、网络不稳定都可能导致文件损坏。还有就是下载源本身的问题,服务器文件本身就坏了,你下载下来当然也是坏的。另外,一些杀毒软件过度“热情”的扫描也可能造成文件损坏。诊断问题:确定文件是否真的损坏

MySQL拒启动?别慌,咱来排查!很多朋友安装完MySQL后,发现服务死活启动不了,心里那个急啊!别急,这篇文章带你从容应对,揪出幕后黑手!读完后,你不仅能解决这个问题,还能提升对MySQL服务的理解,以及排查问题的思路,成为一名更强大的数据库管理员!MySQL服务启动失败,原因五花八门,从简单的配置错误到复杂的系统问题都有可能。咱们先从最常见的几个方面入手。基础知识:服务启动流程简述MySQL服务启动,简单来说,就是操作系统加载MySQL相关的文件,然后启动MySQL守护进程。这其中涉及到配置

MySQL 可在无需网络连接的情况下运行,进行基本的数据存储和管理。但是,对于与其他系统交互、远程访问或使用高级功能(如复制和集群)的情况,则需要网络连接。此外,安全措施(如防火墙)、性能优化(选择合适的网络连接)和数据备份对于连接到互联网的 MySQL 数据库至关重要。

MySQL数据库性能优化指南在资源密集型应用中,MySQL数据库扮演着至关重要的角色,负责管理海量事务。然而,随着应用规模的扩大,数据库性能瓶颈往往成为制约因素。本文将探讨一系列行之有效的MySQL性能优化策略,确保您的应用在高负载下依然保持高效响应。我们将结合实际案例,深入讲解索引、查询优化、数据库设计以及缓存等关键技术。1.数据库架构设计优化合理的数据库架构是MySQL性能优化的基石。以下是一些核心原则:选择合适的数据类型选择最小的、符合需求的数据类型,既能节省存储空间,又能提升数据处理速度

MySQL性能优化需从安装配置、索引及查询优化、监控与调优三个方面入手。1.安装后需根据服务器配置调整my.cnf文件,例如innodb_buffer_pool_size参数,并关闭query_cache_size;2.创建合适的索引,避免索引过多,并优化查询语句,例如使用EXPLAIN命令分析执行计划;3.利用MySQL自带监控工具(SHOWPROCESSLIST,SHOWSTATUS)监控数据库运行状况,定期备份和整理数据库。通过这些步骤,持续优化,才能提升MySQL数据库性能。
