1 基本配置和基本语法(1) 2 章)1 Python.exe 的解释器 options: 1.1 –d 提供调试输出 1.2 –O 生成优化字节码(生成优化字节码).pyo 文件) 1.3 –S 不导入 site 启动时搜索模块 python 路径 1.4 –v 冗余输出(详细跟踪导入语句) 1.5 –m mod 以脚本的形式运行模块 1.6 –Q opt 除法选项(参考文件) 1.7 –c cmd 以命令行字符串心事提交的操作 python 脚本 1.8 file 操作给定的文件 python 脚本 2 _在解释器中表示最后一个表达值. 3 print 支持类 c 的 printf 格式输出: print “%s is number %d!” % (“python”, 1) 4 print 后面加逗号, 它的输入将不会改变 5 将输出重定向到日志文件: logfile = open(“c:/1.log”, “a”); //打开文件 c:/1.log 使用 a 模式..即 add, 添加. print >> logfile, “Fatal error: invalid input!”; >>为重定向..将 print 的结果重定向到 logfile, 输 出内容是”Fatal error: invalid input!”… logfile.close(); //关闭文件流… 6 程序输入: raw_input(提示字符串): user = raw_input(“请输入您的姓名”); 7 int(数值)…..将数值字符串转换为整数值… 8 运算符: 8.1 - * / %加减乘和取模操作与其他语言相同.取余运算 8.2 / 浮点取模的结果是完整的浮点数 8.3 // 浮点取模的结果是放弃计算的结果. 8.4 ** 是乘方 8.5 >>和<<也支持移位操作. 但不支持 java 中的>>> 和<<< 移位. 8.6 < <= > >= != <> 等比较运算符 8.7 and or not 等逻辑操作符 9 变量与赋值: python 是弱型语言.. 10 list, tuple, map * 4 得到的结果是一个新的 list | tuple | map, 是原数据的 4 份 11 数字: 11.1 int(有符号整数) 11.2 long(长整数) 11.3 bool(布尔值) 11.4 float(浮点值) 11.5 complex(复数) 11.6 python2.3 开始, 如果结果从 int 溢出, 会自动转化为 long 11.7 python2.4 开始支持 decimal 数字类型, 需要导入 decimal 模块..因为在二进制表中 有一个无限 循环片段 , 普通的浮 点 1.1 实 不能被精 确表示的 , 被表示 为 1.1000000000000001. 使用 print decimal.Decimal(‘1.1);能得到准确的 1.1 12 字符串: 引号之间的字符集合, 支持成对单引号和双引号的使用, 三个引号(三个连续单引) 可用于包含特殊字符号或双引号. 使用索引运算符[]和切片运算符[ : ]可获得子字符 串…字符串中第一个字符的索引是 0, 最后一个字符的索引是-1; 13 列表和元组: 可视为普通数组, 可以保存任何数量和类型的任何类型 python 对象… 13.1 列表元素用中括号包裹, 元素的数量和值可以改变. 13.2 元素用小括号包裹, 不能更改, 尽管他们的内容可以, 元组可视为只读 列表. 子集可以通过切片操作获得. 14 字典: 相当于其他语言 map, 使用{key: value}的方式表示. 取值的方式和其他语言的 map 一致. 也可直接使用 map[key] = value 赋值的方式. 15 条件语句: if expression: path 1 elif expression2: path2 else: path3 16 while 循环 while expression: process business 17 for 循环 for item in list|tuple|map: print item 17.1 range(len(list))得到一个 list 长度范围内的整数 list, 在整个过程中获得索引值很方便. 17.2 python2.3 中增加了 enumerate(), 它可以遍历 list, 同时得到索引和值 for index, data in enumerate(list): print index, “:”, data, 17.3 列表解析: sqdEvens = [x ** 2 for x in range(8) if not x % 2], 获取序列, 该序列是 0-8 所有的数字 x%2 为 0(false)的 x 的平方 18 文件及内建函数: open(), file() 18.1 handle = open(file_name, access_mode = “r”), 打开文件只读, 得到的句柄是 handle..如果没有提供这种方法 access_mode, 默认是 r 19 异常处理: raise 可故意引起异常 try: # process except IOError, e: # error process 20 函数: 若函数中没有 return 语句, 自动返回 None 对象 def function_name([arguments]): “optional document string” function_suite 20.1 python 函数调用中的参数是引用传输 20.2 在定义函数时, 在参数列表中通过=设置参数的默认值. 21 类: 21.1 定义: class class_name: static_variable_name = value def __init__(self, [arguments]): //operation //self in here is the reference for this class instance def general_method_name(self, [arguments]): //operation //self is the class instance //if you want to use class variable, please use like self.__class__.__name__ 21.2 实例化: instance = class_name([arguments, …]); 22 模块: 不带.py 后缀名的文件名…创建模块后, 可以使用 import 导入此模块使用. 22.1 访 问 模 块 内 的 函 数 或 变 量 : module_name.function() | module_name.variable | module_name.class_name 22.2 sys 模块概览 22.2.1 sys.stdout.write(‘Hello World!\n’) //使用 sys 标准输出模块 22.2.2 sys.platform //标记返回系统 22.2.3 sys.version //返回系统版本 23 PEP: 一个 PEP就是一个 python增强提案(python enhancement proposal), 是在新版 python 增加新特性的方法…索引网站是: http://python.org/dev/peps 24 一些常用函数 24.1 dir([obj]) 显示对象的属性, 若未提供参数, 显示全局变量的名称 24.2 help([obj]) 显示对象的文档, 若无参数, 进入互动帮助 24.3 int(obj) 将对象转换为整数 24.4 len(obj) 返回对象的长度 24.5 open(file_name, mode) 以 mode(r|w|a…)打开文件 24.6 range([[start, ]stop[, step]]) 返回整数列表…结束值是 stop-1, step 默认是 1 24.7 raw_input(str) 提示 str 等待用户输入 24.8 str(obj) 将对象转换为字符串 24.9 type(obj) 返回对象的类型…返回值本身就是一个 type 对象 24.10 sum(iterable[, start=0]) 对于纯值 list|tuple|map 求和操作.. 24.11 dir([object]) 如果没有参数获得当前脚本 scope 定义的对象, 若有参数, 返回该 对象内部定义的对象, 假如有一个对象__dir__方法, 该方法将被调用, 必须返回 属性的列表…允许自定义__getattr__()或__getattribute__()实现方法 dir的 自定义显示属性列表….若无指定参数, 根据对象__dict__最佳内存字典聚集 信息显示.. 24.12 type([object]) 参数为空显示<type ‘type’>, 参数不是空的,显示对象的类型 24.13 type(name, bases, dict) 通过名称, 基类, 内存字典动态创建类型 24.14 object__name.__doc__ 查看对象的文档字符串 24.15 __doc__ 对象的文档字符串, 在定义对象时,文档字符串写在对象句块中的第一句, 用简单的字符串表示 24.16 sys.exit() 退出 python 解释器 24.17 append(Object) 给 list 添加元素 24.18 os.linesep 返回系统换行符…不同的系统换行符不同, 使用 linesep可以提高 代码平台性 24.19 string_variable_name.strip([chars]) 脱离, 滤去字符串中的某些字符, 如果没有参数 返回原字符串 25 数值按进制分为: 25.1 二进制: 0b101010 25.2 八进制: 07167 25.3 十进制: 98767 25.4 十六进制: 0xf2134 Python 基础(chapter3)1 setence and syntax 语句和语法 1.1 #为注释符号 1.2 \n 是标准行分隔符, 通常一个语句一行 1.3 反斜线\表示下一行继续, 用来将单条语句放入多行…尽量使用括号代替 1.4 分号;表示将两个语句连接在一行中…不提倡 1.5 冒号:表示将代码块的头和体分开 1.6 语句(代码块)用缩进块方式体现: 同一个代码组的代码必须严格左对齐..由于不同的 editor 制表符宽度不一, 为了使代码跨平台, 推荐使用 4 个空格缩进 1.7 不同缩进深度分隔不同的代码块 1.8 python 文件以模块的形式组织: 模块以磁盘文件的形式存在, 不应该让某个模块充斥 的太大 2 赋值 2.1 赋值语句没有返回值, 但可以使用链式赋值 2.2 python2.0 开始支持增量赋值(算符和等号连接赋值), 但是 python 不支持++, -- 2.3 赋值操作中, 可变对象会被直接修改(引用位置值的修改), 不可变对象则被重新赋予新 的对象(引用修改) 2.4 多元赋值: a, b, c = 1, 2, ‘string’, 建议使用 tuple 的方式进行多元赋值: (a, b, c) = (1, 2, ‘string’) 3 swap 操作: x, y = y, x 4 标识符 4.1 大小写敏感 4.2 python 的关键字列表和 iskeyword()函数在 keyword 模块, 方便查阅 4.3 内建: built-in 可以看作是系统保留字….对于一些内建函数需要覆盖(重定义, 替 换)…built-in 是__builtins__模块的成员, 该模块由解释器自动导入 4.4 python 不支持重载 4.5 下划线: 作为变量前缀和后缀指定特殊变量 4.5.1 _xxx: 不用’from module import*’导入 4.5.2 __xxx__: 系统定义名字 4.5.3 _xxx: 类中的私有变量名 5 python 之禅 The Zen of Python, by Tim Peters python 之禅. 作者 Tim Peters Beautiful is better than ugly. 漂亮胜于丑陋 Explicit is better than implicit. 详尽胜于含蓄 Simple is better than complex. 简单胜于复杂 Complex is better than complicated. 组合胜于复杂(结构) Flat is better than nested. 单一胜于嵌套 Sparse is better than dense. 稀少胜于繁杂 Readability counts. 可读性价值 Special cases aren't special enough to break the rules. 特例不足以违反规则 Although practicality beats purity. 实践胜于理论 Errors should never pass silently. 错误可能从不沉默 Unless explicitly silenced. 除非明白沉默 In the face of ambiguity, refuse the temptation to guess. 面对歧义, 不被猜想诱惑 There should be one-- and preferably only one --obvious way to do it. 可能仅有一种更好的方法 Although that way may not be obvious at first unless you're Dutch. Now is better than never. 现在胜于一切 Although never is often better than *right* now. If the implementation is hard to explain, it's a bad idea. 难于解释的实现是不好的 If the implementation is easy to explain, it may be a good idea. 易于明白的实现可能是个好方案 Namespaces are one honking great idea -- let's do more of those! 名空间是一个好方案, 让我们去超越这些 6 模块组织 # 起始行 # 模块文档 # 模块导入 # 变量定义 # 类定义 # 函数定义 # 主程序 7 __name__用于指示模块应该如何被加载, 如果值是”__main__”说明是主模块, 如果是模块 名, 说明是被导入的 8 主模块测试代码 def main(): # business process if(__name__ == ‘__main__’) main() 9 内存管理 9.1 基本 9.1.1 弱类型 – 动态类型 9.1.2 programmer 不关心内存管理 9.1.3 变量并会被回收 9.1.4 del 语句能够直接释放资源 9.2 变量未初始化不允许使用 9.3 引用计数: 对于一个内存堆中的对象, 有多少个指针引用它..引用计数就是多少, 引用 计数为 0 时, 该对象可以被垃圾回收器回收 9.3.1 增加 9.3.1.1 对象创建 9.3.1.2 别名创建(引用赋值) 9.3.1.3 参数传递(引用传值) 9.3.1.4 被容器引用 9.3.2 减少 9.3.2.1 引用生命周期结束 9.3.2.2 对象别名被显示销毁 del y 9.3.2.3 对象别名被赋予其他引用 9.3.2.4 窗口对象本身被销毁 9.3.3 del 9.3.3.1 从现在的名字空间中删除一个别名 9.3.3.2 对象的引用计数减一 9.4 垃圾回收: 有对象引用计数为 0, 对象被显示告知需要销毁, 有内存消耗大户存在导致 系统压力较大时, 垃圾回收机制运行, 清理需要回收的内存区域…垃圾回收机制还有一 个循环垃圾回收器, 确保释放循环引用对象(a引用 b, b引用 a, 导致其引用计数永远不为 0) 10 将引入的其他模块中常用的变量重新赋予一个本地别名(ls = os.linesep)不仅可以避免冗长 的变量名, 又可以提高加载速度(因为现在是本地变量了) 11 重要的其他模块 11.1 debugger: pdb 允许设置断点, 逐行调试, 检查堆栈, 还支持事后调试 11.2 logger: logging 分紧急, 错误, 警告, 信息, 调试五级日志 11.3 profilers: 性能测试器 11.3.1 profile: python 编写, 测试函数执行时间, 每次脚本执行总时间. 11.3.2 hotshot: python2.2, c 编写, 解决了性能测试过载问题, 但需要更多时间生成结果, python2.5 修正了 hotshot 的时间计量 bug 11.3.3 cProfile: python2.5, c 编写, 需要较长时间从日志文件载入分析结果, 不支持子函 数状态细节, 某些结果不准 python 对象(chapter4)1 python 对象有三个特征: 身份和类型是只读的, 如果对象支持不支持更新操作, 那么值也 就是只读的. 1.1 身份: 唯一的身份标识, 可以使用内建函数 id()得到, 可以看作是对象的内存地址… 1.2 类型: 对象的类型决定该对象保存什么类型的值, 可以进行什么操作, 遵循什么规则., 可以使用内建函数 type()查看 python 对象的类型. 1.3 值: 对象表示的数据项 2 对象属性: 主要有属性, 值, 相关联的可执行代码(method), 一些 python 类型也有数据属 性, 含有数据属性的对象包括但不限于: 类, 类实例, 模块, 复数, 文件. 3 基础数据类型: 数字, 整形, 布尔型, 长整型, 浮点型, 复数型, 字符串, 列表, 元组, 字典. 4 其他内建类型: 类型, None, 文件, 集合/固定集合, 函数/方法, 模块, 类 4.1 type(type(1)) 可以看出类型对象本身也是对象, 它的类型是 type 4.2 None的类型是 NoneType, NoneType只有一个值, 就是 None, 不支持任何运算也没有任 何内建方法, 布尔值总返回 False 5 每个对象天生都有布尔值, 以下对象的布尔值是 False 5.1 None 5.2 False(bool 类型) 5.3 所有值为 0 的数 5.4 ‘’ 空字符串 5.5 [] | () | {} 空列表, 空元组, 空字典 5.6 用户创建的实例如果定义了 nonzero(__nonzero__())或 length(__len__())且值为 0, 那么 返回的布尔值也是 False 6 当要获取一个对象的布尔值的时候, 首先会调用__nonzero__(必须返回布尔类型或者 int类 型.)方法, 如果实现了该方法, 就返回该方法返回的布尔值, 如果没有实现该方法, 继续调 用__len__方法(该方法返回值必须是大于等于 0 的), 如果实现了__len__方法, 就根据其返 回值返回布尔值. 7 内部类型: python 内部机制 7.1 代码: 编译过的 python 的源代码片段, 是可执行对象. 通过调用内建函数 compile()可 以得到代码对象. 代码对象可以被 exec 命令或 eval()内建函数来执行. 代码是用户自 定义函数的核心, 运行期获得上下文.. __code__是函数的一个属性, 函数除了代码这 个属性, 还有函数名, 文档字符串, 默认参数, 全局命名空间等必须的属性 7.2 帧对象: 用于跟踪记录对象 7.3 跟踪记录: 用于异常发生时, 程序访问跟踪记录对象处理程序. 7.4 切片: 7.4.1 步进切片 sequence[::number] number 为负数, 倒序显示字符串, 正数则正序显示字 符串, 数值代表显示字符的 step 值. 7.4.2 多维切片 sequence[start1: end1, start2: end2] 7.4.3 省略切片 sequence[…, start1: end1] 7.4.4 切片对象 使用 slice([start, ]stop[, step])可以创建一个切片对象 7.5 省略对象: 用于扩展切片语法, 起记号作用..在切片语法中表示省略号, 省略对象有一 个唯一的名字 Ellipsis, 布尔值始终是 True 7.6 Xrange: 调用 xrange()生成 Xrange 对象, 类似内建函数 range, 用于节省内存使用或 range 无法完成的超大数据集场合 8 标准类型运算符 8.1 对象值比较 8.1.1 数字根据大小比较 8.1.2 字符串根据字符先后顺序比较 8.1.3 list | tuple | dict 顺序按照其中元素(dict 按照键)比较 8.1.4 链式比较相当于多个比较使用 and 连接 8.1.5 自定义类型对象的比较是引用值比较, 也就是 id(object_name)的比较 8.2 对象身份比较 8.2.1 is / is not 用来比较两个别名是否引用同一个对象 8.2.2 整数对象和字符串对象是不可变对象… 8.3 布尔类型运算符: and, or, not 9 标准类型内建函数 9.1 cmp(obj1, obj2) 比较 obj1 和 obj2, 根据比较结果返回整数 i, i<0 à obj1<obj2, i>0 à obj1>obj2, i==0 à obj1 == obj2….自定义类型中通过定义方法__cmp__(target)来实现….使 用比较运算符, 或直接调用 cmp 时该方法被调用 9.2 type(obj) 得到一个对象的类型, 返回相应的 type 对象 9.3 str(obj) 返回对象适合可读性好的字符串表示…在自定义类中使用__str__(self)返回一 个字符串, 调用 str(obj)时会被隐式调用 9.4 repr(obj) 返回一个对象的字符串表示, repr 返回的字符串通常可以被用于使用 eval 动 态创建一个对象. 通常 obj == eval(repr(obj))是成立的 9.5 ``, 反单引号, `obj`和 repr(obj)做的事情是一样的. 9.6 isinstance(obj, (type[, type, …])) 判断 obj 是不是第二个参数 tuple 中的列举的类型的实 例 9.7 types 模块提供一些已知的类型 9.8 由于每一种类型都只有一个类型对象, 所以, 可以使用引用比较代替值比较以提升性 能: 用 if type(num) is types.IntType 替代 if type(num) == types.IntType 9.9 from-import: 只引入某个模块的一部分属性: 比如 from types import IntType 这样做可 以有效的减少查询次数 9.10 python 的 operator 模块中有绝大多数运算符对应的同功能的函数可供使用. 10 类型工厂函数: int(), long(), float(), complex(), str(), Unicode(), basestring(), list(), tuple(), type(), dict(), bool(), set(), frozenset(), object(), classmethod(), staticmethod(), super(), property(), file() 11 标准类型的分类: 11.1 标准类型是”基本内建数据对象原始类型” 11.1.1 基本: 是 python 的标准或核心 11.1.2 内建: python 默认提供 11.1.3 数据: 用于一般数据存储 11.1.4 对象: 对象是数据和功能的默认抽象 11.1.5 原始: 这些类型提供的是最底层的粒度数据存储 11.1.6 类型: 本身就是数据类型 11.2 按存储模型进行分类: 11.2.1 标量/原子类型: 数值, 字符串等可以存储单一字面对象的类型. 11.2.2 容器类型: 列表, 元素, 字典等可以存储多个字面变量的类型, python 中的容器类 型都可以存储不同类型的元素 11.3 按更新模型进行分类: 对象创建之后, 值不可以改变, 注意: 这里是对象, 而不是变 量 11.3.1 可变类型: 列表, 字典 11.3.2 不可变类型: 数字, 字符串, 元组 11.4 按访问模型进行分类: 访问对象的方式 11.4.1 直接访问: 数值 11.4.2 顺序访问: 列表, 元组, 字符串等可以按照索引访问的类型 11.4.3 映射访问: 字典 12 不支持的类型: char, byte, pointer 数字(chapter5)1 支持的数字类型: 整型, 长整型, 布尔型, 双精度浮点型, 十进制浮点型和复数 2 整型 2.1 布尔型 包含 True 和 False 两个值的整型 2.2 标准整数类型 0x 表示十六进制, 无前缀表示十进制, 0 表示八进制, 0b 表示二进制 2.3 长整型 整数后加 L, 表示范围与可用内存大小有关.. 3 双精度浮点数: 一个符号位, 52 个底位, 11 个指数位. 使用后缀 e 表示指数 4 复数: 实数 + 序数 J 构成一个复数 4.1 python 中的复数概念 4.1.1 虚数不能单独存在, 总是和一个值为 0.0 的实数部分一起构成一个复数 4.1.2 复数由实数部分和虚数部分组成 4.1.3 表示虚数的语法: real + imagJ 4.1.4 实数部分和虚数部分都是浮点数 4.1.5 虚数部分必须有后缀 j 或 J 4.2 复数的内建属性 4.2.1 real 复数的实部 4.2.2 imag 复数的虚部 4.2.3 conjugate() 返回该复数的共轭复数 5 强制类型转换规则 6 python 提供 python 解释器的启动参数 Qdivision_style, -Qnew 执行新的除法行为, -Qold 执 行传统除法行为, 默认是-Qold…-Qwarn 和-Qwarnall 可以用来度过过渡期 7 幂运算符** 比左侧单目运算符优先级高, 比右侧单目运算符优先级高 8 位运算符: ~, &, |, ^, <<, >> 8.1 负数会被当成正数的二进制补码处理 8.2 左移和右移 N 位等同与无溢出检查的 2 的 N 次幂运算 8.3 长整数的位运算使用一种经过修改的二进制补码形式, 使的符号位可以无限左移 8.4 ~是单目运算符 9 内建函数和工厂函数 9.1 数字类型函数: 9.1.1 转换工厂函数: int(), long(), float(), complex(), 接受参数第一个是要转换的值, 第二 个是进制..如果要转换的值是 string 才能使用第二个函数指定进制. 9.1.1.1 python2.2 开始, 加入了 bool(), 用来将整数 1 和 0 转换成为标准布尔值(所有非 0 数都返回 True). 9.1.1.2 python2.3 的标准数据类型添加了 Boolean 类型, true 和 false 也有了常量值 True 和 False, 而不再是 1 和 0 9.1.1.3 bool(obj) 返回 obj 对象的布尔值, 也就是 obj.__nonzero__() 9.1.1.4 complex(real, imag=0.0) 9.1.2 功能函数 9.1.2.1 abs(number) 返回数字的绝对值, 如果是复数, 返回 math.sqrt(num.real2 + num.imag2) 9.1.2.2 coerce(number1, number2): 返回按照类型转换规则转换得到的两个数字组成的 元组 9.1.2.3 divmod(number1, number2) 返回一个包含商和余数的元组, 整数返回地板除 和取余操作结果, 浮点数返回的商部分是 math.floor(number1/number2), 复数的商部 分是 ath.floor((number1/number2).real) 9.1.2.4 pow()和**功能相同 9.1.2.5 round(number[, base]) 对浮点数进行四舍五入运算, base 参数是小数位参数, 如 果不指定, 返回与第一个参数最接近的整数的浮点形式 9.1.2.6 int() 直接去掉小数部分, floor()得到最接近但小于原数的整数, round()得到最接 近原数的整数 9.1.3 整数的内建函数: hex(), oct(), bin()…ord(“A”) 接受一个 ascii 或 unicode 字符, 返回相 应的 unicode 值 èç char(65L)接受 unicode 码值, 返回对应的 unicode 字符. 10 其他数字类型 10.1 布尔数: 10.1.1 布尔型是整型的子类, 但是不能再被继承而生成它的子类. 10.1.2 没有__nonzero__()方法的对象默认值是 True 10.1.3 对于值为 0 的任何数字或空集(空的 list|tuple|dict)在 python 中值都是 False 10.1.4 数学运算中, True ==1, False == 0 10.2 十进制浮点数: from decimal import Decimal 11 数字科学计算的包 11.1 高级的 Third package: Numeric(NumPy) 11.2 python 自带的数字类型相关模块 11.2.1 decimal 十进制浮点运算类 Decimal 11.2.2 array 高效数值数组(字符, 整数, 浮点数) 11.2.3 match/cmatch 标准 c 库数学运算函数. 常规数学运算在 match, 复数运算在 cmatch 11.2.4 operator 数字运算符的函数实现 11.2.5 random 伪随机数生成器 11.2.5.1 randint(start, end)随机生成 start, end 之间的一个整数 11.2.5.2 uniform(start, end)随机生成范围内的一个浮点数 11.2.5.3 randrange([start ,]stop[, step])随机生成 start, stop 内按 step 步增数字范围的一 个整数 11.2.5.4 choice(sequence)随机返回给定的序列中的一个元素 序列: 字符串, 列表和元组(chapter6)1 对所有序列类型都适用的操作符(优先级从高到低, 不适用于复合类型的对象比较) 1.1 成员关系操作符: int, not in 1.2 连接操作符: + 1.3 重复操作符: *… sequence * int 1.4 切片操作符: (利用子序列方式结合三种操作方式, 可以非常灵活的控制序列) 1.4.1 [], 索引取值 1.4.2 [start : end], 索引范围取值 1.4.3 [::step], 切片的步长 1.4.4 切片操作符不会带来索引超出下标的异常 2 list.extend(iterable): 把另外一个序列追加到 list 中. 3 list.insert(index, object): 把一个元素 object 插入到 list 的 index 位置, 如果 index 是负数, 从 后面向前数, 超过 list 下标后, 在末尾添加 4 类型转换 4.1 list(iter) 把可迭代对象转换为列表 4.2 str(obj) 把 obj 对象转换成字符串(对象的字符串表示法) 4.3 unicode(obj) 把对象转换成 Unicode 字符串(使用默认编码), 使用 u”汉字”可以得到其 unicode 编码 4.4 basestring() 抽象工厂函数, 不能被实例化, 不能被调用, 仅作为 str 和 unicode 的父类 4.5 tuple(iter) 把一个可迭代对象转换成元组对象 4.6 enumerate(iterable) 生成由 iterable 每个元素的 index 值和 item 值组成的元组, 可以使 用 for key, value in enumerate 的方式进行迭代 4.7 max(iterable, key=None) | max(arg0, arg1, …, key=None) 返回 iterable 或 arg0…中的最大 值, 如果要指定 key, 必须是一个可以传递给 sort()方法的回调函数…..要使用 key, 必须使 用 key=method_name的方式传参, key指定的函数接收的参数是迭代的当前元素, 在该函 数中, 对元素进行处理, 返回一个对象, python 会根据返回对象比较大小, 得到该结果最 大的元素对应的 list 中的元素 4.8 min 同上面的 max 方法. 对于 max 和 min 方法, 如果是自定义类型, 又没有指定 key, 那么默认是按照 id(object)的结果计算的 4.9 reversed(sequence) 返回逆序访问的迭代器 4.10 sum(sequence, init=0) 返 回 sequence 和 可 选 参 数 init 的 总 和 , 等 同 于 reduce(operator.add, sequence, init) 4.11 sorted(iterable, func=None, key=None, reverse=False) 接受一个可迭代对象, 返回一个 有序列表, 可选参数 func, key, reverse 含义和 list.sort 相同 4.12 zip([item0, item1, …, itemn]) 返回一个列表, [(item0, ), (item1, ), …, (itemn, )] 4.13 sort(cmp=None, key=None, reverse=False) 将序列进行排序, cmp 指定一个接受两个参 数的回调函数, 该函数得到的两个参数是序列中的两个元素, 比较将按照 cmp 指定的回 调函数进行, 返回数字类型的比较结果, , , key 指定一个接受一个参数的回调函数句柄, 该参数就是迭代到的元素, 在比较之前, 将会根据这个回调函数对要比较的元素进行一 次处理, 实际参与比较的是经过该回调函数处理之后的返回值. reverse 指示是否对比 较结果进行逆序 5 利用已有功能函数定义动态参数的函数: method = lambda x, y: cmp(x + 10, y - 10), 调用时 还是使用句柄加参数的方式: method(x, y) 6 字符串: 如果先使用切片操作, 子串会被在内存中进行短时间的暂存, 可以通过 id()得到值 7 比较: 普通字符串按照 ascii 值比较, Unicode 字符串按照 unicode 值比较. 8 字符串切片, 下图是字符串切片的索引值, 如果开始或结束的索引值没有指定, 默认为 0, 或-1. [::step]用于指定步长 9 成员操作符: in, not in, 可以判断一个子串是否在字符串中存在…使用 find(), index(), rfind(), rindex()可以获得子串在源中的位置 10 string 模块有一些预定义的字符串: ascii_letters, ascii_lowercase, ascii_uppercase, digits 11 循环的改善: 如果循环的终止条件是不变的(一般都是不变的), 那么尽量不在循环终止条 件中调用方法是一个好的习惯, 在大量数据的情况下(5 * 10^8数据), 改善的循环效率提升 了 4 秒左右, 平均计算得到改善后循环每次效率提升约为 7.154 * 10^-8s 也就是 71.54 ns 12 for-else 方式的循环, else 子句会在所有的元素都被循环完成之后执行, 如果 break, 就不 执行 13 join 可以用来连接字符串, 这样的效率是更高的, 因为+连接必须为每个字符串创建内存 14 +连接字符串是运行时连接, “str1””str2”的方式则是编译时连接字符串 15 普通字符串和 unicode 字符串连接, 会把普通字符串转换成 unicode 字符串进行连接 16 %格式化字符串的参数: 16.1 %c 转换成字符(ascii 值, 或长度为一的字符串) 16.2 %r 优先使用 repr()函数进行字符串转换 16.3 %s 优先使用 str()函数进行字符串转换 16.4 %d / %i 转成有符号的十进制数 16.5 %u 转成无符号的十进制数 遇到负号添加-号 16.6 %o 转成无符号八进制数 遇到负号添加-号 16.7 %x / %X 转成无符号十六进制数(x|X 的大小写决定转换后得到十六进制数中的字母 的大小写) 遇到负数, 则转换得到的结果中添加一个-号 16.8 %e / %E 转成科学计数法(e | E 的大小写决定转换后得到的 e 的大小写) 16.9 %f / %F 转成浮点数(小数部分自然截断) 16.10 %% 输出%号 17 其他格式化操作符辅助指令(位于%和格式化标识的中间) 17.1 * 定义宽度或小数点精度"adfas%*dfasdf" % (5, 2.000000888) 17.2 – 用于左对齐 17.3 + 在正数前加+号 17.4 (sp) 在正数前显示空格 17.5 # 在八进制前加 0, 十六进制前显示 0x 或 0X, 取决于用的是 x 或 X 比如: "integer:%#X!" % 1984 17.6 (var) 映射变量(字典参数) 17.7 m.n m 是显示的最小总宽度, n 是小数点后的位数 18 格式化字符串接收 dict 数据:”%(howmany)d days” % {“howmany”: 28} 19 字符串模板 s = Template(‘There are ${howmany} ${lang} Quotation Symbols’) 19.1 s.substitute([key = value, key = value…]) 这个函数必须提供所有的占位参数, 否则报 错 19.2 s.safe_substitute([key = value, key = value…]) 和 substitute 功能是一样的, 都是转成得 到一个字符串, 但是这个方法对参数没有要求, 如果没有提供对应的参数, 就直接输出. 20 原始字符串操作符(r/R), 紧贴字符串左引号, 不区分大小写. 用来使字符串描述各自原始 的意义, 而不使用转义 21 使用正则查找空白字符: m = re.search(r‘\\[rtfvn]’, r’Hello World!\n’)… 22 可以使用 u | U ‘字符串’的方式创建 unicode 字符串, 该标识可以和 r/R 连用 23 python 参数有位置参数和关键字参数两种, 位置参数在定义时只有参数名, 关键字参数 定义时是 key=value 的形式 24 python 也提供可变参, *为位置可变参, **为关键字可变参 25 如果使用* | **方式传递实参, * 可以将序列参数转变成每个元素作为单独参数, **则可 以将 dict 转换成关键字参数 26 内建函数 26.1 cmp, 使用字符的 ascii 值进行比较(Unicode 字符串按照 unicode 值比较) 26.2 max, min, len, enumerate, zip, 其中 zip 可以接受多个参数, 按照下面方式返回: zip(“abcd”, “efg”, “hijk”, “lmn”) 返回: [('a', 'e', 'h', 'l'), ('b', 'f', 'i', 'm'), ('c', 'g', 'j', 'n')] 26.3 str 和 unicode 都是 basestring 的特化类, 但是, Unicode 又包含(类之间仅仅是兄弟关系, 元素范围上有包含关系)str 的表示范围 26.4 chr(number), unichr(number), ord(string), chr 和 unichr 分别用来把一个数字转换成一个 对应类型的字符串, ord 则是将一个 string 类型的单字符对象转换成为对应的 ascii 码或 unicode 编码 27 string模块的重要函数, 所有这些函数, 都可以省略第一个参数, 使用 string.func的方式调 用 27.1 string.index()和 string.find()方法是一样的功能, 但是, index 方法在查找不到字符串的 时候, 会报一个异常, string.rfind(), string.rindex()用法相同, 是从右边开始查找 27.2 string.join(sequence[, str]) 如果只有一个参数, 返回一个将所有元素插空一个空格的 字符串(如果是序列, 转换成为字符串), 如果有两个参数, 把第二个参数向第一个参数的 每个空位进行插空 27.3 string.ljust(string, width[, fillchar]) 填充 fillchar(只能是一个字符)width个到 string后面, 使 string 左对齐, 如果 fillchar 空, 填充空格, rjust 为右对齐 27.4 string.lower(), string.upper(), string.swapcase()大小写转换 27.5 string.lstrip(), string.rstrip(), string.strip() 去除空格. 27.6 string.split(string, sub, count) 将 string 截取 sub, 从左向右截取 count 个, 返回 list 27.7 string.replace(string, old, new[, number=string.count(string, old)]) 将 string 的 old 子串 替换成 new, 最多替换不超过 number, number 默认是 old 在 string 的数量 27.8 string.translate 27.9 string.zfill(string, width) 用 width 个 0 填充 string 的左面使其右对齐 28 unicode.encode(CODE_STRING) 按照指定编码方式编码字符串, decode 反之, 按照指定编 码方式解码 29 除了 pickle 模块之外, 其他模块都已经支持 unicode.. 30 UnicodeError 异常在 exceptions 模块中定义, 是 ValueError 的子类, 所有关于 Unicode 编解 码的异常都要继承自 UnicodeError 31 与字符串类型有关的模块: 31.1 string: 字符串相关操作函数和工具, 比如 Template 类 31.2 re: 正则表达式 31.3 struct: 字符串和二进制之间的转换 31.4 c/StringIO 字符串缓冲对象, 操作方法类似于 file 对象 31.5 base64 Base16, 32, 64 数据编解码 31.6 codecs 解码器注册和基类 31.7 crypt 进行单方面加密 31.8 difflib 找出序列间的不同 31.9 hashlib 多种不同安全哈希算法和信息摘要算法的 API 31.10 hma HMAC 信息鉴权算法的 python 实现 31.11 md5 RSA 的 MD5 信息摘要鉴权 31.12 rotor 提供多平台的加解密服务 31.13 sha NIAT 的安全哈希算法 SHA 31.14 stringprep 提供用于 IP 协议的 Unicode 字符串 31.15 textwrap 文本打包和填充 31.16 unicodedata Unicode 数据库 32 字符串的关键点: 32.1 不可分字符类型 32.2 类似 printf()的格式化字符串 32.3 三引号内可以接受特殊字符(What You See Is What You Get) 32.4 r | R 原始字符串 32.5 python 字符串不通过 NUL 或者\0 结束 33 list 的元素删除 33.1 del list[index] 根据 index 删除 list 中的元素 33.2 list.remove(value) 从 list 中移除值是 value 的第一个元素 33.3 list.pop() 类似栈的出栈操作, 弹出栈顶并返回 34 list 的成员关系操作还是使用 in | not in 35 列表解析: [var_name for var_name in list if expression]if 之后和 for 之前都可以使用 var_name 进行运算 36 列表的比较操作, 隐式调用 cmp 方法, 比较规则是逐个扫描元素, 进行比较, 如果可以比 较, 比较, 如果相等扫描下一个元素, 如果不相等返回结果, 如果两个元素类型不可以比 较, 就比较两个对象的 id()值.. 如果一直相等 ,直到一个列表扫描结束, 那么返回较长的列 表较大 37 序列类型函数 37.1 len(), max(), min() 37.2 sorted() 和 reversed() 返回的是被排序或逆序之后的序列, 不会改变序列本身的引用, 而序列自己的成员方法则会改变自身 37.3 enumerate() 返回一个 key=>value 方式的 enumerate 对象 37.4 zip() 将多个列表压缩成为一个元组列表…..zip 返回的元组列表可以使用足够元组内 元素数量的参数来迭代遍历每一个元素, 例如: for a, b, c, d in zip(alist, blist, clist, dlist) 37.5 使用 list()和 tuple()可以完成列表和元组之间的转换, 但是这种转换是值的转换, 所以 他们是==的, 但是不是 is 的 37.6 extend(列表)方法接受另外一个列表追加到原列表之后 37.7 list.pop(index = -1) list 的 pop 可以弹出指定索引的值 38 处理一组对象的时候, 默认的是创建一个元组, 例如 a = 1, 2, 3, 4 实际上是创建了一个元 组(1, 2, 3, 4) 39 单独使用 del 删除一个元组元素是不可行的, 只能通过重组 40 元组的可变性: 元组的某一个元素指向了一个对象, 该对象是可变的, 那么改变该对象 就相当于改变了元组的内容, 然而, 真正的我们的元组确实是没有改变的. It’s so wizardly. 为什么呢? 元组内部持有的是对方的引用, 那个对象无论怎么变都还是在那里, 所以, 元 组内部的值(内存地址)是没有改变的. 41 函数可以返回多对象, 返回的实际也是一个元组 42 单元素元组使用括号创建时需要在后面显示的加上”, ”, 由于括号被重载作为一个分组操 作符了, 在这里会优先使用分组功能, 所以, 返回的总是原始类型 43 相关模块: 43.1 数组 array 受限的可变序列类型, 要求所有元素都是相同的类型 43.2 operator 包含函数调用形式的序列操作符, operator.concat(m, n)相当于 m+n 43.3 re perl 风格的正则查找 43.4 StringIO / cStringIO 长字符串作为文件来操作, 比如 read(), seek()函数……c 版本的 速度更快一些 43.5 Textwrap 包裹/填充文本的函数 43.6 types 包含 python 支持的所有类型 43.7 collections 高性能容器数据类型 43.8 UserList 包含了 list对象的完全的类实现, 允许用户获得类似 list的类, 用以派生新的 类和功能 44 浅拷贝: 拷贝原对象中的内容, 但是新创建对象. 比如一个 list的浅拷贝就是把 list中元素 的引用值拷贝过去… 浅拷贝实例: 完全切片操作, 利用工厂函数, 使用 copy 模块的 copy 函数 45 深拷贝: 拷贝源对象中的内容, 如果某个属性(或序列中的元素)是可变对象, 把该可变对 象的内容也进行拷贝 46 非容器类型对象没有拷贝一说 47 可变参: f(*args1, **args2), 如果关键字可变参不指定 key 值, 会被作为位置参数和前面的 参数放到一个元组中….位置可变参在倒数第二个位置, 关键字可变参在倒数第一个位置. 48 map(function, iterable), 应用 function 在 iterable 的每一个元素, 返回值作为新的序列的元 素 映射和集合类型(chapter7)1 字典使用 keys()获得键的列表, values()获得值的列表, items()获得包含 key->value 对的元组 的列表 2 字典的创建和赋值 2.1 dict = {key: value} 2.2 dict = dict((key, value), (key, value)) 2.3 dict.fromkeys(sequence_keys, default_value) 创建一个 key 是 sequence_keys 中元素的字 典, 所有的 value 都是 default_value, 如果不指定 default_value, 默认是 None 3 使用 dict.has_key()可以判断一个字典中是否有这个键, 该方法在后期 python 可能弃用, 推 荐使用 in 和 not in 4 字典的键必须是可哈希的 5 print 中使用到字典的时候, 使用字符串格式化方式是非常优雅的 6 dict1.update(dict2 | tuple_list[, **key=value]) 6.1 将 dict2 字典更新到 dict1 中 6.2 如果参数是一个元组列表, 将元组列表解析到 dict1 中(元组列表中每个元组必须有两 个元素) 6.3 可以在参数后面跟 0—n 个关键字参数, 以参数名: value 的方式更新到 dict1 中 7 元素的删除 7.1 del dict[“key”] 删除键是 key 的条目 7.2 dict.clear() 清空字典内的内容 7.3 dict.pop(“name”) 删除键是 key 的条目并返回 8 映射类型操作符 8.1 标准类型操作符: <, >等比较操作符可以使用, 在比较过程中, 还是调用了字典的 cmp 方法, 但是, 字典的 cmp 方法中指示, 首先比较字典的长度, 然后比较键的大小, 最后比 较值的大小 8.2 字典查找操作: [], 成员关系操作: in, not in 9 dict 工厂函数 9.1 接受不定关键字参数: dict(a = 1, b = 2, c = 3) 9.2 接受字典或关键字参数: 将原有的字典拷贝出来成为一个新的字典(这里使用的浅拷贝, 这里的浅拷贝得到的结果和使用 copy函数得到的结果是一样的,但是, copy函数的效率更 高) 9.3 dict_instance.copy() 使用已有的字典拷贝一个字典(这里使用的也是浅拷贝) 10 系统内建函数 10.1 len(): 返回字典的 key-value 对的数目 10.2 hash(): 这个函数不是为字典设计的, 但是它可以判断某个对象是否可以做一个字典 的键, 将一个对象作为参数传递给 hash(), 会返回这个对象的哈希值. 如果对象是不可 哈希的, 会返回 TypeError, 提示该对象是 unhashable 的 10.3 sorted(dict): 返回 dict 的所有 key 排序后的列表 11 dict 类型的内建方法 11.1 keys(): 返回字典的所有 key 的列表 11.2 values(): 返回字典的所有 value 的列表 11.3 items(): 返回字典的所有 key-value 的元组的列表 11.4 get(key, default = None): 获取字典内 key 对应的值, 如果没有该 key, 返回 default 指 定的默认值 11.5 setdefault(key, default=None): 如果字典中不存在 key, 由 dict[key]=default 为其赋值 11.6 iterkeys(), itervalues(), iteritems() 对应没有 iter 命名的方法, 这里使用了惰性赋值的迭 代器, 节省内存 12 数字作为字典的键的时候, 只要值相同, 就代表相同的键, 比如, 1, 和 1.0 代表的就是相 同的键 13 键必须是可哈希的, 所有的不可变对象都是可哈希的, 可变对象如果在定义中定义了 __hash__()方法, 那么就可以作为键 14 如果元组中的值都是不可变类型的, 那么元组也可以作为字典的键 15 集合 sets 有两种不同的类型, 可变集合 set 和不可变集合 frozenset…可变集合也是不可哈 希的… 16 集合中不能有重复的元素, 如果有元素和已有元素重复, 就不会被插入.集合是无序的, 但是, 可以使用排序函数为它排序 17 集合中可以使用的数学符号 18 集合只能使用工厂函数 set 和 frozenset 创建 19 访问集合中的数据使用循环, 或者使用成员关系操作符 in, not in 判断元素是否属于集合 20 更新集合(只能是 set, frozenset 不能被更新) 20.1 add() 添加一个元素 20.2 s.update() 接受一个序列类型的参数, 把该序列中有而集合中没有的元素添加到集 合中 20.3 s.remove() 从集合中移除一个元素 21 集合可用的标准类型操作符 21.1 成员关系: in, not in 21.2 集合等价/不等价: ==, != 21.3 子集/超集: <, <=, >, >= 22 集合类型操作符(所有的集合类型) 集合互相操作的时候, 最后产生的集合是可变集合 还是不可变集合取决于第一个参与操作的集合的类型 22.1 联合 | 22.2 交集 & 22.3 差补/相对补集 - A-B 就返回属于 A 但不属于 B 的元素集合 22.4 对称差分 ^ A^B = A-B + B-A 23 可变集合特有的操作符 23.1 |= 相当于 update 方法, 并集赋值 23.2 &= 相当于 intersection_update()方法, 交集赋值 23.3 -= 相当于 difference_update()方法, 差集赋值 23.4 ^= 相当于 symmetric_difference_update()方法, 对称差分更新 24 集合类型的内部方法: 24.1 s.issubset(t) 判断 s 是不是 t 的子集 24.2 s.issuperset(t) 判断 s 是不是 t 的超集 24.3 s.union(t) 返回一个新集合, 该集合是 s 和 t 的并集 24.4 s.intersection(t) 返回一个新集合, 该集合是 s 和 t 的交集 24.5 s.difference(t) 返回一个新集合, 该集合是 s 的成员, 但不是 t 的成员, 即返回 s 不同 于 t 的元素 24.6 s.symmetric_defference(t) 返回所有 s 和 t 独有的(非共同拥有)元素集合 24.7 s.copy() 返回一个 s 的浅拷贝, 效率比工厂要好 25 可变集合特有的方法: add, remove, discard, pop, clear, 这些接受对象的方法, 参数必须是 可哈希的 26 那些和操作符提供相同功能的函数, 有着更强的处理能力, 因为运算符两边的操作数必 须都是集合, 然而函数可以接受任何的可迭代类型. 条件和循环(chapter8)1 如果循环体, 或条件语句体只有一句, 可以和头写在同一行. 2 字典的搜索速度要比 for, if, while 等快得多 3 True and object, 返回 object, True or object 返回 True, 因此可以使用 expression and out1 or out2 模拟三元操作符 4 python 提供的三元操作: X if C else Y, 如果 c 输出 x, 否则输出 y 5 xrange()不会在内存中创建列表的完整拷贝, 只被用在 for 循环中. 6 reversed()和 enumerate()内建函数返回的是一个迭代器 7 迭代器的优点 7.1 提供了可扩展的迭代器接口 7.2 对列表迭代带来了性能上的增强 7.3 在字典迭代中性能提升 7.4 创建真正的迭代接口,而不是原来的随机对象访问 7.5 与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后兼容 7.6 迭代非序列集合(例如映射和文件)时, 可以创建更简洁的代码 8 迭代器工作原理: next()方法取出元素, 元素全部取完后触发 StopIteration 异常, for 可以根 据异常结束循环 9 any(), all()用来判断序列或迭代器中元素的真假, any 为或操作, all 为与操作 10 iter(iterable) 用来创建一个迭代器 11 文件的迭代器中调用 next 方法, 默认会调用 readline 方法. 如果直接使用 for line in file 就可以创建一个默认的文件迭代器. 12 在迭代的时候, 不要尝试改变可变对象 13 列表解析: 13.1 lambda, 动态创建函数 13.2 map(function, sequence), 对 sequence 的每一个元素应用 function, 返回一个新的列表 13.3 filter(function, sequence), 对 sequence 的每一个元素应用 function, 某个元素应用该 function 后如果返回 false, 该元素将被从最后返回的列表中过滤掉 13.4 列表解析中可以使用多个循环, 来达到生成矩阵或多维序列的目的..例如【(x, y) for x in range(5) for y in range(3)】 越靠后的循环就相当于普通循环中的内层循环 14 生成器 14.1 生成器表达式和列表解析表达式是一样的, 但是生成器表达式没有中括号, 单独使 用的时候, 使用圆括号, 作为参数的时候, 不需要圆括号 14.2 生成器表达式可以被用作迭代 14.3 生成器表达式是 lazy 的 14.4 示例: 获取文件的最长的行的长度: logest = max(len(line.strip()) for line in file) 文件和输入输出(chapter9)1 文件只是连续的字节序列 2 file_object = open(file_name, access_mode = ‘r’, buffering = -1) mode 有 r, w, a, 分别表示读取, 写入, 追加. U 模式代表通用换行符支持 2.1 使用 r, U 打开的文件必须是已经存在的, 使用 w 打开的文件如果存在, 首先清空…使 用 a 模式打开的文件是为追加数据做准备, 所有写入数据被追加到文件末尾. +代表可 读可写, b代表二进制访问… POSIX兼容的 Unix系统中, ‘b’是可有可无的, 因为它们把所有 的文件都当作二进制文件. 包括文本文件 2.2 如果在 mode 中要使用 b, b 不能作为第一个字符出现 2.3 buffering, 表示缓冲区大小, 0表示不缓冲, 1表示只缓冲一行数据, 其他大于 1的值表示 使用定值作为缓冲区大小. 不提供该参数或给定负值代表使用系统默认的缓冲机制 2.4 访问模式: 2.4.1 r 只读方式打开 2.4.2 rU 或 Ua 读方式打开, 同时提供通用换行符支持 2.4.3 w 写方式打开 2.4.4 a 追加模式打开, 必要时创建新文件 2.4.5 r+ 读写方式打开 2.4.6 w+ 读写方式打开 2.4.7 a+ 读写方式打开 2.4.8 rb 二进制读模式打开 2.4.9 wb 二进制写模式打开 2.4.10 ab 二进制追加模式打开 2.4.11 rb+ 二进制读写模式 2.4.12 wb+ 二进制读写模式 2.4.13 ab+ 二进制读写模式 3 file()内建函数和 open 的使用方式一样…但是推荐使用 open, 除非特定的要处理文件对象 时, 使用 file()内建函数 4 通用换行符支持: 任何系统下的文件, 不管换行符是什么, 使用 U 模式打开时, 换行符都 会被替换为 NEWLINE(\n) 5 python 默认打开 UNS, 如果不需要通用换行符支持, 在运行 configure 脚本时, 可以使用 —without-universal-newlines 开关关闭. 6 文件方法: 6.1 输入 6.1.1 read(size=-1): 直接读取字节到字符串中, 最多读取给定数目个字节. 不指定 size 参数, 或 size 值为负, 文件将被读取到末尾. 6.1.2 readline(size = -1) size 为负数或不指定, 读取至行末, 如果指定了其他的 size 值, 读取 size 个字节 读到的换行符不会自动去掉, 而把这个操作留给程序员, 使用 strip 去掉 6.1.3 readlines(sizhint = -1) sizhint 和 size 功能相同, 如果指定, 会读取 sizhint 个字节, 实 际读取值可能比 sizhint 较大, 因为需要填充缓冲区 6.1.4 file.xreadlines()和 xreadlines.xreadlines(file) 是一种更高校的文件读取, 一次读取一 块, 而不是一次读取所有行, 但是, 由于 iter 取代了该功能, 所以会被废弃. 6.2 输出 6.2.1 write() 把含有文本数据或二进制数据块的字符串写入到文件中 6.2.2 writelines() 接受一个字符串列表作为参数, 将他们写如文件, 行结束符不会自动加 入, 如果需要, 必须在调用 writelines 之前手动在每行结尾加上换行符 6.2.3 seek(offset, whence) 随机文件访问, 第一个参数 offset 表示偏移量, 第二个参数表 示位置, 即第一个参数相对哪里去偏移 6.3 迭代: 直接似乎用 for 循环迭代 6.4 其他: 6.4.1 close() 关闭文件结束对它的访问. 垃圾回收机制也会在文件对象的引用计数降 至 0 的时候自动关闭文件. 6.4.2 fileno() 返回打开文件的描述符…是一个整数, 可以用在如 os模块的 read方法等一 些底层操作上. 6.4.3 flush()方法直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区 写入. 6.4.4 tell()方法返回文件的当前位置, 对应 seek 方法的 offset 参数 6.4.5 isatty() 是一个布尔内建函数, 当文件是一个类 tty 设备时返回 true, 否则返回 false. 6.4.6 truncate()方法将文件截取到当前文件指针位置或者到给定 size, 以字节为单位 6.4.7 next() 返回文件的下一行 7 os 模块的重要属性 7.1 linesep 跨系统的分隔行的字符 7.2 sep 分割文件路径名的字符串( / \ 路径内的不同级分割) 7.3 pathsep 分割文件路径的字符串(; 多个路径分割) 7.4 curdir 当前工作目录的字符串名称(. ) 7.5 pardir 当前工作目录的父目录的字符串名称(.. ) 8 文件的内建属性: 8.1 name 文件名, 打开文件或使用 file()工厂的时候传递的文件名参数 8.2 mode 打开模式 8.3 closed 是否已经关闭 8.4 encoding 编码方式, None 表示使用系统默认的编码 8.5 newlines 未读取到行分隔符时为 None, 只有一个种行分割符时为一个字符串, 当文 件有多种类型的行结束符时, 则为一个包含所有当前遇到的行结束符的列表 8.6 softspace 0 表示在输出一数据后, 要加上一个空格符, 1 表示不加 9 标准文件, sys模块下的 stdin, stdout, stderr分别是标准输入文件(键盘), 标准输出文件(缓冲 的屏幕输出), 标准错误(到屏幕的非缓冲输出) 这三个文件是预先打开的, 可以直接使用 10 sys.argv 是命令行参数的列表, 列表中第一个是当前 python 脚本的名称, 后面分别是 python 脚本在命令行下被调用时传入的参数, 类似于 java 的 main 方法接受的参数, len(sys.argv)是命令行参数的个数 11 其他提供命令行参数的辅助处理模块: 11.1 getopt 模块, 简单的命令行参数处理 11.2 optparse 模块, 复杂的命令行参数处理. 12 os 模块: 所有操作系统对外的门面, 主要提供删除/重命名文件, 遍历目录树, 管理文件 访问权限等功能 12.1 文件处理 12.1.1 mkfifo()/mknod() 创建命名管道/创建文件系统节点 12.1.2 remove()/unlink() 删除文件, 指定路径为参数进行删除, 如果文件不存在会抛出 异常 12.1.3 rename()/renames() 重命名文件, 接受旧文件路径和新文件路径, 进行名字的修 改, 这里可以通过指定新的路径达到文件移动的目的. 没有发现 renames 和 rename 的 区别 12.1.4 stat() 返回文件信息, 包含文件的 mode, 编号, 用户(创建者, 所有者, 组), 时间 等信息 12.1.5 symlink() 创建符号链接 ….已经废除??? 12.1.6 utime() 更新时间戳 12.1.7 tmpfile() 创建并打开(‘w+b’)一个新的临时文件 没有参数, 直接获取一个临时 文件 12.1.8 walk(top, [topdown=True[, οnerrοr=None[, followlinks=False]]]) 生成一个目录树下 的所有文件名. 12.1.8.1 该方法用于生成目录树下的所有子文件名, 该方法返回一个生成器, 遍历生成 器可以得到一个三个元素的元组(dirpath, dirnames, filenames) 12.1.8.2 返回元素元组中的 dirpath 是 top 的目录名, dirnames 是 top 下所有子目录的文 件名集合, 不包含当前目录.和上级目录.., filenames 是 top 下的所有的非目录类型的 文件的名字集合 12.1.8.3 walk 返回元组中的名字集合可以使用 os.path.join(dirpath, name)得到一个文件 或目录的全路径. 12.1.8.4 walk 返回的生成器包含了 top 目录之下所有子孙目录的内部结构 12.1.8.5 walk 的第二个参数 topdown 指示了对该目录树的遍历是否采用自上而下的方 式, 默认是 True 12.1.8.6 walk 的第三个参数是指示错误发生时是否处理, 接收的是一个回调函数, 函数 会得到一个参数 OSError 的实例 12.1.8.7 walk 的第四个参数是指示是否遍历 link 类型指向的目录, 默认是 false, 但是, 如果你设置了 followlinks=True, 并有一个 link 是指向它的父亲或更高辈分的目录, 就 会产生一个无穷递归. 12.1.8.8 注意: 如果使用 walk 的时候传递了一个相对路径, 在重新开始 walk 之前, 不 要改变工作目录.. 当前工作路径的改变会导致 walk 停止工作 12.2 目录/文件夹处理 12.2.1 文件的 fileno()返回该文件的文件描述符 12.2.2 chdir()/fchdir() 改变当前工作目录/通过一个文件描述符改变当前工作目录 12.2.3 chroot() 改变当前进程的根目录 12.2.4 listdir() 列出指定目录的文件, 返回参数指定的路径下的所有文件和目录, 不包 括当前目录.和父亲.., 也不进行递归 12.2.5 getcwd()/getcwdu() 返回当前工作目录/功能相同, 但返回一个 unicode 对象 12.2.6 mkdir()/makedirs() 创建目录/创建多层目录, 接受两个参数, 一个表示路径, 一 个表示模式(权限???) mkdir()只能用于创建一级目录, 如果父目录不存在会抛出异常, 而 makedirs()会向上递归的创建目录 12.2.7 rmdir()/removedirs() 删除目录/删除多层目录 rmdir 删除一个目录或文件, removedirs()则递归删除一个目录树, removedirs()是一个难懂的函数, 指定一个父亲无 法删除父亲下的所有孩子, 反而由孩子删除了自己的父亲和祖辈 12.3 访问/权限 12.3.1 access() 检验权限模式, 两个参数, 第一个是路径, 第二个是模式, 模式可以是 F_OK, 用来检测路径是否存在, R_OK 用来检测是否可读, W_OK 用来检测是否可写, X_OK 用来检测是否可执行. 返回布尔值表示检验结果 12.3.2 chmod() 改变权限模式 接受两个参数, 第一个是路径, 第二个是模式, 模式在 stat 模块下定义, 是一些数字类型代表的模式, 主要是针对 linux 下的权限控制, 尽管 windows 下也支持这个方法, 但是, 只有 stat.S_IREAD, stat.S_IWRITE 才会起到真正的作 用. 12.3.3 chown()/lchown() 改变 owner 和 group Id / 功能相同, 但不会跟踪链接….或许这 个方法 windows 平台不支持??? 接受三个参数, 第一个是路径, 第二个是用户 id, 第三 个是组 id 12.3.4 umask() 设置默认权限模式 接受一个数字类型的参数, 设置新的默认权限模式, 并返回之前的权限模式. 12.4 文件描述符操作 12.4.1 open() 底层的操作系统 open 12.4.2 read()/write() 根据文件描述符读取/写入数据 12.4.3 dup(file_descriptor)/dup2(file_descriptor, file_descriptor2) dup 返回 file_descriptor 的复制品, dup2 则是把 file_descriptor 复制到 file_description2 12.4.3.1 每个进程在进程表中有一个记录项, 每个记录项中有一张打开文件描述符表, 可以看作是一个矢量, 每个描述符占用一项, 与每个文件描述符相关联的是: 12.4.3.1.1 文件描述符标志 12.4.3.1.2 指向一个文件表项的指针 12.4.3.2 内核为所有打开文件维持一张文件表, 每个文件表项包含 12.4.3.2.1 文件状态标志(读, 写, 增写, 同步, 非阻塞等). 12.4.3.2.2 当前文件位移量 12.4.3.2.3 指向该文件 v 节点表项的指针 12.4.3.3 习惯上, 标准输入(STDIN_FILENO)的文件描述符是 0, 标准输出(STDIN_FILENO) 的文件描述符是 1, 标准错误(STDERR_FILENO)的文件描述符是 2 12.4.3.4 文件描述符是非负整数, 打开现存文件或新建文件时, 内核会返回一个文件描 述符, 读写文件也需要使用文件描述符来指定待读写的文件 12.4.3.5 文件描述符的有效范围是 0 ---- open_max, 一般, 每个进程最多打开 65 个文件, freebsd5.2.1, mac os x 10.3和 solaris9则支持每个进程打开最多文件数和内存, int的大 小, 管理员设定有关, linux2.4.22 强制规定最多不超过 1048576 个. 12.4.3.6 fdopen(file_descriptor[, mode[, fuffer_size]]) 通过指定文件描述符, 模式, 缓 冲区大小打开一个文件. 由于缓冲区的存在, 最后需要显示的 flush()一下以清空缓 冲区 12.4.3.7 dup2(fd, fd2) 表示 fd 和 fd2 共享同一个文件表项, 也就是说他们的文件表指 针指向了同一个文件表项, 因此他们也就是共享了相同的文件 i/o…第一个参数必须 是已经存在的并且打开的合法的文件描述符, 而第二个参数可以是任意的文件描述 符 12.4.3.8 dup(fd) 返回一个和文件描述符 fd 同样的文件描述符, 这里是为了备份文件 描述符, 当一个文件描述符使用 dup2 进行重定向之前, 我们应该首先用 dup 拷贝一 份出来备份, 需要恢复的时候进行再次重定向. 它的语义是: 返回一个新的文件操 作符, 和原来的文件操作符 fd 共享一个文件表项 12.5 设备号 12.5.1 makedev() 从 major 和 minor 设备号创建一个原始设备号 13 os.path 模块的路径名访问函数 13.1 分隔 13.1.1 basename() 去掉目录路径, 返回文件名 13.1.2 dirname() 去掉文件名(自己的名字, 如果是文件夹就是文件夹名), 返回目录路径 13.1.3 join() 将分离的各部分组合成一个路径名…可以接受不定数量个参数. 13.1.4 split() 返回一个元组, 第一个元素是目录名, 第二个元素是文件名(或最后一层的 文件夹名) 13.1.5 splitdrive() 返回一个元组, 第一个元素是该路径所属的设备号(比如 C 盘), 第二 个元素是相对该设备的相对路径 13.1.6 splitext() 返回一个元组, 第一个元素是该路径的全路径(不含文件后缀名, 如果 末级是文件夹, 第二个元素为空), 第二个元素是文件的后缀名 13.2 信息 13.2.1 getatime() 返回最近访问时间 这里的返回时间的方法都是返回 int 型的秒数 13.2.2 getctime() 返回文件创建时间 13.2.3 getmtime() 返回最近文件修改时间 13.2.4 getsize() 返回文件大小 13.3 查询 13.3.1 exists() 判定文件/目录是否存在 13.3.2 isabs() 判定路径是否是绝对路径 13.3.3 isdir() 判定路径是否存在且为一个目录 13.3.4 isfile() 判定路径是否存在且为一个文件 13.3.5 islink() 判定路径是否存在且为一个符号链接 13.3.6 ismounts() 判定路径是否存在且为一个挂载点 13.3.7 samefile(path1, path2) 判定两个路径名是否指向同一个文件 14 永久存储模块 14.1 pickle 和 marshal: 一组最小化永久性存储模块(序列化). 可以用来转换并存储 python 对象. 是将 python的对象转换成一个二进制数据集合保存起来, 可以通过网络发送, 然 后重新把数据集合恢复成原来的对象格式, 也就是 java 中的序列化. 14.2 marshal和 pickle模块的区别在于 marshal只能处理简单的 python对象(数字, 序列, 映 射, 代码对象), 而 pickle还可以处理递归对象, 被不同地方多次引用的对象, 以及用户定 义的类和实例... 14.3 pickle 模块还有一个增强的版本叫 cPickle 14.4 *db*系列的模块使用传统的 DBM 格式写入数据… python 提供了 dbhash/bsddb, dbm, gdbm, dumbdbm 等多个 DBM 实现. 如果不确定, 使用 anydbm 模块, 它会自动检测系统 上已经安装的 DBM兼容模块, 选择’最好’的一个. dumbdbm模块是功能最少的, 没有其 他模块可用时, anydbm 才会选择它….这些模块的不足指出在于他们只能存储字符串, 不 能对 python 对象进行序列化 14.5 shelve 模块使用 anydbm 模块寻找合适的 DBM 模块, 然后使用 cPickle 完成对储存的转 换过程. shelve 模块允许对数据库文件进行并发的读访问, 但不允许共享读/写访问. 14.6 pickle 的使用 14.6.1 dump(obj, file, protocol = None): 接受一个数据对象和一个文件, 把数据对象以特 定的格式保存到给定的文件里. 14.6.2 load(file) 从文件中取出已经保存的对象. 15 相关模块: 15.1 base64 二进制字符串和文本字符串之间的编码/解码操作 15.2 binascii 二进制和 ascii 编码的二进制字符串间的编码/解码操作 15.3 bz2 访问 BZ2 格式的压缩文件 15.4 csv 访问 csv 文件(逗号分割文件) 15.5 filecmp 用于比较目录和文件 15.6 fileinput 提供多个文本文件的行迭代器 15.7 getopt/optparse 提供了命令行参数的解析/处理 15.8 glob/fnmatch 提供 Unix 样式的通配符匹配功能 15.9 gzip/zlib 读写 GNU zip(gzip)文件(压缩需要 zlib 模块) 15.10 shutil 提供高级文件访问能力 15.11 c/StringIO 对字符串对象提供类文件接口 15.12 tarfile 读写 TAR 归档文件, 支持压缩文件 15.13 tempfile 创建一个临时文件(名) 15.14 uu 格式的编码和解码 15.15 zipfi