系列文章目录
Python 专精
前言
学习不止眼前的苟且。
企业面试题
一、Python 新式类和经典类的区别?
在Python里凡是继承了object的类。都是新式类。Python3里只有新式类。Python2里继承object的新式类,没有写父类的都是经典类。经典类目前在Python里基本已经没有应用了,所以没有去学习。
二、Python中内置的数据结构有几种?
整数 int、浮点型float、字符串str、列表list、元组tuple、字典dict、集合set。
三、可变类型和不可变类型。
1、可变类型有list、dict。不可变类型有string、number、tuple。
2、当进行修改操作时,可变类型传递的是内存中的地址。也就是说,直接修改内存中的值,并没有开辟新的内存。
3、不可变类型被改变时,并没有改变原内存地址中的值,而是开辟一块新的内存,将原地址中的值复制过去,对这块新开辟的内存中的值进行操作。
四、Python中类方法、类实例方法、静态方法有何区别?
1、类方法:
是类对象的方法,在定义时需要在上方使用"@classmethod"进行修饰,形参为cls,表示类对象,类对象和实例对象都可调用。
2、类实例方法:
是类实例化对象的方法, 只有实例对象可以调用,形参为self,指对象本身;
3、静态方法:
是一个任意函数,在其上方使用"@staticmethod"进行修饰,可以用对象直接调用,静态方法实际上跟该类没有太大关系。
五、super 函数的具体用法和场景?
super() 函数用于调用下一个父类(超类)并返回该父类实例的方法;是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候,没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。MRO就是类的方法解析顺序表,其实也就是继承父类方法时的顺序表。
六、Python的内存管理机制及调优手段?
内存管理机制: 引用计数、垃圾回收、内存池。
引用计数:
是一种非常高效的内存管理手段,当一个Python对象被引用时,其引用计数增加1,当其不再被一个变量引用时则计数减一,当引用计数等于0时对象被删除。
垃圾回收:
1、引用计数
引用计数也是一种垃圾回收机制,而且也是一种最直观、最简单的垃圾收集技术。当Pytho的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比如某个新建对象,它被分配给某个引用,对象的引用计数变为1.如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。不过如果出现循环引用的话,引用计数机制就不再起有效的作用了。
2、标记清除
如果两个对象的引用计数都为1,但是仅仅存在它们之间的循环引用,那么这两个对象都是需要被回收的,也就是说,它们的引用计数虽然表现为非0。所以现将循环引用摘掉就会得出这两个对象的有效计数。
3、分代回收
从前面"标记-清除"这样的垃圾回收机制来看,这种垃圾收集机制所带来的额外操作实际上与系统中总的内存块的数量是相关的,当需要
七、内存泄漏时什么?如何避免?
指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。导致程序运行速度减慢甚至内存崩溃等严重后果。
八、函数调用参数的传递方式是值传递还是引用传递?
Python的参数传递有:位置参数、默认参数、可变参数、关键字参数。函数的传值到底是值传递还是引用传递,要分情况:
不可变参数用值传递: 想整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何不可能在原处改变不可变对象。
可变参数是引用传递的: 比如像列表、字典这样的对象是通过引用传递。
九、对缺省参数的理解?
缺省参数指在调用函数的时候,没有传入参数的情况下,调用默认的参数,在调用函数的同时赋值时,所传入的参数会替代参数。
*args 是不定长参数,它可以表示输入参数是不确定的,可以是任意多个。
**kwargs是关键字参数,赋值的时候是以键 = 值的方式,参数是可以任意多对在定义函数的时候,不确定会有多少参数会传入时,就可以使用两个参数。
十、简述read、readline、readlines的区别?
read 读取整个文件。
readline 读取下一行。
readlines 读取整个文件到一个迭代器一共我们遍历(读取到一个list中,以供使用,比较方便)。
十一、python函数的重载机制?
所谓函数的重载是指多个函数的名称以及返回值类型均相同,仅参数类型或参数个数不同。函数重载大大提高了代码重用率和程序员开发效率。
函数重载主要是为了解决两个问题: 1、可变参数类型。 2、可变参数个数。
并且函数重载一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同之外,其功能是相同的,此时才使用函数重载,如果两个函数的功能其实不同,不应当使用重载,而应当使用一个名字不同的函数。
十二、python实现一个单例模式?
class MySingle:
def foo(self):
pass
sinleton = MySingle()
# 将上面的代码保存在文件mysingle.py中,然后这样使用
from mysingle import sinleton
singleton.foo()
十三、单例模式的应用场景有哪些?
单例模式应用的场景一般发现在以下条件下:
1、资源共享的情况下,避免由于资源操作时导致的性能或损耗等,如日志文件,应用配置。
2、控制资源的情况下,方便资源之间相互通信。如线程池等。网站的计数器、应用配置、多线程池、数据库配置、数据库连接池、应用程序的日志应用。
十四、谈谈你对面向对象的理解?
面向对象是相对于面向过程而言的。面向过程语言是一种基于功能分析的、以算法为中心的程序设计方法;而面向对象是一种基于结构分析的,以数据为中心的程序设计思想。在面向对象语言中有一个很重要的东西,叫做类。面向对象有三大特性: 封装、继承、多态。
十五、谈谈你对多进程、多线程、以及协程的理解,项目是否用?
这个问题被问的概率相当大,其实多线程、多进程,在实际开发中用到的很少,除非是那些对项目性能要求特别高的,有的开发工作几年了,也确实没用过。你可以这么回答,给他扯扯什么是进程,线程的概念就行。
进程:
一个运行的程序就是一个进程,没有运行的代码叫做程序。进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。
线程:
调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程最少有一个线程,叫做主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。
协程:
是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
十六、解释一下什么是锁,有哪几种锁?
锁(Lock)是Python提供的对线程控制的对象。有互斥锁、可重入锁、死锁。
死锁:
若干个子线程在系统资源竞争时,都在等待对方某部分资源解除占用状态,结果是谁也不愿意先解锁,互相干等着,程序无法执行下去,这就是死锁。
GIL锁(有时候,面试官不问、你自己要主动说,增加b格,尽量别一问一答的尬聊,不然等到最后的一句话就是,你还有什么想问的吗?)
GIL锁 全局解释器锁(只有在cpython里才有)
作用:限制多线程同时执行,保证同一时间只有一个线程执行。所以cpython里的多线程其实是伪多线程。
所以Python里常常使用协程技术代替多线程,协程是一种更轻量级的线程。
进程和线程的切换时,由系统决定。而协程由我们程序员决定。而模块gevent下切换是遇到了耗时操作才会切换。
三者的关系:进程里有线程,线程里有协程。
十七、什么是线程安全,什么是互斥锁?
每个对象,都对应一个可称作"互斥锁'的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
同一进程中的多线程之间共享系统资源的,多个线程同时对一个对象进行操作,一个线程操作尚未结束、另一个线程已经对其进行操作,导致最终结果出现错误,此时需要对被操作对象添加互斥锁,保证每个线程对该对象的操作都得到正确的结果。
十八、说说HTTP和HTTPS的区别?
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http的链接很简单,是无状态的;https协议是由SSL+HTTP协议构建的可进行加密传输
4、http和https使用的是完全不同的链接方式,用的端口也不一样,前者是80,后者是443。
Django
一、Django中间件的使用?
1、Django中间件中预置了六个方法,这六个方法的区别在于不同的阶段执行,对输入或输出进行干预,方法如下:
初始化: 无需任何参数,服务器响应第一个请求的时候调用一次,用于确认是否启用当前中间件。
def __init__():
pass
处理请求前:在每个请求上调用,返回None或HttpResponse对象。
def process_request(request):
pass
处理视图前:在每个请求上调用,返回None或HttpResponse对象。
def process_view(request, view_func, view_args, view_kwargs):
pass
处理响应后: 所以响应返回浏览器之前被调用,返回实现了render方法的响应对象。
def process_template_response(request,response):
pass
异常处理: 当视图抛出异常时调用,在每个请求上调用、返回一个HttpResponse对象。
def process_exception(request,exception):
pass
二、谈一下你对uWSGI和nginx的理解?
1、uWSGI是一个Web服务器,它是一种Web服务器网关接口。他是一个web服务器与web应用(比如Django框架)通信的一种规范。
2、nginx是一种开源的高性能的HTTP服务器和反向代理。
作为web服务器,它处理静态文件和索引文件效果非常高。
它的设计非常注重效率,最大支持5万个并发连接,但只占用很少的内存空间;
稳定性高,配置简单。
强大的反向代理和负载均衡功能,平衡集群中各个服务器的负载压力应用。
三、有用过Django REST framework 吗?
Django REST framework 是一个强大而灵活的Web API工具。使用RESTframework的理由有:
Web browsable API 对开发者有极大的好处。
包括OAutu1a和QAuth2的认证策略。
支持ORM和非ORM数据资源的序列化。
全程自定义开发,如果不想使用更加强的功能,可仅仅使用常规的function-based views额外的文档和强大的社区支持。
总结
例如:以上就是今天要讲的内容。