【概述】
--书名:“笨办法”学Python 3
--作者:泽德 A.肖
--日期:2020年02月15日
--大事件记录:
截至2月14日24时,据31个省(自治区、直辖市)和新疆生产建设兵团报告:
现有确诊病例56873例(其中重症病例11053例),累计治愈出院病例8096例,累计死亡病例1523例,累计报告确诊病例66492例,现有疑似病例8969例。累计追踪到密切接触者513183人,尚在医学观察的密切接触者169039人。
--读书用时:900页,历时13.5小时,59个笔记
【读书点评】
————————————————
2020年2月15日,今年读完的第二本书,每天1.5小时,每次80-100页,作为培养兴趣的书可以,作为干货专业书来说不够系统。
前面的内容很基础,到后期类对象实例开始逐渐加深难度,再到面向对象编程和开发游戏就比较复杂了,不过都还在可接受的范围内,至于flash的Web平台搭建,个人感觉看起来还行,但上手理解起来还是有点难度的。
优点:心理劝导和鼓励的内容比较多也比较鼓舞人心,技术理解方面笔者写的实例很多,通俗易懂不枯燥。
缺点:内容东南西北杂乱无章的感觉,废话太多,空白页占用大量篇幅,干货和系统知识不够全面,如果作为入门兴趣了解书籍还是不错,但是如果希望系统的了解整个语言的基础类型、编程框架和逻辑思想,还是推荐另一本python编程从入门到实践。
【读书笔记】
————————————————
◆ 常见问题回答
python3版本,round(1.25,1)=1.2操作四舍五入精确到小数点1位以上的时候由于十进制输入和二进制输出的关系,到第三位为5的浮点数时,保留一位不会进位,会有误差,慎入。
>> round()函数
◆ 巩固练习
f = open(filename,“r”),这种格式的读写文本才需要每次close(),如果可以的话,建议用with open(filename,“r”)as f:f.read(),可以免去每次关闭文件读取的步骤。
>> close()
◆ 习题16 读写文件
f.read()和f.readline()读取文本,以字符串返回;f.readlines()读取全文内容,以列表返回;seek(0,0)初始化游标。
>> readline
◆ 巩固练习
重点区分游标位置和数据是否需要被覆盖,w只写模式下,f.truncate()不需要清楚内容,因为每次打开文件写数据,会覆盖老内容,读写的话建议使用w+模式,单纯追加数据的话建议使用a模式。
>> target.truncate()
◆ 习题17 更多文件操作
if exists(文件名),存在返回True,不存在返回False。
>> print(f"Does the output file exist? {exists(to_file)}")
◆ 习题18 命名、变量、代码和函数
>> 
标
题包含的内容够多的吧?接下来我要教你函数(function)了!说到函数,不同的程序员会有不一样的理解和使用方法,不过我只会教你现在能用到的最简单的使用方法。函数可以做以下3件事。
1.它们给代码段命名,就跟变量给字符串和数值命名一样。
2.它们可以接收参数,就跟你的脚本接收argv一样。
◆ 常见问题回答
x+=y,就是x=x+y,之前有一次记混了。
>> x += y的意思和x = x + y是一样的。
◆ 解剖代码
DB:decode bytes解码二进制;ES:encode strings编码字符串。其实大部分脚本都是编码字符串,让电脑识别,解码常用于传输底层数据。
>> DBES——“decode bytes, encode strings”的缩写,即“解码字节串,编码字符串”。
◆ 习题33 while循环
while,一定要注意递增,或者加入条件判断使它变为False,从而退出死循环。
>> 重复检查你的while语句,确定你测试的布尔表达式最终会变成False。
◆ 常见问题回答
exit(0),表示没有错误正常退出。exit(1),表示发生错误异常退出。
>> 在很多类型的操作系统里,exit(0)可以中止某个程序,而其中的数字参数则用来表示程序是否是遇到错误而中止的。exit(1)表示发生了错误,而exit(0)则表示程序是正常退出的。
◆ if语句的规则
我的智力只允许我用2层if,否则会把自己绕晕。
>> 3. if语句的嵌套不要超过两层,最好尽量保持只有一层。
◆ 调试的小技巧
debug调试模式,确实有点烧脑,比纯鲁代码还难理解。
>> 调试程序的最好的方法是使用print在各个想要检查的关键点将变量打印出来,从而检查那里是否有错。
◆ 习题39 字典,可爱的字典
>> 
接
下来你要学习Python的“字典”数据结构了,字典是类似列表的一种存储数据的方法,但要获取其中的数据,你用的不是数值索引,而是任何你想用的东西。这样你就可以把字典当作数据库来存储和组织数据了。
我们比较一下字典和列表的功能。你看,列表可以让你做这样的事情。
习题39 Python会话
 >>> things = [′a′, ′b′, ′c′, ′d′]
