Python的一些高级特性
函数相关
关键字参数
|
|
示例一:
|
|
示例二:
|
|
高阶函数
一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数
- 变量可以指向函数
|
|
- 函数名也是变量
|
|
- 传入参数
|
|
内建map()
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回
|
|
内建reduce()
reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
示例一:
|
|
示例二:
|
|
内建filter()
filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
|
|
- 内建sorted()
示例一:
|
|
示例二:
|
|
返回函数
|
|
装饰器
在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
示例一:
|
|
把@log放到now()函数的定义处,相当于执行了语句:
|
|
由于log()是一个decorator,返回一个函数,所以,原来的now()函数仍然存在,只是现在同名的now变量指向了新的函数,于是调用now()将执行新函数,即在log()函数中返回的wrapper()函数。
示例二:
|
|
示例三:
|
|
面向对象
属性、方法的动态绑定和限制
一、属性的动态绑定
|
|
二、方法的动态绑定
|
|
三、类的方法绑定
|
|
四、限制动态添加
Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class能添加的属性
|
|
slots定义的属性仅对当前类起作用,对继承的子类是不起作用
安全简洁的属性
Python内置的@property装饰器就是负责把一个方法变成属性调用
|
|
多进程和多线程
多进程
Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。
示例一:
|
|
示例二:
|
|
多线程
Python的标准库提供了两个模块:thread和threading,thread是低级模块,threading是高级模块,对thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。
|
|
线程加锁
|
|
因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
简单爬虫
|
|