《python核心编程(第二版)》阅读记录

# 1、python起步

  • Python的主提示符(>>>): 解释器告诉你她在等待你输入下一个语句
  • Python的次提示符(...): 解释器正在等待你输入当前语句的其他部分
  • 下划线(_)在解释器中表示最后一个表达式的值
  • 符号(>>)用来重定向输出
  • 从用户那里得到数据输入的最容易的方式是使用raw_input()内建函数
  • 从交互式解释器中获得帮助使用help(),然后将函数名作为参数
  • Python不支持C语言中的自增1和自减1
  • Python的长整数所能表达的范围与大小超过C语言的长整数, 类似于Java的BigInteger
  • Python支持使用成对的单引号或双引号以及三引号(三个连续的单引号或者双引号)
  • 使用索引运算符[]和切片运算符[:]可以得到子字符串
  • 加号(+)用于字符串连接运算, 星号*用于字符串重复,两个星号表示幂运算
  • print语句默认会给每一行添加一个换行符, 只要在print语句的最后添加一个逗号(,), 输出的元素之间会自动添加一个空格
  • 列表解析, 你可以在一行中使用一个for循环将所有值放到一个列表中
  • sqdEvens = [x ** 2 for x in range(8) if not x % 2]
  • self是类实例自身的引用
  • 标准输出write()不会自动在字符串后面添加换行符号

# 3、python基础

  • 井号#表示之后的字符为 Python 注释
  • 换行\n 是标准的行分隔符(通常一个语句一行)
  • 反斜线\ 继续上一行
  • 分号;将两个语句连接在一行中
  • 冒号:将代码块的头和体分开
  • 语句(代码块)用缩进块的方式体现
  • 不同的缩进深度分隔不同的代码块
  • Python 文件以模块的形式组织
  • 支持多元赋值: x, y, z = 1, 2, 'a string'
  • Python 的多元赋值方式可以实现无需中间变量交换两个变量的值: x, y = y, x
  • _xxx 不用from module import *导入
  • __xxx__系统定义名字
  • __xxx 类中的私有变量名
  • 如果模块是被导入,__name__的值为模块名字
  • 如果模块是被直接执行,__name__的值为__main__
  • 使用del语句删除一个变量,但没法删除一个常量值(会自动垃圾回收)
  • Python的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器
  • 调试模块pdb允许你设置(条件)断点,代码逐行执行,检查堆栈。它还支持事后调试

# 4、python对象

  • 所有的Python对象都拥有三个特性:身份,类型和值
  • 其他内建类型:类型、Null 对象 (None)、文件、集合/固定集合、函数/方法、模块、类
  • type(type(42)) #<type 'type'> 所有类型对象的类型都是type,它也是所有Python 类型的根和所有Python标准类的默认元类(metaclass
  • 特殊类型: Null对象或NoneType,只有一个值, 那就是None
  • None 类型最接近的C 类型就是voidNone 类型的值和C 的NULL 值非常相似
  • 空列表: []、空元组()、空字典{}
  • foostr = 'abcde'; foostr[::-1] #'edcba' 相当于反转
  • 省略对象有一个唯一的名字 Ellipsis, 它的布尔值始终为 True.
  • 3 < 4 < 7 #多个比较操作可以在同一行上进行,求值顺序为从左到右
  • Python 提供了isis not运算符来测试两个变量是否指向同一个对象
  • 整数对象和字符串对象是不可变对象,所以Python 会很高效的缓存它们 #a = 1; id(a) #8402824;b = 1; id(b) #8402824
  • repr(obj)obj 返回一个对象的字符串表示
  • str()repr() 或反引号运算符(``) 可以方便的以字符串的方式获取对象的内容、类型、数值属性等信息
  • 通常情况下 obj == eval(repr(obj)) 这个等式是成立的
  • Python 2.2 统一了类型和类, 所有的内建类型现在也都是类
  • 原来的所谓内建转换函数象int(), type(), list() 等等, 现在都成了工厂函数
  • 存储模型:标量/原子类型 数值(所有的数值类型),字符串(全部是文字); 容器类型 列表、元组、字典
  • 更新模型: 可变类型 列表, 字典; 不可变类型 数字、字符串、元组
  • 访问模型: 直接访问: 数字; 顺序访问: 字符串、列表、元组; 映射访问: 字典
  • 其实在Python 中, 一切都是指针
  • 事实上Python 的整数实现等同于C 语言的长整数
  • Python 的浮点类型实际上是C 语言的双精度浮点类型

