3、编程习惯养成与思维
(1)防御性编程与备注
防御性编程的基本思想
假设A,如果您从用户那里获得输入他们不一定会提供您所要求的输入,因此如果您要求的是正数,请不要指望他们给你一个
然后是假设B,如果您正在使用一个由不完美的程序员编写的程序,也许是我,或者您自己,那个程序中可能有错误,所以您编写程序的假设是不仅用户可能会犯错,程序的其他部分也可能会犯错,并且您只是在假设您宁愿发现某些事情出错,然后让它出错的假设下进行了许多不同的测试,不知道问题的来源
但记住的主要事情是:人们是愚蠢的一般原则,并会犯错
因此您编写程序的目的是避免在犯这些错误时发生灾难
要养成编写防御性编码的习惯
防御性编程样例:
假设我想找到某个整数的所有除数,我想弄清楚所有的除数是什么,选择了在循环中间打印出来。
x = 10
i = 1
while i<x:
if x%i == 0:
print ('divisor',i)
i= i+1
(2)科学分析思维
迭代问题逻辑
1、选择一个可以计数的变量(Choose variable that “count”)
2、在外部需要初始化它(Initiative outside the loop)
3、需要设置正确的最终测试(Setup and test)
4、构建代码块(Conctract block)
5、当结束后,你知道,当我完成后,我该怎么做(What to do when done)
代码效率
因为目前需要解决问题的增长速度高于电脑计算速度的增长
在时间、空间恒定的情况下,需要考虑的是
1、计算需要多少内存
2、输入大小的函数所需的基本步骤数量是多少
表现 | 所需步骤与内存 |
---|---|
Best | min |
Worst | max |
Expected | avg |
(3)图灵完备语言
图灵完备语言包含三部分
1、数据:数组,字符串,布尔
2、操作:数字运算,如+,-,and/or等
3、命令:赋值、输入/输出、条件/分支、循环机制
有了这三部分,我们就可以做任何事情,在基础部分,我们都有接触过。能做什么事情呢?包括自然语言学习,图像识别,语音识别等
(4)Debugger
Debugging的思路,debugging的目标是朝着没有错误的程序进行运行,做这个最好的两个工具是打印和阅读代码(带着怀疑的眼光看)
首先要发现产生问题的最小输入,然后进行打印测试,采用二分法进行测试,每次是在代码中进行打印,每次测试可以排除一半的代码块,并自己先预测一下结果会是什么,耐心冷静的减小搜索出现问题的地方
还可以请教别人,在请教别人的时候,自己会把问题逻辑整理清楚再去问,有时候在问的时候,问了一下,自己就会恍然大悟,原来是这样
(5)抽象化、模块化、封装代码
这部分是为了解决阅读代码的问题,事实上几十万行的代码看的时候很难去理解,会把代码进行分成几个模块,一个模块负责对应相关的操作,也方便后续的debugger,和阅读
例如机器学习中会分为数据清洗、训练、测试,三个大模块
(6)如何知道运行代码的时间
经过基础部分的学习大家已经了解到运行不同的代码是需要不一样的时间的
影响代码运行时间会受到,1、机器性能。2、使用的语言。3、数据量。等
其实这些并不能为我们预估出运行代码的时间,因为这些都有很多变量,其实唯一不变的是运行这个程序需要多少步,
举个例子,魔方复原,在复原魔方的时候,如果一开始不知道怎么复原,没有思惟逻辑进行复原,可能需要的时间需要很久
但是通过查阅相关资料和思考,可以分为几个步骤,就可以顺利复原
所以运行代码的时间在与你知道你的代码需要运行多少步,思考的逻辑决定了你的运行代码时间
(7)如何修复他人的代码
在编程的时候,我们常常会借鉴别人的代码,但会碰到一个问题,并不是每一份代码都可以完整复现,会受到版本、运行环境等的影响,所以要修复他人的代码,提供一个思路
是要有一个系统性的思考
1、保持记录你尝试的方式、修改的地方
2、考虑重新假设
3、调试代码
4、放下自己的骄傲,寻找他人的帮助
5、离开一段时间再回来修复