8_class_object
Class and Object类和对象改变对象的字符串显示改变一个实例的字符串表示可以通过重定义它的 __str()__ 和 __repr()__ 方法。 12345678910class Pair: def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return '({0.x!r}, {0.y!r})'.format(self) def __str__(self): return 'Pair({0.x!s}, {0.y!s})'.format(self) __str()__ 体现:print() 函数 __repr()__ 体现:交互式解释器内容 自定义字符串的格式化123456789101112131415161718192021_formats = { 'ymd...
7_function
Function函数可接受任意数量参数的函数如果想要构造一个可接受任意数量参数的函数,可以使用 * 参数来定义该函数: 12345def avg(first, *others): return (first + sum(others)) / (1 + len(others))print(avg(1,2)) # 1.5print(avg(1,2,3,4,5)) # 3 为了接受任意数量的关键字参数,可以使用以 ** 开头的参数定义函数: 1234def foo(attr1, attr2, **attrs): print(attr1, attr2, attrs)foo(1, 2, n=1, m=2) # 1 2 {'n':1,'m':2} 综上所述,*args 和 **kwargs 分别是第一章介绍的压缩和字典参数。要求 *args 只能放在最后一个位置参数后面,**kwargs 只能放在最后一个参数后面。 只接受关键字参数的函数将强制关键字参数放到某个 * 参数或者单个 * 后面就能...
6_data_coding
Data and Coding数据编码和处理读写 csv 文件csv 文件为逗号分隔符文件,指定逗号作为每一项数据的分隔符,存储维护一个类似表格的文件。对于 Python 来说,一般用 csv 库解决它的读写问题。 读 csv 文件 将 csv 文件中的数据读取为一个元组的序列: 1234567import csvwith open("data.csv") as f: f_csv = csv.reader(f) headers = next(f_csv) # 取第一行数据,一般而言第一行是标题 for row in f_csv: pass # row:数据行,是一个列表,通过下标取数据。 下标访问数据可能会引起混淆,可以考虑使用命名元组。 12345678from collections import namedtuplewith open("data.csv") as f: f_csv = csv.reader(f) headers = next(f_c...
5_file_io
File and IO文件和IO读写文本数据12with open("text.txt", "rt", encoding="utf-8") as f: pass 打印输出到文件中12with open("text.log", "wt") as f: print("Test log", file=f) 使用其它分隔符或打印终止符打印12345print('abcd', 1234, sep=',', end='\t')row = ('abcd', 1234, 'bcda', 3)print(','.join(str(x) for x in row))print(*row, sep=",") 读写字节数据12with open("text.bin", "rb") as f:...
4_iterator_generator
Iteration and Generator迭代器和生成器手动遍历迭代器手动调用 next() 函数来遍历迭代器,并在代码中捕获 StopIteration 异常。 12345678def iter(): with open('/etc/passwd') as f: try: while True: line = next(f) print(line, end="") except StopIteration: pass 通常来说,StopIteration 即作为迭代器的终点。不过在调用 next() 函数的时候,可以指定终点的标记如: 1line = next(f, None) 代理迭代当你构建了一个自定义的容器对象,内部包含有列表等可迭代对象,如果你想直接在这个新的容器对象中执行迭代操作,实际的操作是定义一个 __iter__() 方法,将迭代操作代理到容器内部的对象上去。 1234567891...
3_class
类与继承作为一门面向对象的编程语言,Python 提供了多态、继承、封装等各种面向对象的特性。 22. 尽量用辅助类来维护程序的状态,而不要用字典和元组尽管 Python 的 dict 基本上可以实现大多数的数据结构,但是为了代码含义的明了以及子功能扩展的方便,应当尽量多的拆分出类。例如有一个 Student 的类,包含了学生的种种科目的成绩和评语,应当新建一个 Subject 类存放科目信息而不是在 Student 内的一个 grade 的内部变量中赋值。 不要使用包含其他字典的字典,也不要使用过长的元组。 如果容器中包含简单而又不可变的数据,可以优先使用 namedtuple 来表示,后期再修改为一个完整的类。 保存内部状态的字典如果变的比较复杂就该考虑拆分一个新的类出来。 23. 简单的接口应该接受函数,而不是类的实例Python 中有很多内置的 API,都允许调用者传入函数以定制其行为。API 在执行的时候,会通过执行这些 hook 函数回调函数内的代码。其他的编程语言中会用抽象类来定义 hook,然而在 Python 中,很多挂钩只是无状态的函数,这些函数有明确的参数和...
2_function
函数18. 用数量可变的位置参数减少视觉杂讯首先看第一段代码: 1234567891011def foo(message, values): if not values: print(message) else: print("%s: %s"%(message, ",".join([str(v) for v in values])))foo("my numbers are", [1,2,3])# my numbers are: 1,2,3foo("no numbers.", [])# no numbers. 可以看出,第二次不输入 values 时的调用不是很优雅,而由于之前定义过 foo 函数必须要传 values 这个参数,因此只能按照这样的调用方法。为了避免这样没有意义的空 list 传入,可以使用 * 星号参数来避免掉第二次调用的空 list。修改后的代码如下: 1234567891011def foo(message, *values): if...
1_pythonic
用 Pythonic 方式来思考1. 确认自己使用的 Python 版本没啥好讲的,主要 Python 2 跟 Python 3 有一部分语法的区别。 2. 遵循 PEP8 风格指南 使用空格来表示缩进,而不要使用 tab 12def foo(): pass 和语法有关的每一层缩进都用 4 个空格表示 12def foo(): print("4 spaces") 每行的字符数不该超过 79 个 对于占据多行的长表达式来说,除了首行之外的其余各行都应该在通常的缩进级别上再加上四个空格 1234def foo(): print(1111111111111111111111111111, 1111111111, "前面有 8 个空格", 222222 ) 文件中的函数和类之间应该用两个空行隔开 在同一个类中,各个方法之间应该用一个空行隔开 123456789101112class Cls(): def __init__(): pass def foo(): ...
8_running_and_deploying
运行和部署您无需配置 WSGI 容器来查找您的应用程序,只需编写一个启动服务器的 main() 函数即可。 1234567def main(): app = make_app() app.listen(8080) IOLoop.current().start()if __name__ == "__main__": main() 进程和端口由于Python GIL(全局解释器锁)的存在,需要运行多个Python进程才能充分利用多CPU机器。 Tornado 包含一个内置的多进程模式,可以同时启动多个进程。这需要对标准 main 函数稍作修改: 123456def main(): app = make_app() server = tornado.httpserver.HTTPServer(app) server.bind(8080) server.start(0) # fork on process per CPU IOLoop.current().start() 这是启动多个进程并让它们共享同一端口的最...
7_auth_and_security
身份验证和安全Cookie 和安全 Cookie您可以使用 set_cookie 方法在用户浏览器中设置 cookie。 1234567class MainHandler(tornado.web.RequestHandler): def get(self): if not self.get_cookie("mycookie"): self.set_cookie("mycookie", "myvalue") self.write("Set your cookie success.") else: self.write("Your cookie is set.") Cookie 并不安全,并且很容易被客户修改。如果您需要设置 cookie 来识别当前登录的用户,则需要对 cookie 进行签名以防止伪造。 Tornado 支持使用 set_secure_cookie 和 get_secu...