- 本复习笔记基本来自于网上复制
- 本复习笔记主要用途在于整理后放在手机上听
- 本复习资料主要给博主用
- 博主觉得不重要的、比如python基础语法什么的 、就不会给出了,系统学习请gayhub搜索。
Python
Python中的元类(metaclass)
- 拦截类的创建
- 修改类
- 返回修改之后的类
类变量和实例变量
class Person:
name="aaa"
p1=Person()
p2=Person()
p1.name="bbb"
print(p1.name) # bbb
print(p2.name) # aaa
print(Person.name) # aaa
Python自省
简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().
Python中单下划线和双下划线
foo:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突,就是例如__init__(),del(),call()这些特殊方法
_foo:一种约定,用来指定变量私有.程序员用来指定私 有变量的一种方式.不能用from module import * 导入,其他方面和公有一样访问;
__foo:这个有真正的意义:解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名,它无法直接像公有成员一样随便访问,通过对象名._类名__xxx这样的方式可以访问.
迭代器和生成器
问: 将列表生成式中[]改成() 之后数据结构是否改变?
答案:是,从列表变为生成器
迭代器:迭代器是一个可以记住遍历的位置的对象:next(iter([1,2,3,4]))
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
if self.a> 3:
raise StopIteration
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
生成器:使用了 yield
的函数被称为生成器(generator
),简单点理解生成器就是一个迭代器。
面向切面编程(AOP)和装饰器
被用于有切面需求的场景:插入日志、性能测试、事务处理等。
装饰器的作用就是为已经存在的对象添加额外的功能。
Python中重载
函数重载主要是为了解决两个问题。
可变参数类型。
可变参数个数。
Python 都不需要
新式类和旧式类
python的多父类继承问题
新式类继承是根据C3算法,旧式类是深度优先。
在Python3.6下,className.mro()查看继承顺序。
slots
__slots__是一个类变量,__slots__属性可以赋值一个包含类属性名的字符串元组, 或者是可迭代变量,或者是一个字符串,只要 在类定义的时候, 使用__slots__ = a Tuple来定义该属性就可以了。
__new__和__init__的区别
这个__new__确实很少见到,先做了解吧.
__new__是一个静态方法,而__init__是一个实例方法.
__new__方法会返回一个创建的实例,而__init__什么都不返回.
只有在__new__返回一个cls的实例时后面的__init__才能被调用.
当创建一个新实例时调用__new__,初始化一个实例时用__init__.
ps: __metaclass__是创建类时起作用.所以我们可以分别使用__metaclass__,__new__和__init__来分 别在类创建,实例创建和实例初始化的时候做一些小手脚.
单例模式
class Singleton(object):
def __new__(cls, *args, **kw):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance
class MyClass(Singleton):
a = 1
# --------------------
# 装饰器版本
def singleton(cls):
instances = {}
def getinstance(*args, **kw):
if cls not in instances:
instances[cls] = cls(*args, **kw)
return instances[cls]
return getinstance
@singleton
class MyClass:
...
# --------------------
# 作为python的模块是天然的单例模式
# mysingleton.py
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()
- 共享属性逻辑上也是单例模式
创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法。
class Borg(object):
_state = {}
def __new__(cls, *args, **kw):
ob = super(Borg, cls).__new__(cls, *args, **kw)
ob.__dict__ = cls._state
return ob
class MyClass2(Borg):
a = 1
Python中的作用域
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。
当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:
本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)
GIL线程全局锁
线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制, 说白了就是一个核只能在同一时间运行一个线程. 对于io密集型任务,python的多线程起到作用, 但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。
在python3.x中,GIL不使用ticks计数, 改为使用计时器(执行时间达到阈值后,当前线程释放GIL), 这样对CPU密集型程序更加友好, 但依然没有解决GIL导致的同一时间只能执行一个线程的问题
闭包
闭包可以保存当前的运行环境 闭包必须满足以下几点:
- 必须有一个内嵌函数
- 内嵌函数必须引用外部函数中的变量
- 外部函数的返回值必须是内嵌函数
Python函数式编程
- filter
>>>a = [1,2,3,4,5,6,7]
>>>b = filter(lambda x: x > 5, a)
>>>print b
>>>[6,7]
- map
>>> a = map(lambda x:x*2,[1,2,3])
>>> list(a)
[2, 4, 6]
- reduce
from functools import reduce
...: def c(x,y):
...: print(x,y)
...: return x*y
...: reduce(c,range(1,5))
1 2
2 3
6 4
Out[10]: 24
Python垃圾回收机制
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。 当一个对象有新的引用时,它的ob_refcnt就会增加, 当引用它的对象被删除,它的ob_refcnt就会减少. 引用计数为0时,该对象生命就结束了。
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发, 遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记, 然后清扫一遍 内存空间,把所有没标记的对象释放。
Python默认定义了三代对象集合,索引数越大,对象存活时间越长。
当某些内存块M经过了3次垃圾收集的清洗之后还存活时, 我们就将内存块M划到一个集合A中去,而新分配的内存都划分到集合B中去。 当垃圾收集开始工作时,大多数情况都只对集合B进行垃圾回收。
操作系统
select,poll和epoll
select有3个缺点:
- 连接数受限
- 查找配对速度慢
- 数据由内核拷贝到用户态
poll使用pollfd结构而不是select的fd_set结构,poll改善了第一个缺点。
epoll改了三个缺点. poll在“醒着”的时候只要判断一下就绪链表是否为空就行了
调度算法
-
高级调度(作业调度/长程调度)(频率低):将外存作业调入内存
-
低级调度(进程调度/短程调度)(频率高):决定就就绪队列中哪个进程获得处理机并执行
-
什么是调度?本质上就是一种资源分配
-
什么是饥饿?某写进程一直在等待,得不到处理
调度算法的分类
- 抢占式(当前进程可以被抢):可以暂停某个正在执行的进程,将处理及重新分配给其他进程
- 非抢占式(当前进程不能被抢走):一旦处理及分配给了某个进程,他就一直运行下去,直到结束
具体调度算法:
- 1.先来先服务(FCFS):按照到达顺序,非抢占式,不会饥饿
- 2.短作业/进程优先(SJF):抢占/非抢占,会饥饿
- 3.高响应比优先(HRRN):综合考虑等待时间和要求服务事件计算一个优先权,非抢占,不会饥饿
- 4.时间片轮转(RR):轮流为每个进程服务,抢占式,不会饥饿
- 5.优先级:根据优先级,抢占/非抢占,会饥饿
- 6.多级反馈队列:
- 设置多个就绪队列,每个队列的进程按照先来先服务排队,然后按照时间片轮转分配时间片
- 若时间片用完还没有完成,则进入下一级队尾,只有当前队列为空时,才会为下一级队列分配时间片。
- 抢占式,可能会饥饿
作业调度算法:
- 先来先服务调度算法
- 短作业优先调度算法
- 优先级调度算法
进程调度算法:
- 以上6种都可以是进程调度算法
死锁
原因:
- 竞争资源
- 程序推进顺序不当
必要条件:
- 互斥条件
- 请求和保持条件
- 不剥夺条件
- 环路等待条件
处理死锁基本方法:
- 预防死锁(摒弃除1以外的条件)
- 避免死锁(银行家算法)
- 检测死锁(资源分配图)
- 解除死锁: 剥夺资源 or 撤销进程
页面置换算法
- 最佳置换算法OPT: 不可能实现
- 先进先出FIFO
- 最近最久未使用算法LRU:最近一段时间里最久没有使用过的页面予以置换.
- clock算法
边沿触发和水平触发
边缘触发是指每当状态变化时发生一个 io 事件,条件触发是只要满足条件就发生一个 io 事件
Python中异步编程关键字都有什么?在Python中异步编程与Generator,协程,线程之间有什么关系?
yeild async await Generator 是一个异步实现的生成器 ,是协程 。 协程是用户态的线程。
Python中装饰器的本质相当于什么?
装饰器的本质是一个闭包函数,而闭包函数的本质是变量作用域的外溢。 (外层函数中包裹的内部函数可使用外层函数的参数,以及接受其值)
怎么获取xx端口对应的进程并杀掉它的linux命令
sudo lsof -i:端口号 //查找对应的进程号
sudo kill -9 进程号 //杀死对应的进程
筛选Linux 10-15k 大小的文件
find -size +10k -15k