【函数】:
【参数】:位置参数,默认参数,变长参数(收集参数与收集参数的逆过程)
【高阶函数】:函数的函数-传入函数作为参数-map函数,reduce函数,filter函数以及
【返回函数】:闭包-函数中定义函数,并返回函数,返回的函数在调用时才执行
【匿名函数】:lambda表达式-语法: lambda 参数1,参数2:表达式
【装饰器】:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),decorator就是一个返回函数的高阶函数,目的是为了再不改变函数的前提下扩展函数的功能
now()
log()
any_name()
【偏函数】:通过设定参数的默认值,可以降低函数调用的难度.
【魔法方法】:以__开头和结尾的函数,当执行特殊的操作时会直接调用此函数
【迭代器】:(列表生成表达式)__next__
【生成器】:yield关键字,节省内存,
【装饰器】:@property
装饰器,把方法变成属性
【面向对象特性】:
【通用】:__slots__
【多重继承】:构造函数执行顺序问题
【封装】:针对属性而言,外部不能直接访问对象的属性——违背了封装的思想
1-单下划线,可以访问,但不建议访问
2-双下划线
属性
【多态】:针对绑定方法而言,不知道具体类型的前提下,调用相应的方法
【元类】类生成器:在python世界,拥有一个永恒的道,那就是“type”。道生一,一生二,二生三,三生万物。
1 道 即是 type
2 一 即是 metaclass(元类,或者叫类生成器)
3 二 即是 class(类,或者叫实例生成器)
4 三 即是 instance(实例)
5 万物 即是 实例的各种属性与方法,我们平常使用python时,调用的就是它们。
【面向对象变成实践】:自定义类、枚举类
【错误处理】
【单元测试】:编写单独的测试模块,覆盖测试各种情况
【多进程】 :fork()函数与 multiprocessing 模块
【多线程】:thread 与 threading lock ThreadLocal-维护每个线程的全局变量
1 启动与CPU核心数量相同的N个线程,在4核CPU上可以监控到CPU占用率仅有160%,也就是使用不到两核。
2
3 即使启动100个线程,使用率也就170%左右,仍然不到两核。
4
5 但是用C、C++或Java来改写相同的死循环,直接可以把全部核心跑满,4核就跑到400%,8核就跑到800%,为什么Python不行呢?
6
7 因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。
8 这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
9 GIL是Python解释器设计的历史遗留问题,通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。
10
11 所以,在Python中,可以使用多线程,但不要指望能有效利用多核。如果一定要通过多线程利用多核,那只能通过C扩展来实现,不过这样就失去了Python简单易用的特点。
12
13 不过,也不用过于担心,Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。
1 多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要小心死锁的发生。
2
3 Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。多线程的并发在Python中就是一个美丽的梦。