Python基础还是照着廖雪峰的教程撸了一遍。
教程的学习路线开始太过平缓,后期直线上升很容易扯着蛋~

基础(趟一遍)

PS. Basic on python 3.5 (所有源码 –> source code)

Func(函数)

Decorator

如上面的例子,装饰如果嵌套太多容易混。没有参数的装饰器比较容易理解,但是有参数的比如一个函数参数是一个返回函数然后这个函数返回结果做为参数传递给另一个函数。Fun(A)(p1=Func(B)(p2=Func(C)(p3='')))
装饰器函数也可以简单理解成闭包。

1
2
3
4
5
6
7
8
9
10
import functools

def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator

OOP

Class: [ex_element.py], Instance: [ex_instance.py], Property: [ex_property.py]以及类的初始化,封装继承[ex_extend.py]与多态。

PS: __init__初始化的第一个参数永远是self,表示创建的实例本身。如果属性的变量名是以__开头,那么这是一个私有(private)变量,只允许类内部访问。如果获取一个对象的所有属性和方法,使用dir()函数,判断对象是哪种类型使用isinstance(object, Type)

IO(文件操作和序列化)

文件操作operation_file.py, 引入with的好处是默认调用close方法,因为实现try...finally语句块,无论文件操作出现任何异常最后都能关闭文件操作。

序列化简单用pickle模块ex_pickle.pyjson模块ex_json.py

PS: pickle主要用于Python特定二进制格式之间的转换,json对象反序列化成instance对象,编写转换函数(见上述例子)即可实现。后面会介绍其它的反序列化方法。

Thread(线程)

首先python的多线程多适用于IO密集型,如果是CPU密集型,python的多线程不如单线程效率高。如果在CPU密集型中使用concurrent需要导入multiprocessing库,这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。

基本用法:[ex_thread.py]
进程:[ex_process.py]
队列及锁:[ex_queue.py, ex_lock.py]
分布式进程:[task_master.py, task_worker.py]

Async(异步)

异步IO的核心是协程(Coroutine),协程没有线程的安全问题,一个进程可以同时存在多个协程,但同时只有一个协程是激活的,而且协程的激活和休眠又通过程序来控制,而不是操作系统控制的。
并且最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,因此没有线程切换的开销,和多线程比线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

通常用法是多进程+协程,生产者-消费者模型:[coroutine.py]

asynicio类库是python3.4支持异步IO的标准库。教程里有两个简单例子[async_hello.py, async_wget.py]需要重点理解下@asyncio.coroutine, 另外在python3.5后引入了asyncawait等价于@asyncio.coroutine <=> async, yield from <=> await

线程和异步这一块,看的时候就头大,后面还会再研究~

References:
A Curious Course on Coroutines and Concurrency
python多线程
为什么有人说 Python 的多线程是鸡肋呢?