1.python2和python3的区别
python3中的bytes,就是python2中的字符串
python3中的字符串就是Python2的unicode
print在Python2中是一个声明但是在python3中却是一个函数
Python2的raw_input和python3的input一样
python3中斜杠表示真除Python2有小数点表示真除
range/和xrange
在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中xrange() 会抛出命名异常)。
在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。
这个表现十分像生成器(比如。“惰性求值”)。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。
由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。
2.中间件
中间件一般做认证或者是批量导入的请求,django中间件其实就是一个类,在请求结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法.
如请求过来执行process_request,process_view,process_response
用到中间件的地方:权限认证,登录认证,cors,session,缓存
3.django,tornado,flask各自的优势
django:django框架的特点是简便.开发迅速,并遵循MvC的设计(输入,处理,输出)django有许多的第三方插件(time.os.json,threading)django还有很强的扩展性.
tornado:它是非阻塞服务器这让它的运行速度相当快,得力于其非阻塞的方式和对epll的运用,filter,缺点没有session,需要自己定制
flask:微型的web框架,自由.简单灵活入门简单即便没有多少web开发的经验,也能够很快的做出网站,非常适用与web服务的api.
组件:WTFrom/SQlachemy/sessionn/admin/
4.Django怎样么实现并发
nginx+uwsig为django提供高并发,nginx的并发能力超过单台并发能力,在纯净的web服务中更是突出其优越的地方,由于底层使用的是epoll异步io模型进行处理的
5.tornmodo的ioloop知道是什么吗?
事件循环
6.select_relact,和prefetch_related,q和f
select_relact:一对多使用,查询主动做连表
prefetch_relact:多对多或者一对多的时候使用,不做连表,做多次查询
q:用于构造复杂的查询条件
f:更新时用于获取原来的值,专门取对象中的某一列进行操作
7.什么是ORM
orm即(object-Relatioal mapping)对象关系映射,它的作用是在关系型数据库和业务实体对象之间做一个映射
orm优点
优点摆脱复杂的sql操作,适应快速开发,让数据库结果变得简单,数据库迁移成本低
orm缺点
性能比较差,不适用于大型应用,复杂的sql语句操作还是需要sql语句来完成
8.CORS跨域资源共享
首先会发送"预检"opption",请求,如果"预检"成功,则发送真实数据
9.django的form有什么功能?
生成html标签,验证用户is_valid,html form提交保留上次提交数据,初始化页面显示内容
10.CBV和FBV
cbv在指定的类上面加上装饰器或在这个方法上面添加装饰器@method_decorator,并继承view
11.cookie以及session
cookie
cookie是保留在客户端上面的一组键值对,cookie不是很安全,别人可以分析存在本地的cookie,cookie还有字节的限制
session
session是保存在服务器上的一组键值对,依赖cookie安全指数比cookie高没有字节的限制
12.django的请求生命周期
请求来了先到uwsgi,把请求做一部分封给django框架,然后经过所有的中间件,路由,视图,视图处理再返回给中间件,中间件在返回给uwsgi在返还给用户
13.uwsgi和wsgi
wsgi:是web服务器网光接口,是python应用程序或框架和web服务器之间的接口,其广泛使用django框架
uwsgi:是一个web服务器,它实现了wagi协议,nginx中httpUwsgiModule的作用是与Uwsgi服务器进行交换
14.Django-debug-toolbar的使用
使用django开发站点时,可以使用django-debug-toolbar来进行调试,在setting.py中添加debug-toolbar.midleware到项目的MiDDLEWARE_CLASSE内
15.python__new__,init的区别
__new__是一个静态方法,__init__是一个实例方法
__new__返回一个创建的实例,__init__什么都不返回
__new__返回一个cls的实例后面的__init__才能被调用
当创建一个新实例时调用__new__,初始化一个实例的时候调用__init__
16.深浅拷贝
浅拷贝只是增加了一个指针指向一个存在的地址,而深拷贝是增加一个指针并开辟一块新的内存,这个增加了指针指向这个新的内存
采用浅拷贝的情况,释放内存,会释放同一块内存,深拷贝不会出现释放同一内存的错误
简单的说就是浅拷贝就是增加标签,深拷贝就是复制一份新的出来
li=[[1,2],[2,3],[3,4]]
new_l1=copy.copy(li)
new_l2=copy.deepcopy(li)
li[2][0]=l1
print(new_l1) #:[1,2],[2,3],[11,4]
print(new_l2) #:[1,2],[2,3],[3,4]
17.http/ip相关协议分别位于那一层
http是超文本传输协议,http是基于tcp/ip通信协议进行传递数据 http协议工作在
c/s架构上,浏览器作为http的客户端通过url向web服务器发送请求,web舞武器接到所有的请求后,向客户端发送相应信息。http的特点是:短连接无状态
地址栏输入url按下回车后经历了什么?
1浏览器向dns服务器请求解析该url中的域名所对应的IP地址
2解析出ip后,根据ip地址和默认端口80和服务器建立tcp连接
3浏览器发出的读取文件的http请求,该请求报文作为tcp三次握手的第三个报文的数据的时候发送给服务器
4服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器
5释放tcp连接
6浏览器将该html渲染并指出内容·
18.TCP/UDP区别
tcp协议是面向连接,保证可靠性(数据没有丢失,数据无序,数据无错误,数据无重复达到)传输层协议
udp协议数据容易丢失,安全性不是很高
19.webscoket
websocket是基于http协议的可持续化连接
轮询:浏览器每个几秒钟就发送一次请求,询问服务器是否有新消息
长轮询:客户端发起连接后如果没有消息,就一直不返回response给客户端,直到消息返回,返回完后,客户端再次发起连接.
20.Rabbitmq:
服务器端有Erlang语言来编写,支持多种客户端,只会ajax,用于分布式系统中存储转发消息,在易用性、扩展性、高可用性的方面不俗。
connection是RabbitMQ的socket连接,它封装了socket部分相关协议逻辑
connectionFactroy为connection的制造工厂
channel是我们与RabbitMQ打交道的最重要的一个接口,大部分的业务操作是在chaanel这个接口中完成,包括定义Queue、定义Exchange、
绑定Queue与Exchange,发布消息等
21.装饰器
调用装饰器其实是闭包函数,为其他函数添加附加的功能,不能修改源代码和不修改被修饰的方式,装饰器的返回值是一个函数对象
比如插入日志,性能测试,事物处理,缓存权限验证,有了装饰器就可以抽离出大量与函数功能本身无关的雷同代码并继续重用
def outher(func):
def good(*args,**kwargs):
ret=func(*args,**kwargs)
return ret
return good
@outher
def bar():
print('狗241131313')
bar()
22.闭包
必须有内嵌函数
内嵌函数必须引用外部函数的变量(该函数包含对外作用域而不是全局作用域名字的引用)
外部函数的返回值必须是内嵌函数
def hei():
x=20
def inner():
'''闭包函数'''
print(x)
return inner()
23.迭代器和生成器
迭代可迭代对象对应iter(方法)和迭代器对应next(方法)的一个过程
生成器:包括含有yield这个关键字,生成器也是迭代器,调动next把函数变成迭代器。
24.classmethod,statIcmethod,Property
类方法:将类的函数转换成类方法,函数上装饰@classmethod会将函数的自动传值参数改成cls
静态方法:此方法相当于给类扩展一个功能,将类内的函数实例化,给类或对象使用,此时类内的函数就是普通函数,不管是类还是实例化的对象都可以使用
实例化:类的实例化就会产生一个实例(对象),可以理解为类()把虚拟的东西实例化,得到具体存在的值
25.常用状态码
200--服务器成功返回网页
204--请求收到,但返回信息为空
304--客户端已经执行了GET,但文件未变化
400--错误请求,如语法错误
403--无权限访问
404--请求的页面不存在
500--服务器产生内部错误
26.多线程,多进程,协程,GIL
GIL:全局解释器锁,是锁在cpython解释器上,导致同一时刻,同一进程只能有一个线程被执行
多进程:多进程模块multiprocessing来实现,cpu密集型,Io计算型可以用多进程
多线程:多进程模块threading来实现,Io密集型,多线程可以提高效率
协程:简单说协程就是进程和线程的升级版,进程和线程都面临内核态和用户态的切换问题而耗费许多时间,而协程就是用户自己控制切换的时机,不在需要陷入系统的内核态python里面yield就是协程的思想(有greenlet,gevent)
进程:是资源管理单位,进程是相互独立的,实现并行和并发
线程:是最小的执行单位,线程的出现减少了上下文切换的消耗,提供系统的并发性
27.io多路复用/异步非阻塞
IO多路复用:通过一种机制,可以监听多个描述符 select/poll/epoll
select:连接数受限,查找配对速度慢,数据由内核拷贝到用户态
poll:改善了连接数,但是还是查找配对速度慢,数据由内核拷贝到用户态
epoll:epoll是linux下多路复用IO接口,是select/poll的增强版,它能显著提高程 序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
异步非阻塞:异步体现在回调上,回调就是有消息返回时告知一声儿进程进行处理。非阻塞就是不等待,不需要进程等待下去, 继续执行其他操作,不管其他进程的状态。
28.with上下文机制原理
enter和exit,上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个类中声明enter和exit方法
使用with语句的目的就是把代码块放入with中执行,with结束后,自动完成清理工作,无须收到干预
29.经典类和新式类
经典类遵循:深度优先,python2中
新式类遵循:广度优先,Python3中
30.有没有一个工具可以帮助查找Python的bug和进行静态的代码分析?
PyChecker是一个Python代码的静态分析工具,它可以帮助查找Python代码的bug,会对代码的复杂度和格式提出警告,Pylint是另外一个工具可以进行codingstandard检查
31.python是如何进行内存管理的
python主要使用引用计数来跟踪和回收垃圾.在引用计数的基础上,通过标记-清除解决容器对象可能产生的循环引用问题,通过“分代回收”以空间换时间的方法来提高垃圾回收效率(另外一篇有详细)
32.数组和元组的区别是什么?
数组和元组的区别:数组内容可以被修改,而元组内容是只读的,不可以被修改的,但是元组里面有可能有可以被修改的数据类型,另外元组可以被哈希,比如作为字典的key
33.参数按值传递和引用传递是如何实现的?
PyChecker是一个Python代码的静态分析工具,它可以帮助查找Python代码的bug,会对代码的复杂度和格式提出警告,
Pylint是另外一个工具可以进行codingstandard检查
34.python都有哪些自带的数据结构
python自带的数据结构分为可变和不可变:可变的有:数组,集合,字典,不可变的是:字符串,元组,整数
35.什么是python的名称空间?
在python中,所有的名字都存在一个空间中,它们在空间中存在和被操作这就是名称空间,他就好像一个盒子,在每个变量名字都对应装着一个对象,当查询变量的时候,会在该盒子里寻找相应的对象
36.python中的unittest是什么?
在python中,unittest是python中的单元测试框架,它拥有支持共享搭建、自动测试、在测试中暂停代码、将不同测试迭代成一组。
37.args与*kwargs
args代表位置参数,它会接收任意多个参数并把这些参数作为元祖传递给函数*kwargs代表的关键字参数,返回的是字典,位置参数一定要放在关键字前面
38.在Python中什么是slicing?
slicing是一种在有序的对象类型中(数组、元祖、字符串)节选某一段的语法
39.os与sys区别:
os是模块负责程序与操作系统的交互,提供了访问操作系统底层的接口sys模块是负责程序与python解释器的交互,提供了一系列的函数和变量,用于操Python时运行的环境
40.函数和方法的区别
函数要手动传self,方法不用传
如果是一个函数,用类名去调用如果是一个方法用对象去调用
41.include和inclusion_tag区别
这两个都是处理代码沉余的,由于其他页面也会有这样的功能
也要用到,我们可以把它摘出来,在创建个文件夹写进去。导入进来
如果用include,这里面的数据得从后端传
如果用inclusion_tag,你返回什么就帮你传什么,它既有自己的功能也有include的功能,又可以处理数据
42.什么是元类
用来控制创建类的,正如类是创建对象的模板一样,而元类的主要目的是为了控制类的创建行为。
元类的实例化的结果是我们用class定义的类,正如类的实例为对象(类是type类创建的一个实例)
type是python的一个内建元类,用来直接控制生成类,python中任何class定义的类其实都是type实例化后的对象。
43.如何判断python对象是否为可调用函数?
使用内置的callable函数
判断对象类型是否是Function Type
判断对象是否实现call方法
43.Python中的作用域
python中,一个变量的作用域总是在代码中被赋值的地方所决定的
当python遇到一个变量的话他会按照这样的顺序进行搜索
本地作用域---当前作用域被嵌入的本地作用域-全局/模块作用域
---内置作用域
44.面向对象
一种编程方式,面向对象编程解决了程序的可扩展性
面向对象的四个特性:
- 继承:继承是指的是类与类的关系,解决什么是什么的关系用来解决代码重用的问题继承是一种创建新类的方式,在python中新建的类可以继承一个或多个父类,父类又可以称为基类或超类新建的称为派生类或子类
- 抽象: 抽象即抽取类似或者比较像的部分,奥巴马和梅西抽象成人,麦兜和猪坚强抽象成猪,人猪抽象成动物。继承是基于抽象这个过程后,通过编程语言去实现的
- 多态:一种事物的多种形态, 例子:就如,列表,字符串,元组,都是有序的序列类型,在这种情况下len这种方法的统计长度就是多态性python里面处处都是多态,只是我们一般发现不了 操作时候不需要关心这个对象的数据类型,你只要用就行面向对象的
- 封装:什么是封装(封装不是单纯意义的隐藏,其实它还是可以查看的)封装数据:目的是保护隐私 功能的封装:目的是隔离复杂度如果用于私有在类的外部无法使用变形的属性,但是在类的内部可以使用。封装类属性的私有属性(就是在类属性前面加_)
45.反射
反射可以用字符串的方式去访问对象的属性,调用对象方法(但是不能去访问方法),python中一切皆对象,都可以使用
反射有四种方法
- hasattr:hasattr(object,name)判断一个对象是否有name属性或者name方法。有就返回True,没有就返回False
- getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr和getattr配套使用需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()
- setattr:给对象的属性赋值,若属性不存在,先创建后赋值
- delattr:删除该对象指定的一个属性
46.鸭子类型
"当看到一只鸟走起来像鸭子,游起来像鸭子,那么这只鸟就可以被称为鸭子.
我们并不关心对象是什么类型,到底是不是鸭子,只关心行为
比如在python中,有很多file-like的东西,比如StringIO,GzipFile,socket。它们有很多相同的方法,我们把它们当作文件使用。
又比如list.extend()方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list/tuple/dict/字符串/生成器等.
鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式。