1. 什么是 GIL?
GIL 全称 Global Interpreter Lock, 本质是一把互斥锁, 并不是 python 的特性 python 为了保证线程安全而采取的独立线程运行的限制,
说白了就是一个核只能在同一时间运行一个线程. 对于 IO 密集型任务, python 多线程起到作用, 但对于 cpu 密集型任务,
python 的多线程几乎占不到什么优势, 还有可能因为争夺资源而变慢
2.python 中 staticmethod 和 classmethod 的区别?
区别: 调用方法不同
静态方法: 由类调用, 无默认参数
类方法: 由类调用, 至少一个 cls 参数, 执行类方法时, 自动将调用该方法的类复制给 self
3.python 里面如何拷贝一个对象, 并解释深浅拷贝
一般来说可以使用 copy.copy()方法或者 copy.deepcopy()方法
浅拷贝: 创建一个新的对象, 但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象, 另外一个也会被改变)
深拷贝: 创建一个新的对象, 并且递归的复制它所包含的对象(修改其中一个, 另一个不会改变)
4.python 里面的 search()和 match()的区别
re 模块中 match(pattern,string), 检查 string 的开头是否与 pattern 匹配, 返回一个匹配的对象, 如果没找到, 返回 None
re 模块中 search(pattern,string), 在 string 中搜索第一个匹配值, 如果没找到, 返回 None
5. 简述迭代器和生成器以及他们之间的区别?
生成器: 生成器是一次生成一个值的特殊函数, 在函数执行的过程中, yield 语句会把你需要的值返回给调用生成器的地方, 然后退出函数,
下次调用生成器函数的时候, 又从上次中断的地方开始执行, 并且生成器内的变量参数会被保存下来供下次使用
迭代器: 任何实现了__iter__和__next__方法的对象都是迭代器__iter__返回迭代器自身,__next__返回容器中的下一个值
生成器是特殊的迭代器, 它内部具有这两种方法
6. 什么是协程? python 的协程是如何实现的?
协程是一种用户态的轻量级线程, 协程的调度完全由用户控制协程拥有自己的寄存器上下文和栈, 协程调度切换时, 将寄存器上下文和栈保存到其他地方,
在切回来时恢复先前保存的上下文和栈, 直接操作栈且基本没有内核切换的开销, 可以不加锁的访问全局变量,
比如在执行函数 A 的时候, 中断去执行函数 B, 过会切过来接着执行函数 A
python 的协程通过 yield 关键字来实现.
7. 什么是装饰器? 请用装饰器实现 singleton
装饰器本质上是一个 python 函数或者类, 它可以让其他函数或者类在不需要做任何代码修改的前提下,
增加额外功能, 装饰器的返回值也是一个函数 / 类对象.
- def singleton(cls,*args,**kwargs):
- instance = {}
- def _singleton():
- if cls not in instance:
- instance[cls] = cls(*args, **kwargs)
- return instance[cls]
- return _singleton
- @singleton
- class test_singleton(object):
- def __init__(self):
- self.number = 0
- def add(self):
- self.num_add = 10
- obj_1 = test_singleton()
- obj_2 = test_singleton()
- print(obj_1,obj_2):
8. 请使用 python 实现快速排序
- def Quick_Sort(my_List,start,end):
- if start < end:
- i,j = start,end
- base = my_List[i]
- while i < j:
- while (i < j) and (my_List[j] >= base):
- j = j - 1
- my_List[i] = my_List[j]
- while (i < j) and (my_List[i] <= base):
- i = i + 1
- my_List[j] = my_List[i]
- my_List[i]=base
- QuickSort(my_List,start,i-1)
- QuickSort(my_List,j+1,end)
- return my_List
- my_List = [42,30,61,80,74,20,24,45]
- Quick_Sort(my_List,0,len(my_List)-1)
- print(my_List)
9. 简述 MyISAM 和 InnoDB 的特点
MyISAM 适合于一些需要大量查询的应用, 但对于有大量写操作并不是很好比如你只是需要 update 一个字段, 整个表都会被锁起来, 而别的进程,
就算是读进程都无法操作直到读操作完成另外, MyISAM 对于 select count(*) 这类的计算非常快
InnoDB 的趋势会是一个非常复杂的存储引擎, 对于小的应用, 会比 MyISAM 慢, 但是支持行锁, 在写操作较多时更方便, 还支持更多高级应用, 比如事务
10. 简述 python 的垃圾回收机制
python 中的垃圾回收是以引用计数为主, 标记 - 清除和分代收集为辅
引用计数: python 在内存中存储每个对象的引用技术, 如果计数变成 0, 该对象就会消失, 分配给该对象的内存就会释放
标记 - 清除: 一些容器对象, 比如 list,dict,tuple,instace 等可能会出现引用循环, 对于这些循环, 垃圾回收器会定时回收这些循环 (对象之间通过引用(指针) 连在一起,
构成一个有向图, 对象构成这个有向图的节点, 而引用关系构成这个有向图的边).
分代收集: python 把内存根据对象存活时间划分为三代, 对象创建之后, 垃圾回收器会分配它们所属的代每个对象都会被分配一个代, 而被分配更年轻的代被优先处理, 因此越晚创建的对象越容易被回收
来源: http://www.bubuko.com/infodetail-2498817.html