本周是培训的第二周,依旧是一大波基础知识点来袭,不过课后习题的难度较上周来讲有所增加,可谓是真正进入了编码阶段,其中笔者认为需要注意的知识要点如下:
1. 函数
概念:为了减少重复代码的编写,我们可以把程序中相对独立的功能模块抽取出来,以便将来可以重复地使用这些功能模块, Python中的函数就是代表了这样的功能模块。
小知识点:
1)函数的递归调用(最多998次) ---> 由收敛条件(让递归在有限的次数完成或者进行回溯)及递归公式两个关键要素构成,几乎可以用循环完成的任务用递归亦可,但是在处理阶乘和累加等大计算量任务时建议采用循环来完成。
2)文档注释的查看,选中函数,Ctrl + Q 即可查看该函数的文档注释,平时有余力的情况下建议勤写文档注释,方便自己日后回忆及他人使用。
3)python的函数与其它语言的函数一个最大不同点在于可变参数(*args)的使用,它使得函数的参数个数可以有0个或任意多个,灵活便捷。
4)在编程的过程中, 尽量避免全局变量的使用,用函数括起来 (迪米特法则:最少知道原则,代码最好不要和其他的代码直接建立关系),在程序中,变量的作用域严格遵守“LEGB”顺序( L:局部作用域 E:嵌套作用域 G:全局作用域 B:内置作用域 ),直接在函数内操作全局变量加关键字global,操作外嵌函数变量加关键字nonlocal。
5)如果函数定义冲突了,后定义的将覆盖先定义的。
2. 模块
导入模块的顺序:内置的放在最前面 ,三方的居中,自己编写的放最后。同种类型的按字母表顺序排列。
注意:
1)如果模块冲突了,依旧是后导入的覆盖先导入的。
2)为了避免自定义模块在调用的过程中涉及其中可执行代码的运行,将可 执行代码放在(if __name__ == "__main__":)之下,如此一来,只有直接运行时该部分语句才被执行( __name__: python内置的隐含变量,代表了模块的名字,直接执行时为__main__,其他地方调用执行时为模块名)
3. 字符串
主要是一些字符串的常规操作,遇到不懂的现查现用即可。
4. 列表(容器之一)
list - 列表,要点:
1)不要直接对原列表进行操作,建议使用副本,保持原件的完整性。
2)list构造器和生成器的掌握(前者省时费空间,后者省空间费时,具体应用视具体情况而定)。
2)循环遍历时使用enumerate()既可以拿到索引又可以拿到值,尤其适合对嵌套列表的指定元素进行操作。
5. 字典(容器之二)
dict - 字典,使用键值对的方式进行存储,无序,不支持下标操作,可通过键来查找对应的值。同时,字典查找数据要比列表快。
6. 元组(容器之三)
tuple - 元组, 只读,有序,不能改写其中的元素(设计理念:不变模式),如果想放入不同的数据类型,且保证不变,建议用元组,否则建议用列表。同时,创建元组的时间比列表少一个数量级,占用的空间也更小。
7. 集合(容器之四)
set - 集合,不允许重复元素出现,无序,不支持下标操作。注意在使用 pop()进行删除操作时会随机删除元素,因为无法输入下标,所以和列表的pop()操作不一样。列表、集合、元组之间可以相互转换,转set时会去除重复元素。
8. 对象与类
对象
1)一切皆为对象。
2)对象都有属性(静态特征)和行为(动态特征)。
3)每个对象都是独一无二的。
4)对象一定会归属到某个类(类:抽象概念 对象:具体概念)。
类
1)对象的蓝图和模板,有了类就可以创建对象。
2)定义类需要做两件事:数据抽象(抽取对象共同的静态特征,即属性 | 找名词)和行为抽象(抽取对象共同的动态特征,即方法 | 找动词),我们定义一个类实际上是把数据和操作数据的函数绑定在一起,形成一个逻辑上的整体,这个整体就叫对象,将来任何时候想使用这种对象时直接复用这个类就可以了。
3)自己定义的类,每个单词首字母大写。建议使用驼峰命名法。
面向对象的过程
1)把一大堆对象共同的特征和行为总结归纳成类。
2) 生成对象。
3) 给对象传递信号去做事。
除了基础知识的学习外,本周的收获还在于通过持续不断的烧脑练习来提升了自己考虑问题的能力,bug-debug过程对耐心的培养。从猜拳,猜数字,井字棋等几个简单的小游戏,到周末作业奥特曼打小怪兽,线段类的创建,明显感觉到任务难度的提升。这里不妨对几项周末作业的要点进行分享:
1)不给clock构造器传入时间,直接用系统时间
要点:系统时间的获取(时、分、秒)
import time
hour = time.localtime().tm_hour # 时
minute = time.localtime().tm_min # 分
second = time.localtime().tm_sec # 秒
2)倒计时时钟,时间结束 --> 提示时间到
要点:倒计时的处理
# 结束情形 00:00:00
if self._second == 0 and self._minute == 0 and self._hour == 0:
return xxx
if self._second > 0:
self._second -= 1
elif self._second == 0 and self._minute > 0:
self._second = 59
self._minute -= 1
elif self._minute == 0 and self._hour > 0:
self._minute = 59
self._second = 59
self._hour -= 1
3)用面向对象的形式猜数字(1-100)(机出随机数人猜)
要点:类的设计 -->属性:1)随机数 2)人猜数
方法:1)猜数 2)反馈(大了、小了、正确)
4)定义线段, 可判断平行、相交
要点:平行,相交的判断
平行 --> 两条线段斜率相等则平行
相交 --> 快速排斥实验(以两条线段为对角线分别建立矩形) - 跨立实验(其中涉及矢量的加减、矢量叉积的计算),难在数学而非程序本身。
5)奥特曼打小怪兽(10 vs 10)
要点:类的设计及特殊情况的处理
类:
属性:1)奥特曼 --> 代号、hp(100)、技能(普杀-10、必杀-20)
2)小怪兽 --> 同上
方法:
1)奥特曼 --> 攻击、状态显示、掉血、返回血量、返回代号
2)小怪兽 --> 同上
特殊情况:
1)hp=0时不能发动攻击
2)一方团队成员剩余数量为0时另一方团队获胜
本周的作业量虽然较大打乱了提前看视频的计划,但还是学习了修改内存,可以做到通过程序,结合CheatEngine(用于获取内存地址)、WndSpy(获取窗体信息)两款软件对植物大战僵尸中的阳光值进行修改๑乛◡乛๑。后续的学习安排将会继续以听课-练习-看博文-自学的形式开展下去,希望自己的水平如几何级数般增长下去。
网友评论