Python 面试

1 TCP/UDP/HTTP协议区别


TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是⼀ 种⾯向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议。一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

区别TCP通信需要经过创建连接、数据传送、终⽌连接三个步骤。TCP通信模型中,在通信开始之前,⼀定要先建⽴相关的链接,才能发送数
udp通信模型中,在通信开始之前,不需要建立相关链接,只需要发送数据即可。
TCP严格区分客户端和服务端,服务端一般都需要绑定端口,否则客户端找不到该服务器,客户端一般不绑定端口,如果客户端绑定端口就会出现端口冲突导致无法多开的问题。


2深拷贝浅拷贝


深拷贝深拷贝是对于一个对象所有层次的拷贝(递归)保证了数据的独立性。
如果是可变类型,浅拷贝只拷贝外层,而深拷贝是完全拷贝
如果是纯的不可变类型,那么无论是浅拷贝还是深拷贝,都只是指向同一个地址。如果不可变类型里面还存在可变类型,则浅拷贝是指向,而深拷贝则为完全拷贝。

浅拷贝浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。


3 简述一下前端请求的处理流程,在uwsgi/nginx/django之前的处理流程


wsgi:一种实现python解析的通用接口标准/协议,是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。

uwsgi:一种通信协议,是uWSGI服务器自有的协议,它用于定义传输信息的类型。

uWSGI:一种python web server或称为Server/Gateway,实现了uwsgi和WSGI两种协议的web服务器,负责响应python的web、请求。

Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

流程:
1、首先客户端请求服务资源。

2、nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析。

3、如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源。

4、如果是动态的请求,nginx就通过配置文件,将请求传递给wWSGI;uWSGI将接收的包进行处理并传给wsgi。

5、wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回追交给wsgi。

6、wsgi将返回值进行打包,转发给uWSGI。

7、uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)。


4 redis 用过哪些数据结构?怎么保存的

 https://mp.csdn.net/mp_blog/creation/editor/132037539

5 celery队列


Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式系统所需的工具… 所谓任务就是消息, 消息中的有效载荷中包含要执行任务需要的全部数据.
Celery 是一个分布式队列的管理工具, 可以用 Celery 提供的接口快速实现并管理一个分布式的任务队列.
Celery 本身不是任务队列, 是管理分布式任务队列的工具. 它封装了操作常见任务队列的各种操作, 我们使用它可以快速进行任务队列的使用与管理.


6 modeifirst dbfirst区别


1、ModelFirst 顾名思义就是首先设计实体模型,之后根据实体模型实现到数据库的映射。
2、DBFirst 就是先进行数据库的设计,之后根据数据库生成实体数据模型。具体区别就是在新建实体数据模型时,实体模型向导中提示的根据数据库生成还

7 线程/进程、协程区别

进程: 进程是一个具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统资源分配和独立运行的最小单位;
线程: 线程是进程的一个执行单元,是任务调度和系统执行的最小单位;
协程: 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。

8 tornado 框架


 Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。


9 向量化-one-hot编码/数据分箱


  one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位

10 栈 堆


1、堆栈空间分配区别
栈(操作系统):由操作系统(编译器)自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2、堆栈缓存方式区别
栈使用的是一级缓存, 它们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
3、堆栈数据结构区别
堆(数据结构):堆可以被看成是一棵树,如:堆排序。
栈(数据结构):一种先进后出的数据结构。

11 你知道的排序算法


1 冒泡排序 2选择排序 3插入排序 4希尔排序 5归并排序 6快速排序
 7堆排序 8计数排序 9桶排序 10基数排序


12 mysql优化,多表查询


对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。可以在num上设置默认值0,确保表中num列没有null值,然后这样查询 select id from t where num=0
应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描


13 Linux 下找文件


使用find命令
常用用法:
find ./ -name test.sh 查找当前目录下所有名为test.sh的文件
find ./ -name '.sh’ 查找当前目录下所有后缀为.sh的文件
find ./ -name "[A-Z]" 查找当前目录下所有以大写字母开头的文件
find /tmp -size 2M 查找在/tmp 目录下等于2M的文件
find /tmp -size +2M 查找在/tmp 目录下大于2M的文件
find /tmp -size -2M 查找在/tmp 目录下小于2M的文件
find ./ -size +4k -size -5M 查找当前目录下大于4k,小于5M的文件
find ./ -perm 777 查找当前目录下权限为 777 的文件或目录


