Python面试题记录0

作者的话

以下面试题均为个人面试过程中遇到的较为频繁的一些题目,仅记录以供学习,若是要深入理解,建议各位查阅资料或者翻看文档源码,以上。

python基础理论

1.is 和 == 的区别?
‘is’被叫做同一性运算符,也就是对象的id,查看对象的唯一身份标识是否一致。
‘==’为比较操作符,判断两对象的值是否相当。

2.*args,**kwargs分别是什么?
args实际上是arguments的缩写代表位置参数,kwargs是keyword arguments的缩写代表关键字参数,*args是把参数打包成一个元组供函数调用,**kwargs就是把参数打包成字典供函数调用,值得注意的是,传参的顺序不能改变,位置参数必须在关键字参数的前面。

3.dict的存储结构是什么?时间复杂度是?
dict的存储结构是哈希表,时间复杂度为O(1)。
python3.6之前的dict存储方式是一张hash表,根据规则(哈希函数)计算出key的hash值,再与mask操作(字典最小长度-1)得到一个index,在位置冲突时先判断两key是否相等,相等则更新,否之下移寻找空位。python3.7之后新增了一个indices列表,首先计算key的hash值,与mask操作之后得到的index为插入indices的下标,由下标可以得到indices中的len(enteies),表示的是该值在enteies表的位置。解决冲突的方式与3.6之前一致。

4.middleware的作用?
middleware是介于request和response之间的一个处理过程,用于全局范围的改变django的输入与输出。例如django默认开启csrf中间件,每次请求都会验证是否有正确的token等。

5.线程,进程,协程的区别及作用?
进程就是一个运行的程序,是操作系统分配资源的最小单位,线程是CPU调度的最小执行单位,一个进程有且仅有一个主线程,一个进程有多个线程,一个线程仅有一个进程。协程本质上就是一个可由用户程序进行上下文切换的线程。

6.深拷贝浅拷贝的区别?
浅拷贝是对对象地址的引用,深拷贝开辟了新的内存空间。

7.类方法,实例方法,静态方法的区别?
类方法使用@classmethod装饰器,第一个参数必须是当前类对象cls,通过它来传递类属性和方法(不能传实例的属性和方法),实例对象,类对象皆可调用。
实例方法第一个参数必须是实例对象self,通过它来传递实例的属性和方法(也可以传类的属性和方法),只能由实例对象调用。
静态方法使用@staticmethod装饰器,参数随意,但是方法体内不能出现类或实例任何属性以及方法,类对象实例对象皆可调用。

8.GIL是什么?每个线程都有GIL吗?
GlobalInterpreterLock(全局解释器锁)
Python代码的执行由Python虚拟机(也叫解释器主循环,CPython版本)来控制,Python在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。
不是每个线程都有GIL。

9.python的内存管理制度?
引用计数、垃圾回收、内存池机制

10.python有哪些魔法方法?

__init__     # 初始化方法
__new__ 	 # 构造函数 在__init__之前被调用,用来构造对象
__del__		 # 释放资源
__str__		 # 定义当str()被调用
__repr__	 # 定义当repr()被调用

计算机网络

1.访问一个网址到接收页面响应的过程,计算机网络经历了哪些过程?
输入网址——游览器查找域名网址的ip——游览器给web服务器发送一个http请求——web的永久重定向响应——游览器跟踪重定向的地址——服务器处理请求——游览器发送获取的html页面

简单来说:
域名解析——建立TCP连接——客户端向服务端发起get请求——服务器接收请求返回页面

2.TCP为什么是可靠连接?
TCP保持可靠性的规则:TCP在数据传输中将数据分为多个信息包,信息包携带一个校验码,接收方收到信息包之后将校验码与信息包中的内容核对,若是不一致则丢弃,信息包发送方将在收到接收方的反馈后停止发送该信息包,否之持续发送直到收到反馈或者收到网络异常等的反馈,tcp发送每个信息包送之后都会发送一个序号,接收方可根据序号将信息包组成完整的数据,也以此忽略已接收的信息包。

3.CDN是什么?
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

4.计算机七层网络结构是什么?分别有哪些协议?
计算机七层网络结构

python实操

1.实现一个带参数的装饰器

def outer(fn)

	def inner(*args,**kwargs)
		fn()
		print('this is a decorater')
	
	return inner

@outer
def func()
	pass

2.实现一个单例模式

class Example(object):
	__state = None
	def __init__(self,name):
		self.name = name
	
	def __new__(cls,*args,**kwargs):
		if not __state:
			__state = super().__new__(cls)
			return cls.__state
		else:
			return cls.__state

3.正则匹配一个邮箱

import re
re.match(r'^[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}$',text):  

Linux

1.查看进程资源占用
ps -aux | grep xx进程号

2.查看端口占用

netstat -anp | grep xx端口号

3.查看文本文件内容
cat

4.查看进程运行情况
ps

top

5.查看磁盘使用情况
df

6.监控虚拟内存 进程 cpu活动
vmstat

Git

1.切换分支
git checkout xx分支名
2.解决冲突
冲突情况:
情景一:多个分支代码合并到一个分支时;
情景二:多个分支向同一个远端分支推送代码时;
解决办法:
情景一:在当前分支上,直接修改冲突代码—>add—>commit。
情景二:在本地当前分支上,修改冲突代码—>add—>commit—>push

算法

1.快排等排序算法实现
2.使用生产者消费者模式,实现一个生产者线程随机生产一个字符,三个消费者线程记录生产的字符出现的次数。

数据库

1.提升查询速度有哪些措施?
建立索引,优化查询语句,分表分库,增加cache层。

2.mysql有哪些引擎?
InnoDB MEMORY MyISAM ARCHIVE

3.innoDB为什么使用B+tree作为存储结构?
  在B+树中,其非叶子的内部节点都变成了key值,因此其内部节点相对B 树更小。如果把所有同一内部节点的key存放在同一盘块中,那么盘块所能容纳的key数量也越多。一次性读内存中的需要查找的key值也就越多。相对来说IO读写次数也就降低了。
每次查询的时间复杂度是固定的
  在B+树中,由于分支节点只是叶子节点的索引,所以对于任意关键字的查找都必须从根节点走到分支节点,所有关键字查询路径长度相同,每次查询的时间复杂度是固定的。但是在B树中,其分支节点上也保存有数据,对于每一个数据的查询所走的路径长度是不一样的,所以查询效率也不一样。
遍历效率更高
  由于B+树的数据都存储在叶子节点上,分支节点均为索引,方便扫库,只需扫一遍叶子即可。但是B树在分支节点上都保存着数据,要找到具体的顺序数据,需要执行一次中序遍历来查找。所以B+树更加适合范围查询的情况,在解决磁盘IO性能的同时解决了B树元素遍历效率低下的问题。

4.事务的四个特性?
原子性,一致性,隔离性,永久性

最后,有些比较简单基础的概念性名词不做多的赘述。如有错误的地方,欢迎提出!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值