Python 面试题(基础)

python面试题

1.join和split区别

​ join函数获取一批字符串,然后用分隔符字符串将它们连接起来,从而返回一个字符串。

​ split()函数获取一个字符串,然后在分隔符处将其断开,从而返回一批字符串。

两个函数之间的区别:join可以使用任何分割字符串将多个字符串连接起来;

​ split()只能使用一个字符分隔符将字符串断开。

简单地说,如果你用split(),是把一串字符串(根据某个分隔符)分成若干个元素存放在一个数组里。 而join是把数组中的字符串连接成一个长串,可以大体上认为是split的逆操作。

2.__init__和new方法区别

【同】

二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多。

【异】

  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。
  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。

3.mysql怎么查询10-20条的数据

select * from table limit 0, 10

image-20201021091653754

select * from table limit 10, 10   #从第11个开始后面10条数据

image-20201021091801345

4.迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter()next()

5.生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象

迭代器与生成器

​ 迭代可迭代对象对应iter(方法)和迭代器对应next(方法)的一个过程
​ 生成器:包括含有yield这个关键字,生成器也是迭代器,调动next把函数变成迭代器

6.copy()与deepcopy()的区别

对于不可变的对象来说(数字字符串元组),深浅拷贝没有区别
深复制:即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。
浅复制:并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。
浅复制要分两种情况进行讨论:

1)当浅复制的值是不可变对象(数值字符串元组)时和“等于赋值”的情况一样,对象的id值与浅复制原来的值相同。

2)当浅复制的值是可变对象(列表和元组)时会产生一个“不是那么独立的对象”存在。有两种情况:

第一种情况:复制的对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。

原来值的id值与浅复制原来的值不同。

第二种情况:复制的对象中有 复杂 子对象 (例如列表中的一个子元素是一个列表),如果不改变其中复杂子对象,

浅复制的值改变并不会影响原来的值。 但是改变原来的值 中的复杂子对象的值 会影响浅复制的值。

7.lambda函数

1.用lambda函数首先减少了代码的冗余

2.不用费神地去命名一个函数的名字,可以快速的实现某项功能

3.lambda函数使代码的可读性更强,程序看起来更加简洁。

8.多线程的原理

同一时间内,CPU只能处理1条线程,只有1条线程在工作(执行);

多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)。如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象。

9.装饰器

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

装饰器的作用就是为已经存在的函数或对象添加额外的功能

10.django

1、中间件

​ 中间件一般做认证或批量请求处理,django中的中间件,其实是一个类,在请求和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法,
​ 如请求过来 执行process_request, view,process_response方法

2、Django、Tornado、Flask各自的优势

​ Django:Django无socket,django的目的是简便,快速开发,并遵循MVC设计,多个组件可以很方便的以“插件”形式服务于整个框架, django有许多功能强大的第三方插件。django具有很强的可扩展性。
​ Tornado:它是非阻塞式服务器,而且速度相当快,得力于其非阻塞的方式和对epoll的运用,Future对象,缺点:没有session,需要自定制。
​ Flask:是一个微型的web框架,配合SQLALchemy来使用,jinja2模板, werkzeug接口

3、django的template的注释是什么样子的

