Python常被称为玩具语言。很多人看不起python,认为它不如Java、golang、c之类的语言效率高,不如bash之类的脚本语言正统。不过,我觉得说存在也是有道理的,尤其是python占据了这么多的市场份额,就足以说明它的使用价值了。我们都知道python非常简单易学,那么python就没有复杂的技术需要深入研究吗?接下来说说python中不简单的技术。元编程简单地说,元编程就是一种可以操作目标语言的语言。比如我有一个类,我想在生成类的时候获取类的信息,那么这个过程就是元编程。如果你了解过反射,你会发现它与反射非常相似。是的,反射是一种实现元编程的方式。在python中,元编程一般是通过magicmethods、descriptor、metaclasses和eval来实现的。GILGIL的全称是globalinterpreterlock,简称全局解释器锁。我们都知道操作系统调度的最小单位是线程,一个进程中可以有多个线程。多个线程并发运行时,可能会修改同一块内存,导致数据不一致。为了解决这个问题,cpython解释器会让每个线程都获得GIL。只有成功获取GIL的线程才能执行,其他线程需要等待,这也是为什么python的线程并发是伪并发的原因。那么如何更好的利用多核cpu,最简单的方法就是使用多进程,因为GIL在线程中是唯一的,不需要在进程中获取,所以程序的并发执行可以通过运行多个进程来实现。协程我们知道操作系统调度的最小单位是线程,那么什么是协程呢?通俗的说,协程就是一个用户态线程,也就是说我们封装了一个线程,我们可以在这个线程里面进行调度,当执行耗时操作的时候,我们放弃已经执行的任务去执行其他的任务,也就是,让CPU看到我们的线程一直在执行任务,没有等待。在python中,yield关键字用于调度协程,可以通过yield保存任务状态,通过send关键字可以将函数结果传递给另一个函数。ContextManager我们平时操作文件或者数据库的时候,用完之后需要手动关闭。有没有办法让我们自动释放资源呢?答案是肯定的,我们可以使用with关键字。withopen('test.txt')asf:printf.readlines()通过这个操作,我们会在函数执行后自动释放文件资源。上下文管理器是如何实现的?它的原理是它的底层实现了__enter__和__exit__方法,这样在执行函数体之前,我们可以先执行enter方法,执行完函数体后,再执行exit方法。contextmanager可以通过python中的contextlib装饰器优雅的实现。顾名思义,装饰器就是对函数的装饰。它在不修改函数体内容的情况下装饰函数,使其看起来与众不同。在python中通过在函数前面加上@符号,可以很方便的对函数进行修饰。很多日志功能和授权功能会通过装饰器的使用变得更加优雅。闭包闭包是很多语言都有的一个概念。在python中,闭包是函数的嵌套,但这并不是简单的函数嵌套。它需要满足几个条件。外部函数的返回值是对内部函数nonlcoal的引用修改外部参数Python可以通过使用闭包更方便的实现装饰器。