◆ 字典的例子
print(“-”*10)发现小技巧,每次分割线我都手敲一堆“-”,忘记可以用字符串乘法了。
>> print(′-′ * 10
◆ 常见问题回答
列表是有序的集合,可以切片、索引等操作;字典是无序键值对,强行排序可以用sorted(dict.items,key=lambda x:x[0],reverse=False)值升序排序,常用于请求报文payloud。
>> 列表是一些项的有序排列,而字典是将一些项(键)对应到另外一些项(值)的数据结构。
◆ 模块和字典差不多
知识点:
import 模块名
模块名.函数名,调用函数
模块名.变量名,调用模块内部的全局变量
>> 然后可以使用.操作符访问模块中的函数和变量
◆ 类和模块差不多
知识点:
模块中为何要创建类?
因为调用类,可以生成无数个实例对象,每个对象互相不干扰;
test =class_name()
test1 = class_name()
但是如果没有类,只有函数,那调用以后只能用同一批次的代码,没法拓展。
>> 使用类而非模块的原因如下:你可以拿上面这个MyStuff类重复创建出很多出来,哪怕是一次100万个,它们也会互不干涉。而对于模块来说,一次导入之后,整个程序里就只有这么一份内容,只有鼓捣得很深才能弄点儿花样出来。
◆ 对象和import差不多
test = class_name()
test就是对象,class_name()就是类,这个过程就叫实例化。
>> 当你将一个类“实例化”以后,你得到的就叫对象(object)。
调用模块的类,就好比去商店买了张白纸,在有限的范围内,随便写写画画。
>> 记住这不是拿来一个类就直接用,而是将类当作一个“蓝图”,然后用它创建和这个类有相同属性的副本。
◆ 常见问题回答
知识点:
类的静态函数,
def__init__(self):
self.argv = argv
调用类,会自动调用其静态函数和初始化类的初始化静态属性,self.表示是实例的属性,不加就变成了普通变量会有歧义。
>> 有了self.cheese = ′Frank′就清楚地知道这指的是实例的属性self.cheese
◆ 专有词汇练习
>> · 类(class):告诉Python创建新类型的东西。
· 对象(object):两个意思,即最基本的东西,或者某样东西的实例。
· 实例(instance):这是让Python创建一个类时得到的东西。
·def:这是在类里边定义函数的方法。
·self:在类的函数中,self指代被访问的对象或者实例的一个变量。
· 继承(inheritance):指一个类可以继承另一个类的特性,和父子关系类似。
· 组合(composition):指一个类可以将别的类作为它的部件构建起来,有点儿像车子和车轮的关系。
· 属性(attribute):类的一个属性,它来自于组合,而且通常是一个变量。
· 是什么(is-a):用来描述继承关系,如Salmon is-a Fish(鲑鱼是一种鱼)。
· 有什么(has-a):用来描述某个东西是由另外一些东西组成的,或者某个东西有某个特征,如Salmon has-a mouth(鲑鱼有一张嘴)。
◆ 练习从语言到代码
python .py english,啥意思?我都没用过
>> $ python oop_test.py english
◆ 常见问题回答
a = list[:],复制列表
>> result = sentence[:]
◆ 习题42 对象、类及从属关系
类:表示拥有相同特征带我一个虚无的统称,比如鱼类。
对象:表示某一类具体的东西称为一个对象,面前这盆泥鳅。
实例化:这盆泥鳅里面的,一只红色的泥鳅是实例a,一只黑色的泥鳅实例b。
>> 是“类”(class)和“对象”(object)的区别。问题在于,类和对象并没有真正的区别。它们其实是同样的东西,只是在不同的时间点名字不同罢了。
◆ 关于class Name(object)
import this的python之禅说到:显式大于隐式,class Class_name(object):表示继承了一个基础类。
>> Python之禅不是说显式优于隐式嘛
◆ 巩固练习
看别人代码,可以用“是什么”,有什么的方法去读。
>> 是什么”和“有什么”
◆ 重复和细化
>> 我的这个小流程的最后一步其实也不算一步,而是类似一个while循环。前面所讲的东西并不是一次性操作,需要回去重复整个流程,基于你从后面步骤中学到的东西来细化你写的内容。有时,我走到第三步就会发现需要回到第一步和第二步去弄些东西,那就会停下来回到前面去弄完。有时我会突然来了灵感,然后趁热打铁直接跳到后面把代码写出来,不过接着我会回到前面的步骤来检查并确认我的代码是不是覆盖了所有的可能性。
关于这个流程,要注意的另一个点是,你不需要把自己锁定在一个层面上去完成某个特定任务。假如说不知道怎样写Engine.play这个方法,可以停下来,就在这个任务上使用这个流程,直到弄明白怎样写为止。
◆ 习题44 继承与组合
复杂了复杂了,其实理解成继承本身就OK,比如冰与火之歌的男主囧snow,他继承了皇室的血脉,就等于拥有一个身份,这个身份天生自带主角光环和一切忠诚于皇室的仆人。
>> 大部分使用继承的场合都可以用组合取代或简化,而多重继承则需要不惜一切地避免
◆ 什么是继承
皇子继承了皇帝的身份。
未创建实例的时候,相当于只是太子,拥有皇帝的部分默认权限,自带高贵的身份可以在宫中与宰相平起平坐;
创建实例后的时间,相当于皇上驾崩,太子登基,拥有父亲皇上的一切权利的同时,还可以执行罢免旧臣,新增国法等一系列类似明治维新等各种国策变更。
>> 继承就是用来指明一个类的大部分或全部功能都是从一个父类中获得的。
子类代码块中,可以通过“super(子类名,self).父类函数名()”的方式调用父类的函数。
>> super(Child, self).altered()
◆ 继承和组合的应用场合
继承只要是自动调用了父类.init()静态函数和变量的作用,优点就是简单干净的解决代码复用问题。
>> “继承与组合”的问题说到底还是为了解决关于代码复用的问题。
避免使用多重继承,逻辑太复杂,容易出错。
>> 不惜一切代价地避免多重继承,因为它太复杂以至于很不可靠。如果非要用,那得准备好钻研类层次结构,以及花时间去找各种东西的来龙去脉。
◆ 常见问题回答
类也可以理解为批量生产手机时,第一个被设计出来的手机的模版或模具。
>> 在Python里类其实像是用来创建对象的模板,就跟制作硬币用到的模具一样。
◆ 我们的游戏词汇
元组本身的元素不能更改,但是元组某个元素如果是列表,列表的元素可以更改。
>> 元组其实就是一个不能修改的列表。
◆ 常见问题回答
导入失败检查:
1.目录是否缺失__init__.py;
2.导入名称大小写检查;
3.导入路径检查;
4.同名模块检查;
5.PYTHONPATH环境变量检查,或者直接os.path.append(新增本地路径)
>> 为什么我老看到ImportError?
通常有4件事情会导致ImportError:(1)在模块目录中没有创建__init__.py;(2)在错误的目录中执行了import;(3)拼写错误,导致导入了错误的模块;(4)PYTHONPATH没有设置到.,所以你无法从当前目录加载模块。
◆ 习题49 创建句子
主谓宾动介句子练习:
I fell in love with a beautiful girl with a big teddy and a small teddy that I met near my home yesterday.
>> 主语 谓语(动词)宾语
◆ 安装flask
框架,就好像汽车的车架,具体配什么地盘、发动机、变速箱、刹车片、轮胎、外壳,都由你在这个地盘基础上搭建你要的东西。
>> 所谓的“框架”通常是指“让某件事情做起来更容易的软件包”。
flask,web框架搭建的第一步。
>> pip install flask
◆ 写一个简单的“Hello World”项目
搭建web第二步:
把写好的代码,放入application中,通过route路由指定运行的服务器路径。
>> 1 fromflask importFlask 2 app = Flask(__name__) 3 4 @app.route(′/′) 5 defhello_world(): 6 return′Hello, World! ′ 7 8 if__name__ == "__main__": 9 app.run()
运行你的flash脚本,然后通过浏览器:ip:端口,访问本地搭建的web应用程序
>> (lpthw) $ python3.6 app.py * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
◆ 修正错误
调试模式:FLASH_DEBUG = 1,启动调试模式后,日志打印会更加详细,而且调试后可以热部署,立马生效,缺点就是生产环境如果启动调试模式,被黑客攻击,就会导致网站被挟持,一将功成万骨枯,就是这个意思,很不安全。
>> $ exportFLASK_DEBUG=1 (lpthw) $ python3.6 app.py * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger pin code: 222-752-342
◆ 常见问题回答
如果无法运行启动程序,可能是路径错误,需要切换到正确目录,在bin/的上一层文件run app.py才能成功。
>> 如果你无法运行python3.6 app.py,就说明你不在正确的目录下。
◆ Web的工作原理
重点!:浏览器和服务器交互的流程图。
>> [插图]
1.用户输入网址,点击确定,发出请求
2.请求通过接口,发到互联网
3.互联网通过服务器传给后台程序执行
4.后台处理完返回响应给服务器
5.服务器通过网络和接口传给浏览器
6.浏览器渲染响应,显示到页面上
>> HTTP请求的流程
FTP文件传输协议。
>> 你还可以试试ftp://ibiblio.org/,这是一个“文件传送协议”(File Transport Protocol, FTP)的例子。
端口就是通过网络传输,传输数据和接收数据的入口,让浏览器和服务器完成资源交流。
>> 端口准备好以后,操作系统会回传给你的程序一个类似文件的东西,它所做的事情就是通过网络传输和接收数据,让你的计算机和http://test.com这个网站所属的服务器之间实现数据交流
◆ 表单的工作原理
数据交互:http传参数执行后台脚本。
>> 1 fromflask importFlask 2 fromflask importrender_template 3 fromflask importrequest 4 5 app = Flask(__name__) 6 7 @app.route("/hello") 8 defindex(): 9 name =request.args.get(′name′, ′Nobody′) 10 11 ifname: 12 greeting =f"Hello, {name}" 13 else: 14 greeting ="Hello World" 15 16 returnrender_template("index.html", greeting=greeting) 17 18 if__name__ =="__main__": 19 app.run()
重启你的Web应用程序(按Ctrl+C后重新运行),确认它已运行起来,然后使用浏览器访问http://localhost:5000/hello,这时浏览器应该会显示“I just wanted to say Hello, Nobody.”。接下来,将浏览器中的URL改成http://localhost:5000/hello?name=Frank,然后你可以看到页面显示为“Hello, Frank.”。最后将name=Frank部分修改为你自己的名字,你就可以看到它对你说“Hello”了。
◆ 创建HTML表单
>> 在URL上传递参数是可以的,不过这样看上去有些丑陋,而且不方便普通人使用,你真正需要的是一个“POST表单”,这是一种包含了