├── .gitignore ├── README.md ├── socket ├── clientSocket.py └── serverSocket.py ├── 对象序列化 ├── In.py ├── Out.py ├── __pycache__ │ └── customserializer.cpython-32.pyc ├── customserializer.py ├── entry.json ├── entry.pickle ├── pickleversion.py └── 序列化笔记.md └── 正则式 └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.py[cod] 2 | 3 | # C extensions 4 | *.so 5 | 6 | # Packages 7 | *.egg 8 | *.egg-info 9 | dist 10 | build 11 | eggs 12 | parts 13 | bin 14 | var 15 | sdist 16 | develop-eggs 17 | .installed.cfg 18 | lib 19 | lib64 20 | 21 | # Installer logs 22 | pip-log.txt 23 | 24 | # Unit test / coverage reports 25 | .coverage 26 | .tox 27 | nosetests.xml 28 | 29 | # Translations 30 | *.mo 31 | 32 | # Mr Developer 33 | .mr.developer.cfg 34 | .project 35 | .pydevproject 36 | __pycache__ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DiveIntoPython3 2 | =============== 3 | 4 | 深入 Python 3 5 | 6 | "Tempora mutantur nos et mutamur in illis. (时光流转,吾等亦随之而变。)" — 古罗马谚语 7 | 8 | - [python3.x 入门指南](http://www.pythondoc.com/pythontutorial3/index.html) 9 | - [python2.x 入门指南](http://www.pythondoc.com/pythontutorial27/index.html) 10 | - [相关书籍集合](https://github.com/justjavac/free-programming-books-zh_CN) -------------------------------------------------------------------------------- /socket/clientSocket.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #coding:utf-8 3 | import socket 4 | import time 5 | c = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 | c.connect(('127.0.0.1', 9999)) 7 | while True: 8 | x = raw_input("me say:") 9 | c.send(x) 10 | print c.recv(1024) 11 | time.sleep(1) 12 | c.close() 13 | -------------------------------------------------------------------------------- /socket/serverSocket.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | #coding:utf-8 3 | import socket 4 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 5 | s.bind(('127.0.0.1', 9999)) 6 | s.listen(10) 7 | while True: 8 | print "waiting for connect...." 9 | conn, addr = s.accept() 10 | #addr是个元组, addr[0]是ip地址 11 | print "connected with client: ", addr[0] 12 | while True: 13 | conn.send("welcome to mini server ") 14 | strrecv = conn.recv(1024) 15 | print strrecv 16 | #释放资源 17 | s.close() 18 | -------------------------------------------------------------------------------- /对象序列化/In.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on 2013-5-3 3 | 4 | @author: miracle 5 | ''' 6 | import json 7 | import pickle 8 | from customserializer import from_json 9 | with open('entry.pickle', 'rb') as f: 10 | entry = pickle.load(f) 11 | print(entry) 12 | 13 | with open('entry.json', 'r', encoding='utf-8') as f: 14 | #print (json.load(f)) 15 | print(json.load(f, object_hook = from_json)) -------------------------------------------------------------------------------- /对象序列化/Out.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on 2013-5-3 3 | 4 | @author: miracle 5 | ''' 6 | import json 7 | import pickle 8 | import time 9 | from customserializer import to_json 10 | entry = {} 11 | entry['title'] = 'Dive into history, 2009 edition' 12 | entry['comments_link'] = None 13 | entry['internal_id'] = b'\xDE\xD5\xB4\xF8' 14 | entry['tags'] = ('diveintopython', 'docbook', 'html') 15 | entry['published'] = True 16 | entry['published_date'] = time.strptime('Fri Mar 27 22:20:42 2009') 17 | 18 | with open("entry.pickle", 'wb') as f: 19 | pickle.dump(entry, f,) 20 | with open("entry.json", mode='w', encoding='utf-8') as f: 21 | json.dump(entry, f, default=to_json, ) -------------------------------------------------------------------------------- /对象序列化/__pycache__/customserializer.cpython-32.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tqcenglish/PythonHelp/a24158c0c06075f7b52ca215c4348b6ca68f8749/对象序列化/__pycache__/customserializer.cpython-32.pyc -------------------------------------------------------------------------------- /对象序列化/customserializer.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on 2013-5-3 3 | 4 | @author: miracle 5 | ''' 6 | import time 7 | def to_json(python_object): 8 | print(python_object) 9 | if isinstance(python_object, bytes): 10 | return {'__class__' : 'bytes', '__value__':list(python_object)} 11 | if isinstance(python_object, time.struct_time): 12 | return {'__class__': 'time.asctime', '__value__': time.asctime(python_object)} 13 | raise TypeError(repr(python_object) + 'is not JSON serializable') 14 | def from_json(json_object): 15 | if '__class__' in json_object: 16 | if json_object['__class__'] == 'time.asctime': 17 | return time.strptime(json_object['__value__']) 18 | if json_object['__class__'] == 'bytes': 19 | return bytes(json_object['__value__']) 20 | return json_object 21 | -------------------------------------------------------------------------------- /对象序列化/entry.json: -------------------------------------------------------------------------------- 1 | {"comments_link": null, "internal_id": {"__class__": "bytes", "__value__": [222, 213, 180, 248]}, "tags": ["diveintopython", "docbook", "html"], "published_date": [2009, 3, 27, 22, 20, 42, 4, 86, -1], "published": true, "title": "Dive into history, 2009 edition"} -------------------------------------------------------------------------------- /对象序列化/entry.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tqcenglish/PythonHelp/a24158c0c06075f7b52ca215c4348b6ca68f8749/对象序列化/entry.pickle -------------------------------------------------------------------------------- /对象序列化/pickleversion.py: -------------------------------------------------------------------------------- 1 | ''' 2 | Created on 2013-5-3 3 | 4 | @author: miracle 5 | ''' 6 | import pickletools 7 | def protocol_version(file_object): 8 | maxproto = -1 9 | for opcode, arg, pos in pickletools.genops(file_object): 10 | maxproto = max(maxproto, opcode.proto) 11 | return maxproto 12 | if __name__ == "__main__": 13 | with open('entry.pickle', 'rb') as f: 14 | v = protocol_version(f) 15 | print(v) 16 | -------------------------------------------------------------------------------- /对象序列化/序列化笔记.md: -------------------------------------------------------------------------------- 1 | # Pickle 2 | 3 | Pickle是Python标准库的一部分,他是用C编写,可以序列化任意复杂的Python数据结构。 4 | 支持原生类型:布尔, 整数, 浮点数, 复数, 字符串, 字节串对象, 字节数组, NoneNOne 5 | 支持任何原生类型组成的列表, 元组, 字典, 集合, 以及它们的嵌套 6 | 支持函数, 类, 类的实例 7 | 它本身可扩展 8 | pickle模块 使用一个被称为“pickle协议”的东西序列化该数据结构。 9 | pickle 协议是Python特定的,没有任何跨语言兼容的保证。 10 | 并非所有的Python数据结构都可以通过pickle模块序列化。 11 | 除非你指定,pickle模块中的函数将使用最新版本的pickle协议。 12 | 最新版本的pickle协议是二进制格式的。请确认使用二进制模式来打开你的pickle文件,否则当你写入的时候数据会被损坏。 13 | pickle.load()函数接受一个流对象, 从流中读取序列化后的数据,创建一个新的Python对象, 14 | 在新的Python对象中重建被序列化的数据,然后返回新建的Python对象。 15 | time 模块包含一个表示时间点(精确到1毫秒)的数据结构(time_struct)以及操作时间结构的函数。 16 | strptime()函数接受一个格式化过的字符串并将其转化成一个time_struct。这个字符串使用的是默认格式,但你可以通过格式化代码来控制它。 17 | with 语句中来保证在你完成的时候文件自动被关闭。 18 | 序列化到一个内存中的bytes对象 19 | pickle.dumps()函数(注意函数名最后的's')执行和pickle.dump()函数相同的序列化。 20 | 取代接受流对象并将序列化后的数据保存到磁盘文件,这个函数简单的返回序列化的数据。 21 | 在pickle协议里面没有明确的版本标志。为了确定保存pickle文件时使用的协议版本, 22 | 你需要查看序列化后的数据的标记(“opcodes”)并且使用硬编码的哪个版本的协议引入了哪些标记的知识(来确定版本号)。 23 | pickle.dis()函数正是这么干的,并且它在反汇编的输出的最后一行打印出结果。 24 | 25 | # json 26 | 同 pickle模块类似, json模块包含一些函数,可以序列化数据结构, 27 | 保存序列化后的数据至磁盘,从磁盘上读取序列化后的数据, 28 | 将数据反序列化成新的Pythone对象。但两者也有一些很重要的区别。 29 | 首先, json数据格式是基于文本的, 不是二进制的。 30 | 第二,由于是文本格式, 存在空白(whitespaces)的问题。 31 | json 允许在值之间有任意数目的空白(空格, 跳格, 回车,换行)。空白是“无关紧要的”。 32 | 第三, 字符编码的问题是长期存在的。json 用纯文本编码数据, 但是你知道, “不存在纯文本这种东西。” 33 | json必须以Unicode 编码(UTF-32, UTF-16, 或者默认的, utf-8)方式存储 34 | 35 | 笔记 JSON Python 3 36 | object dictionary 37 | array list 38 | string string 39 | integer integer 40 | real number float 41 | * true True 42 | * false False 43 | * null None 44 | * 所有的 json 值都是大小写敏感的。 45 | json 有数组类型, json 模块将其映射到Python的列表, 但是它没有一个单独的类型对应 “冻结数组(frozen arrays)” (元组)。 46 | 而且尽管 json 非常好的支持字符串,但是它没有对bytes 对象或字节数组的支持。 47 | json模块提供了编解码未知数据类型的扩展接口。 48 | 49 | json 并不区分元组和列表;它只有一个类似列表的数据类型,数组, 50 | 并且json模块在序列化过程中会安静的将元组和列表两个都转换成json 数组。 51 | 大多数情况下,你可以忽略元组和列表的区别,但是在使用json 模块时应记得有这么一回事。 -------------------------------------------------------------------------------- /正则式/README.md: -------------------------------------------------------------------------------- 1 | # Python核心编程 2 | 3 | 1. 在 Python专门术语中,有两种主要方法完成模式匹配:搜索(searching)和匹配(matching)。搜索,即在字符串任意部分中查找匹配的模式,而匹配是指,判断一个字符串能否从起始处全部或部分的匹配某个模式。搜索通过 search()函数或方法来实现,而匹配是以调用 match()函数或方法实现的 4 | 5 | 1. 元字符(metacharacters)——特殊字符和符号 6 | ``` shell 7 | 记号 说明 例子 8 | literal 匹配字符串的值 foo 9 | re1|re2 匹配re1或re2 boo|bar 10 | . 匹配任何字符(换行符除外) b.b 11 | ^ 匹配字符串的开始 ^Dear 12 | $ 匹配字符串的结尾 /bin/*sh$ 13 | * 匹配前面的正则式零或多次 [A-Za-Z0-9]* 14 | + 匹配前面的正则式一次或多次 [a-z]+\.com 15 | ? 匹配前面的正则式零次或多次 goo? 16 | {N} 匹配前面的正则式N次 [0-9]{3} 17 | {M, N} 匹配出现M次到N次的正则式 ·0-9[{5-9} 18 | [...] 匹配出现的任意一个字符 [aeiou] 19 | [...a-z..] 匹配出现在a到z的一个字符 [A-Za-z] 20 | [^...] 不匹配出现的任何一个字符 [^aeiou] 21 | (...) 匹配括号中RE,并保存为子组 ([0-9){3}) 22 | \d 匹配任何数字(\D反意) data\d.txtd 23 | \w 匹配任何数字字母字符(\W反意) 24 | \s 匹配任何空白符(\S反意) 25 | \b 匹配单词边界(\B反意) \bThe\b 26 | \c 逐一匹配特殊字符 27 | \A (\Z) 匹配字符串的起始(结束) 28 | ``` 29 | 30 | 1. 问号有两种含义:1.单独使用时表示匹配出现零次或一次的情况, 31 | 1. 紧跟在表示重复的元字符后面时,表示要求搜索引擎匹配的字符串越短越好。例如:(+?) 32 | 33 | 1.例子 34 | 正则表达式模式 匹配的字符串 35 | \w+-\d+ 一个由字母或数字组成的字符串,和至少一个数字,两部分中间由连字符连接 36 | [A-Za-z]\w* 第一个字符是字母,其余字符(如果存在的话),是字母或数字(它几乎等价于 Python 语言中合法的标识符 37 | \d{3}-\d{3}-\d{4} (美国)电话号码,前面带区号前缀,例如 800-555-1212 38 | \w+@\w+\.com 简单的 XXX@YYY.com 格式的电子邮件地址 39 | \d+(\.\d*)? 表示简单的浮点数 40 | Mr?s?\. )?[A-Z][a-z]* [ A-Za-z-]+ 名字和姓氏,对名字的限制(首字母大写,其它字母(如果存在)小写), 全名前有可选的称谓(“Mr.,”“Mrs.,” “Ms.,” 或 “M.,”),姓氏没有什么限制,允许有多个单词、横线、大写字母 41 | 42 | 1. 一对圆括号(()) 和正则表达式一起使用时可以实现以下任意一个(或两个)功能: 43 | * 对正则表达式进行分组 44 | * 匹配子组 --------------------------------------------------------------------------------