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, 0for i in range(n):scoreA, scoreB = simOneGame(probA, probB)if scoreA > scoreB:winsA += 1else:winsB += 1return winsA, winsB# 判断比赛结束条件
def gameOver(a, b):return a == 15 or b == 15# 模拟n次单局比赛=模拟n局比赛
def simOneGame(probA, probB):scoreA, scoreB = 0, 0serving = "A"while not gameOver(scoreA, scoreB):if serving == "A":if random() < probA:scoreA += 1else:serving = "B"else:if random() < probB:scoreB += 1else:serving = "A"return scoreA, scoreB# 打印结果模块
def printSummary(winsA, winsB):n = winsA + winsBprint("竞技分析开始,共模拟{}场比赛".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能力值与比赛场次NwinsA, 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 1else: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 的背包,这个商店⼀共有 个商品。问题在于,你最多只能拿 W kg 的东西,其中 wivi 分别表示第 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 = 4def knapsack():for w in range(W+1):cache[get_key(0,w)] = 0for i in items:cache[get_key(i,0)] = 0for 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程序设计思想相关推荐

  1. Python学习宝典官方推荐 |Python技能树测评

    Python技能树测评 背景 详细介绍 结语 背景 对于一个Python小白来说,能有一个板块分类,覆盖知识面广且讲解清晰的学习网站是一件极其幸运的事情.如今,只要你想到的东西,就会有人做出来,比如P ...

  2. Python 技能树测评

    python技能树是CSDN提供的系统化,面向实战的学习环境. 优势: 首先,python技能树界面非常简洁,没有华而不实的东西,给人干净舒适的感觉. 进一步看,python技能树分为很多个板块,共分 ...

  3. 你离Python大神就差这课树了!建议收藏|Python技能树测评

    评测目录 一.技能树是什么? 二.技能树长什么样? 三.技能树该怎样学习? 四.技能树还能有哪些改进? 五.对技能树的总结! 一.技能树是什么? 技能树是CSDN提供的系统化,面向实战的学习环境. 它 ...

  4. [Python3]Python面向对象的程序设计

    [Python3]Python面向对象的程序设计 一.面向对象的程序设计的由来 1.第一阶段:面向机器,1940年以前 最早的程序设计都是采用机器语言来编写的,直接使用二进制码来表示机器能够识别和执行 ...

  5. Python大学计算机程序设计-通讯录管理系统

    摘   要 通讯录是每一款手机必备的一个应用,它拥有的功能非常简单,大致有添加联系人,修改联系人信息,删除联系人,查找联系人等功能,本次课程设计我使用python和python中丰富的第三方库.在通讯 ...

  6. Python技能树的测评和CSDN Markdown编辑器的测评

    前言 Python作为现在最受欢迎的程序设计语言之一,为广大用户所使用.为了方便大家学习,CSDN也推出了相应的Python技能树.近年来,计算机互联网飞速发展,而作为一个小白,想要顺应时代的浪潮,学 ...

  7. Python技能树及Markdown编辑器的测评

    目录 前言 一.Python技能树测评 1.Python技能树的内容 小类中包括了四个方面,参考资料.练习题.交流与讨论.笔记 参考资料 练习题 交流与讨论 最后的笔记板块 2.技能树需要改进的地方 ...

  8. 20212313 吴剑标 Python技能树及CSDN MarkDown编辑器测评

    Python技能树及CSDN MarkDown编辑器测评 课程:<Python程序设计> 班级:2123 姓名:吴剑标 学号:20212313 实验教师:王志强 实验日期:2022年4月1 ...

  9. 学Python不知从何下手?Python技能树助力一臂之力|Python技能树测评

    一.前言 无论是初学Python的小伙伴,还是学过一段时间有一定经验的小伙伴或多或少都会有这样的疑惑: 看着大家都说Python好学,好就业,可到底该怎么学,学到什么程度才能去找工作呢? 我想学Pyt ...

  10. 《正规军的Python进阶之路|Python技能树测评》

    通过<Python技能树测评>判断自己在哪个级别: Python技能树测评[https://bbs.csdn.net/skill/python] 完整的[Python]学习体系,给你正规军 ...

最新文章

  1. 在leangoo里怎么复制列表,删除列表,插入列表?
  2. Call to undefined function mysql_connect()
  3. 白话Elasticsearch15-深度探秘搜索技术之使用copy_to定制组合field解决cross-fields搜索弊端
  4. Oracle实例迁移_真实场景实操
  5. 3G 资费 流量套餐
  6. C++新手入门学习笔记(跟着敲)
  7. Mac安装IDA后各版本android_server
  8. 【语音去噪】基于matlab GUI LMS+RLS语音去噪【含Matlab源码 528期】
  9. MySQL 安装 [mysql-5.6.37]
  10. 用系统自带的SSH实现两台linux密钥认证访问
  11. Ubuntu16 下载软件Aria2 全局配置方法(最全组合)
  12. @import ‘./common/stylus/mixins.styl‘引起的一系列错误
  13. win7关机快捷键_150个常用的电脑快捷键,你都知道算我输
  14. 保护水资源公益网站html,保护水资源公益广告词
  15. 定制石墨烯水溶液-齐岳生物
  16. ElasticSearch简单使用
  17. 利用BrainTree自定义UI绑定信用卡及Paypal
  18. 从软件工程师到一个愤青IT猎头的经历
  19. GSoC: GitHub Checks API 项目第一阶段总结
  20. 生成在线图片地址,用于测试

热门文章

  1. 苹果电子邮件怎么注册_电子邮件地址怎么写
  2. 用gin+xorm+docker编写Online Judge后端
  3. 公共场合的wifi 靠不住
  4. 项目实施中的风险控制与管理
  5. 注册Heroku账户
  6. 计算机推免资源(不定期更新)
  7. 用python计算工资工资_薪资计算-Python,薪水,python
  8. 全基因组水平分泌蛋白鉴定
  9. wpl计算方法_用于计算加权路径长度(WPL)的C ++二叉树算法
  10. 《活法》 -豆瓣评分8.4