​ 单行:{#注释#}
​ 多行注释:{%comment%}
4、django怎么弄并发的

​ nginx+uwsig为django提供高并发,nginx的并发能力超过,单台并发能力过完,在纯静态的web服务中更是突出其优越的地方,由于底层使用epoll异步IO模型进行处理。

6、select_related和prefetch_related,Q和F

​ select_related:一对多使用,查询主动做连表
​ prefetch_related:多对多或者一对多的时候使用,不做连表,做多次查询
​ Q:用于构造复杂查询条件
​ F:更新时用于获取原来的值,专门取对象中某一列进行操作

7、什么是ORM?

​ ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间做一个映射
​ ORM优缺点:
​ 优点:摆脱复杂的SQL操作,适应快速开发,让数据结果变得简单,数据库迁移成本更低
​ 缺点:性能较差,不适用于大型应用,复杂的SQL操作还需要通过SQL语句实现

8、CORS跨域资源共享

​ 首先会发送"预检"opption",请求,如果"预检"成功,则发送真实数据。

9、Django的Form主要具有以下功能?

​ 生成html标签,验证用户数据 is_vaild,html form提交保留上次提交数据,初始化页面显示内容

10、cookie及session

​ cookie:是保留在客户端上面的一组键值对,cookie不是很安全,别人可以分析存放在本地的cookie
​ session:是保存在服务器上面的一组键值对,依赖与cookie,安全指数比cookie高
11、django的请求生命周期

​ 请求来了先到uwsgi,把请求做一部分分装给django框架,然后经过所有的中间件,路由,视图,视图处理再返回给中间件,中间件在返回给uwsgi,在返回给用户。

12、uwsgi和wsgi

​ wsgi:是web服务器网关接口,是pyhton应用程序或框架和web服务器之间的一种接口,其广泛使用的是django框架。
​ uwsgi:是一个web服务器,它实现了wsgi协议,Nginx中HttpUwsgiModule的作用是与Uwsgi服务器进行交换

13、解释下django - debug -toolbar的使用

​ 使用django开发站点时,可以使用django-debug-toolbar来进行调试,在settings.py中添加 'debug—toolbar.midleware.Debug ToolbarMiddleware’到项目的MIDDLEWARE_CLASSES内。

11.HTTP/IP相关协议,分别位于哪层

​ http协议是超文本传输协议,http协议是基于TCP/IP通信协议来传递数据
​ http协议工作与c/s架构上,浏览器作为http的客户端通过URL向http服务端即web服务器发送所用请求。web服务器收到所有请求后,向客户端发送响应信息,
​ http特点是短连接,无状态

​ 地址栏键输入URL,按下回车之后经历了什么?
​ 1.浏览器向DNS服务器请求解析该URL中的域名所对应的IP地址
​ 2.解析出IP地址后,根据IP地址和默认端口80,和服务器建立TCP连接
​ 3.浏览器发出读取文件的http请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器
​ 4.服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器
​ 5.释放TCP连接
​ 6.浏览器将该HMTL渲染并显示内容

12.TCP/UDP区别

​ TCP协议是面向连接,保证高可靠性(数据无丢失,数据无失序,数据无错误,数据无重复达到)传输层协议
​ UDP:数据丢失,无秩序的传输层协议(qq基于udp协议)

13.webscoket

​ websocket是基于http协议的,可持续化连接
​ 轮询:浏览器每隔几秒就发送一次请求,询问服务器是否有新消息
​ 长轮询:客户端发起连接后,如果没有消息,就一直不返回response给客户端,直到有消息返回,返回完之后,客户端再次发起连接

14.装饰器

​ 调用装饰器其实是一个闭包函数,为其他函数添加附加功能,不修改被修改的源代码和不修改被修饰的方式,装饰器的返回值也是一个函数对象。
​ 比如:插入日志、性能测试、事物处理、缓存、权限验证等,有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

15.常用的状态码

​ 200–服务器成功返回网页
​ 204–请求收到,但返回信息为空
​ 304–客户端已经执行了GET,但文件未变化
​ 400–错误请求,如语法错误
​ 403–无权限访问
​ 404–请求的页面不存在
​ 500–服务器产生内部错误

16.多进程,多线程,协程,GIL

​ 进程:是资源管理单位,进行是相互独立的,实现并发和并发
​ 线程:是最小的执行单位,线程的出现为了降低上下文切换的消耗,提供系统的并发性

​ GIL:全局解释器锁,是锁在cpython解释器上,导致同一时刻,同一进程只能有一个线程被执行
​ 多进程:多进程模块multiprocessing来实现,cpu密集型,IO计算型可以用多进程
​ 多线程:多线程模块threading来实现,IO密集型,多线程可以提高效率
​ 协程:依赖于geenlet,对于多线程应用。cpu通过切片的方式来切换线程间的执行,遇到IO操作自动切换,线程切换时需要耗时,
​ 而协成好处没有切换的消耗,没有锁定概念。

17.IO多路复用/异步非阻塞

​ IO多路复用:通过一种机制,可以监听多个描述符 select/poll/epoll
​ select:连接数受限,查找配对速度慢,数据由内核拷贝到用户态
​ poll:改善了连接数,但是还是查找配对速度慢,数据由内核拷贝到用户态
​ epoll:epoll是linux下多路复用IO接口,是select/poll的增强版,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率
​ 异步非阻塞:异步体现在回调上,回调就是有消息返回时告知一声儿进程进行处理。非阻塞就是不等待,不需要进程等待下去,
​ 继续执行其他操作,不管其他进程的状态。

18.Python是如何进行内存管理的

​ 1.对象引用计数:
​ 引用计数增加的情况:
​ 来保持追踪内存中的对象,所有对象都用引用计数,一个对象分配一个新名称
​ 将其放入一个容器中(列表,字典,元组)
​ 引用计数减少的情况:
​ 使用del语句对对象别名显示的销毁
​ 引用超出作用域或被重新赋值
​ sys.getrefcount()函数可以获得对象的当前引用计数
​ 2.标记-清除机制

​ 3.分代技术

19.数组和元组之间的区别是什么?

​ 数组和元组之间的区别:数组内容可以被修改,而元组内容是只读的,不可被修改的,另外元组可以被哈希,比如作为字典的key

20.Python都有哪些自带的数据结构?

​ Python自带的数据结构分为可变和不可变的:可变的有:列表、集合、字典,不可变的是:字符串、元组、整数

21.args和kwargs

​ args代表位置参数,它会接收任意多个参数并把这些参数作为元祖传递给函数。

​ kwargs代表的关键字参数,返回的是字典,位置参数一定要放在关键字前面

22.实现一个单例模式

new()在 init()之前被调用,用于生成实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。
​ 单例模式是指创建唯一对象,单例模式设计的类只能实例,实例化1个对象
​ class Singleton(object):
​ __instance=None
​ def init(self):
​ pass
​ def new(cls, *args, **kwargs):
​ if Singleton.__instance is None:
​ Singleton.__instance=object.new(cls,*args,**kwargs)
​ return Singleton.__instance

23.排序(reverse=False)(默认是false)

1.sort

​ arr.sort()

2.sorted

​ sorted(arr)

sort 与 sorted 区别:

sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值