# 5、数字类型

# 7、序列:字符串、列表和元组

  • 成员关系操作符 (in, not in)使用来判断一个元素是否属于一个序列
  • seq * expr 序列重复expr 次
  • 正负索引的区别在于正索引以序列的开始为起点(从0开始),负索引以序列的结束为起点(从-1开始)
  • 可以先创建一个只包含None 的列表,然后用extend()函数把range()的输出添加到这个列表
  • [None].extend(range(-1, -len(s), -1))
  • [None].extend(...)函数返回None , None 既不是序列类型也不是可迭代对象
  • 在Python里面没有字符这个类型.这可能是双引号和单引号在Python 里面被视作一样的的另一个原因
  • 成员操作符用于判断一个字符或者一个子串(中的字符)是否出现在另一个字符串中
  • 注意,成员操作符不是用来判断一个字符串是否包含另一个字符串的,这样的功能由find()或者index()
  • s = ' '.join(('Spanish', 'Inquisition', 'Made Easy'))

# 8、条件和循环

  • 根本上说, 迭代器就是有一个 next() 方法的对象, 而不是通过索引来计数
  • 对一个对象调用 iter() 就可以得到它的迭代器
  • map(lambda x: x ** 2, range(6)) ======= [x ** 2 for x in range(6)]

# 11、函数式编程

  • 函数:有返回值; 过程: 简单、特殊、没有返回值的函数

# 12、模块

  • sys.path.append('/home/wesc/py/lib') #添加模块搜索路径
  • builtins 模块和 builtin 模块不能混淆:
  • builtins 模块包含内建名称空间中内建名字的集合;在标准 Python 执行环境下, builtins 包含 builtin 的所有名字
  • 限制使用 "from module import *"
  • import(module_name[, globals[, locals[, fromlist]]]) #提供这个函数是为了让有特殊需要的用户覆盖它, 实现自定义的导入算法
  • reload() 内建函数可以重新导入一个已经导入的模块
  • 从 2.5 版 开始, 相对导入被加入到了 Python 中 #from ..common_util import setup
  • 如果你不想让某个模块属性被 "from module import *" 导入 , 那么你可以给你不想导入的属性名称加上一个下划线( _ )
  • 很多方法可以执行一个 Python 模块: 通过命令行或 shell , execfile() , 模块导入, 解释器的 -m 选项

# 13、面向对象编程

  • 实例名字mathObj 将mathObj.x和mathObj.y 关联起来。这就是我们所说的使用类作为名字空间容器
  • 如果子类重写基类的构造器,基类的构造器就不会被自动调用了--这样,基类的构造器就必须显式写出才会被执行
  • 请注意Python 并不支持纯虚函数(像C++)或者抽象方法(如在JAVA 中),这些都强制程序员在子类中定义方法

# 14、执行环境

