python是解释型语言
- python是顺序执行的,没有静态检查,没有编译链接过程,可以交互式运行
- 编译型语言是先编译全部代码,再运行。解释型语言是一条条运行。
- 编译型的类型不对,是编译的时候抛出错误,而python是运行时抛出错误
python的优点和缺点
优点:
- 解释型语言,简单易懂,可读性强
- 有很多库,利于功能实现
- 可扩展,和其他语言有可连接的接口
- 免费开源,可移植
缺点:
- 解释型语言运行速度慢
- 动态语言特点,增加运行时错误
面向对象和面向过程区别
面向对象:将问题分成各个对象,建立对象来描述解决问题的行为。(优点:易维护,缺点:性能差)
面向对象的三大特性:(类定义了该集合中每个对象所共有的属性和方法,对象就是类的实例)
- 封装:
- 设置private访问权限
- 设置get set方法来访问相关属性
- 继承:
- 子类继承父类的属性和方法(对象就是类的实例)
- 多态
- 方法:重写、复写方法
- 对象:父类子类之间的转型
面向过程:分析解决问题的步骤,用函数一步步实现,需要使用的时候再调用函数。 (优点:性能好,缺点:需要创建实例开销大)
python实现多线程
- threading包,新建线程
import time, threading # 新线程执行的代码: def loop(): print('%s is running...' % threading.current_thread().name) n = 0 while n < 5: n = n + 1 print('%s >>> %s' % (threading.current_thread().name, n)) time.sleep(1) print('%s ended.' % threading.current_thread().name) print('%s is running...' % threading.current_thread().name) t = threading.Thread(target=loop, name='LoopThread') t.start() t.join() print('%s ended.' % threading.current_thread().name)
start启动线程,并把需要并行处理的代码放在run中,start启动线程会自动调用run方法
run实际运行的内容,可以被继承,也可以重写
join阻塞调用它的进程,直到等待被调用的进程结束,这里阻塞的是mainThread。 - 用GIL(全局解释锁)实现线程通信。GIL能保证一次执行一个线程,线程轮流保存GIL,在传给其他线程前执行一些操作,以实现多进程轮流运行,近似并行。
- python的多线程其实是并发的,是交替进行的。保证了数据的原子操作的线程安全
python内存管理
- 引用计数:记录对象有多少个引用。创建对象就创建了一个引用计数,引用计数为0时候被垃圾回收
- 垃圾回收:检查引用计数为0的对象,清理该对象的内存,循环引用对象就用循环垃圾回收器回收。释放的内存放到了内存池而不是返回给操作系统。
- 内存池机制:python运行时会不断申请和释放小块的内存,影响执行效率,引用内存池机制管理小块内存的申请和释放。
- 小于256字节的对象用pymalloc分配内存,大对象用系统的malloc。
- python的list,int,float...都有其独立的私有内存池。eg:int的内存释放后,float不能使用这块内存
python垃圾回收机制
自动处理分配回收内存的问题:没用了有内存泄漏的隐患
引用计数为主,标记清楚 和 分代收集 两种机制为辅
创建对象就创建了一个引用计数,有引用就增加,删除就减小,引用计数为0时,内存会被垃圾回收
缺点:当A B互相引用,且没有其他对象引用他们,则两段内存永远无法回收
python装饰器
功能:引入日志,函数执行时间统计,执行函数前预备处理,执行函数后清理功能,权限校验,缓存
- @staticmethod:静态方法(使用此方法不用对类进行实例化)
- @classmethod:类方法,类在使用时将类本身当作参数传给类方法的第一个参数(使用此方法不用对类进行实例化)
- @property:将一个实例方法提升为属性,便于访问
深拷贝和浅拷贝和等号赋值
深拷贝 :新建对象B,将原来对象A的内存完全复制到B。修改A,B不会发生改变
浅拷贝:1、简单的可变对象,AB互不影响。2、可变对象内嵌套其他可变对象,A修改了子对象,B的子对象也会变。
等号赋值:B=A,其实A和B指向同一块内存区域,修改A,B也会变。