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

2022-09-24 12:35:54

参见:廖雪峰的网站 :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)returnany_name

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

say_hello("2013-12-25")

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

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

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

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

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

【面向对象特性】:

【通用】:__slots__

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

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

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

2-双下划线

3-属性

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

【元类】类生成器:在python世界,拥有一个永恒的道,那就是“type”。道生一,一生二,二生三,三生万物。

1 道 即是 type2 一 即是 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中就是一个美丽的梦。

  • 作者:weixin_39552472
  • 原文链接:https://blog.csdn.net/weixin_39552472/article/details/110540442
    更新时间:2022-09-24 12:35:54