# 15、正则表达式

  • 有两种主要方法完成模式匹配:搜索(searching)和匹配(matching)
  • 管道符号( | ), 表示一个或操作,它的意思是选择被管道符号分隔的多个不同的正则表达式中的一个 #at|home匹配的字符串at,home
  • 点字符或句号(.)符号匹配除换行符(NEWLINE)外的任意一个单个字符(Python 的正则表达式有一个编译标识[S or DOTALL], 该标识能去掉这一限制
  • \b 匹配的模式是一个单词边界, 对应的模式一定在一个单词的开头 #\bthe 任何以"the"开头的字符串
  • \B 只匹配出现在一个单词中间的模式(即, 不在单词边界上的字符) #\Bthe 任何包含"the"单不以"the"开头的单词
  • 当前Python 的默认正则表达式模块 re 模块, regex 和regsub 这两个模块已在Python 2.5 版本时被移除了
  • 常用的正则表达式函数与方法: compile、match、search、findall、finditer、split、sub、group、groups

# 16、网络编程

  • 使用套接字进行网络编程?
  • 套接字是一种具有之前所说的“通讯端点”概念的计算机网络数据结构;
  • socket(socket_family, socket_type, protocol=0);
  • 在运行网络应用程序时,最好在不同的电脑上执行服务器和客户端的程序;
  • accept()函数是阻塞式的,即程序在连接到来之前会处于挂起状态;
  • Twisted 框架(官网链接(https://twistedmatrix.com/trac/)): 完全事件驱动的网络框架;
  • select 模块通常在底层套接字程序中与socket 模块联合使用;

# 17、网络客户端编程

  • 虽然现在我们不再使用底级别的套接字来创建因特网客户端,但模型是完全相同的;
  • 最流行的有文件传输协议(FTP),Unix-to-Unix 复制协议(UUCP),以及网页的超文本传输协议(HTTP),(Unix 下的)远程文件复制指令rcp(以及更安全,更灵活的scp 和rsync)。
  • RFC(中文目录:http://man.chinaunix.net/develop/rfc/default.htm)?是一系列以编号排定的文件,基本的因特网通讯协定都有在RFC文件内详细说明;
  • 使用Python的FTP支持,需要导入ftplib模块,并实例化ftplib.FTP类对象
  • 在一般的FTP 通讯中,要使用到的指令有login(), cwd(), dir(), pwd(), stor*(), retr*()和quit()
  • Usenet?新闻组,全球性的文件交换网络,可以用来发言评论,可以用来传递文件
  • 有一个库nntplib 和一个类nntplib.NNTP,要实例化这个类用于NNTP
  • 一些方法:group返回元组(rsp, ct, fst, last, group),服务器的返回信息,文章数量,第一个和左后一个文章的号码和组名
  • 仔细看看你收到的e-mail 的邮件头,会看到一个“passport”标记,其中记录了邮件寄给你这一路上都到过了哪些地方;
  • MTA?MTA 之间通讯所使用的协议叫消息传输系统(MTS);
  • SMTP 由已故的Jonathan Postel(加利福尼亚大学信息学院)创建,记录在RFC 821中;
  • Pyhthon中使用smtp也存在一个smtplib 模块和一个smtplib.SMTP 类要实例化;
  • sendmail()的所有参数都要遵循RFC 2822;
  • 用于下载邮件的第一个协议叫邮局协议,记录在RFC 918 中;

# 18、多线程编程

  • 守护线程?
  • Python 提供了几个用于多线程编程的模块,包括thread, threading 和Queue
  • 核心提示:避免使用thread 模块,序应该尽可能地使用threading 等高级别的线程模块
  • 锁原语?
  • 另一个避免使用thread 模块的原因是,它不支持守护线程

# 19、图形用户界面编程

  • Python 的默认GUI 工具集是Tk;
  • Tkinter 是Python 的默认GUI 库,它基于Tk 工具集,后者最初是为工具命令语言(Tcl)设计 的;
  • 基础: 顶层窗口对象;
  • Tkinter.Tk()返回的对象通常被称作根窗口;
  • Tkinter.mainloop() #这通常是您程序执行的最后一段代
  • 4 种比较流行且可用的工具集来编写同一个GUI 程序示例:Tix(Tk Interface eXtensions)、Pmw(Python MegaWidgets 的Tkinter 扩展)、wxPython(wxWidgets 的Python 绑定)、和PyGTK(GTK+的Python 绑定)

# 20、web编程

# 21、数据库编程

# 22、扩展Python

  • 编写扩展代码并将它们的功能整合到Python编程环境中来;
  • Python 的一大特点就是,扩展和解释器之间的交互方式与普通的Python模块完全一样;
  • 扩展Python的几点理由:添加额外的非pyhton功能;性能瓶颈的效率提升;保持专有源代码私密;
  • 代码保密的一种方法是只发布预编译后的.pyc文件;
  • 在从Python到C的转换就用PyArg_Parse*系列函数;

# 23、更多

  • 客户端的COM编程?
  • win32com 中的excel、word、powerpoint、email、outlook使用

QS: Python中*args 和**kwargs的用法