- Python面试题【1~10】
-
Python面试题【11~20】
- 1. Python支持多少种序列?
- 2. 当Python退出时,为什么不是所有的内存都被解除分配?
- 3. Python2/3的差异点?
- 4. Python中静态方法、类方法、成员函数作用是什么?
- 5. 生成器、迭代器的区别?
- 6. 什么是匿名函数,匿名函数有什么局限性
- 7. 函数装饰器有什么作用?
- 8. 什么是协程?
- 9. 简述一下僵尸进程和孤儿进程?
- 10. in与not in,exists与not exists的区别?
2. 当Python退出时,为什么不是所有的内存都被解除分配?Python是支持7种序列类型的分别是:str,list,tuple,unicode,byte array,xrange和buffer。其中xrange在python 3.5.X中已被弃用
3. Python2/3的差异点?当python退出时,尤其是那些对其他对象具有循环引用的Python模块或者从全局名称空间引用的对象并不总是被解除分配或释放。由于python拥有自己的高效清理机制,无法解除分配保留的那些内存部分会在退出时尝试取消分配/销毁其他所有对象
- print 成为函数
- 编码问题3不再有Unicode对象,默认str就是Unicode
- Python3除法返回浮点数
- 类型注解
- 优化的super()方便调用父类函数
- 高级解包操作: a, b, *res = range(10)
- 限定关键词参数
- Python3重新抛出异常不会丢失栈信息(raise from)
- 一切返回迭代器:range, zip, map, dict.values
- yield form 链接子生成器
- asyncio内置库,asyn/await 原生协程支持异步编程
- 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法
# 使用 staticmethod IND = 'ON' class Kls(object): def __init__(self, data): self.data = data @staticmethod def checkind(): return (IND == 'ON') def do_reset(self): if self.checkind(): print('Reset done for:', self.data) def set_db(self): if self.checkind(): self.db = 'New db connection' print('DB connection made for: ', self.data) ik1 = Kls(12) >>> ik1.do_reset() Reset done for: 12 >>> ik1.set_db() DB connection made for: 12 - 类方法是将类本身作为对象进行操作的方法。类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls
class Kls(object): no_inst = 0 def __init__(self): Kls.no_inst = Kls.no_inst + 1 @classmethod def get_no_of_instance(cls): return cls.no_inst ik1 = Kls() ik2 = Kls() >>> print ik1.get_no_of_instance() # 从实例调用 2 >>> print Kls.get_no_of_instance() # 从类调用 2 - 成员函数是最一般的方法,从调用方式来看,普通函数只能在类的实例中被调用,而后两者可以通过类名进行调用。
class Kls(object): def __init__(self, data): self.data = data def printd(self): print(self.data) ik1 = Kls('arun') ik2 = Kls('seema') >>> ik1.printd() arun >>> ik2.printd() seema
6. 什么是匿名函数,匿名函数有什么局限性生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出 StopIteration 异常
7. 函数装饰器有什么作用?就是lambda函数,通常用在函数体比较简单的函数上。匿名函数顾名思义就是函数没有名字,因此不用担心函数名冲突。不过Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数
8. 什么是协程?装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用
9. 简述一下僵尸进程和孤儿进程?
- 协程,英文Coroutines,是一种比线程更加轻量级的存在。
- 协程不是进程,也不是线程,它就是一个可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。
- 一个进程可以包含多个线程,一个线程也可以包含多个协程,也就是说,一个线程内可以有多个那样的特殊函数在运行。但是有一点,必须明确,一个线程内的多个协程的运行是串行的。如果有多核CPU的话,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内的多个协程却绝对串行的,无论有多少个CPU(核)。这个比较好理解,毕竟协程虽然是一个特殊的函数,但仍然是一个函数。一个线程内可以运行多个函数,但是这些函数都是串行运行的。当一个协程运行时,其他协程必须挂起。
- 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作
- 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程
- exist会针对子查询的表使用索引
- not exist会对主子查询都会使用索引
- in与子查询一起使用的时候,只针对主查询使用索引
- not in则不会使用任何索引
- 如果查询的两个表大小相当,那么用in和exists差别不大;如果两个表中一个较小一个较大,则子查询表大的用exists,子查询表小的用in,所以无论哪个表大,用not exists都比not in 要快



