点这里,搜索淘宝优惠券!
点这里,搜索淘宝优惠券!

(×)python进阶-重点难点汇总

参见:廖雪峰的网站 :https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000

【函数】:

  【参数】:位置参数,默认参数,变长参数(收集参数与收集参数的逆过程)

  【高阶函数】:函数的函数-传入函数作为参数-map函数,reduce函数,filter函数以及

  【返回函数】:闭包-函数中定义函数,并返回函数,返回的函数在调用时才执行

  【匿名函数】:lambda表达式-语法: lambda 参数1,参数2:表达式

  【装饰器】:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),decorator就是一个返回函数的高阶函数,目的是为了再不改变函数的前提下扩展函数的功能

def log(func): #定义装饰器 log,返回内部定义的函数
    def any_name(*args, **kw):
        print ('call %s():' % func.__name__)
        return func(*args, **kw)
    return any_name

@log #解析到此处时,将执行 say_hello = log(say_hello) 函数,并将参数传递给内部定义的函数。now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的any_name()函数。
def say_hello(s):
    print(s)
say_hello("2013-12-25")

  【偏函数】:通过设定参数的默认值,可以降低函数调用的难度.

魔法方法】:以__开头和结尾的函数,当执行特殊的操作时会直接调用此函数

【迭代器】:(列表生成表达式)__next__

【生成器】:yield关键字,节省内存,

装饰器】:@property装饰器,把方法变成属性

【面向对象特性】:

  【通用】:__slots__

  【多重继承】:构造函数执行顺序问题

  【封装】:针对属性而言,外部不能直接访问对象的属性——违背了封装的思想

    1-单下划线,可以访问,但不建议访问

    2-双下划线

    3-属性

  【多态】:针对绑定方法而言,不知道具体类型的前提下,调用相应的方法

【元类】类生成器:在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中就是一个美丽的梦。

 

posted @ 2018-09-18 17:08  chd_ailex  阅读(1373)  评论(0编辑  收藏  举报