14 闭包


1、什么是闭包闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

闭包的特点:

1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

简单的说,Javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。

15 Django模型类继承


Django Model继承模型主要分为三种类型:
(1) 单表继承
单表继承,也称为表里继承或者全在一个表里的继承,是指子类和父类都在同一个表中存储,子类只需要增加一些额外的字段,不需要额外的表。
(2) 多表继承
多表继承,也称为表外继承或者标准继承,是指子类和父类存储在不同的表中,子类可以继承父类的字段和方法,在子表中增加一些字段或者重写一些方法。
(3) 抽象基类继承
抽象基类继承,也称为基类继承或者非具体继承,是指父类定义成抽象基类,不能直接被实例化,只能被其他类继承,继承类可以继承父类的字段和方法,在自己的模型中增加一些字段或者重写一些方法。

16 时间更新模型类

17 Settings 里面设置东西
18 ajax 请求的csrf解决方法


添加CSRF令牌:在每个Ajax请求中,将CSRF令牌作为请求的参数或自定义的请求头字段发送到服务器端。
服务器端验证:在服务器端接收到Ajax请求时,验证请求中的CSRF令牌与用户会话中的令牌是否匹配,确保请求的合法性。
错误处理:如果CSRF令牌验证失败,服务器应该返回适当的错误响应,并阻止执行非预期的操作。

19 机器数据分析/建模有什么感悟

20 爬虫原理


发送请求:爬虫首先向目标网站发送请求,请求的内容包括要获取的网页地址、请求头信息等。
接收响应:目标网站接收到请求后,会返回一个响应,响应的内容包括网页的HTML代码、状态码、响应头信息等。
解析网页:爬虫接收到响应后,需要对网页进行解析,提取出需要的数据。解析网页的方式有多种,例如正则表达式、XPath、BeautifulSoup等。
存储数据:爬虫将解析出来的数据存储到本地或者数据库中,以便后续的分析和处理。


21 redis为什么快?除了他是内存型数据库外,还有什么原因?


     Redis的高性能表现是由多种因素共同作用得来的。首先,它采用了内存存储技术,并且具有数据结构简单、压缩等优势。
其次,它采用了非阻塞I/O、纯内存操作、多线程共享等技术手段,使得Redis可以在高并发的场景下获得更出色的表现。
最后,Redis还支持持久化、批量操作等功能,能够应对更复杂的应用场景。

22 python2和python3 的区别

print 函数
print语句没有了,取而代之的是print()函数。 Python 2.6与Python 2.7部分地支持这种形式的print语法。

Unicode
Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。
现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。Python3.X 源码文件默认使用utf-8编码。
除法运算python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。
在python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。

异常
在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。
捕获异常的语法由 except exc, var 改为 except exc as var。
使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。

在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。
2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。
xrange
在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。
这个表现十分像生成器(比如。“惰性求值”)。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。
由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。
在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。

八进制字面量表示
八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。
新增了一个bin()函数用于将一个整数转换成二进制字串。 Python 2.6已经支持这两种语法。
在Python 3.x中,表示八进制字面量的方式只有一种,就是0o1000。

不等运算符
Python 2.x中不等于有两种写法 != 和 <>
Python 3.x中去掉了<>, 只有!=一种写法,还好,我从来没有使用<>的习惯

去掉了repr表达式``
Python 2.x 中反引号``相当于repr函数的作用
Python 3.x 中去掉了``这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用repr的机会很少,一般只在debug的时候才用,多数时候还是用str函数来用字符串描述对象。

数据类型
1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long
2)新增了bytes类型,对应于2.X版本的八位串


23你觉得python2的项目如果迁移到python3,困难会在哪里?

命令行输出数据类型出错
python2 中为str类型
python3中为bytes类型,需要加decode()转化为str
 

你可能感兴趣的:(Python,python,面试,开发语言)