Python 相关面试题
Linux https://pythonav.com/wiki/detail/3/57/ 答案
答案
第一部分 Python基础篇
-
为什么学习Python
简单,酷。相对于java代码较为简洁。
-
通过什么途径学习Python
买点视频,看文档,看书啊,练习,练习,练习,
-
谈谈对Python和其他语言的区别
Python 是 解释性语言,跨平台。
java 编译型语言,依赖于JVM跨平台,先编译为字节码文件,JVM解释执行
-
简述解释型和编译型编程语言
解释型,解释一句,执行一句
编译型,编译为机器码,直接执行
-
python的解释器种类以及相关特点?
CPython,常用的解释器,有GIL的
IPython,交互式的CPython
PyPy,追求速度的解释器,采用JIT技术,动态编译
JPython,在JAVA平台的解释器,可以编译为JAVA字节码文件交给JVM执行
IronPython,在微软.Net平台的解释器,可以编译为.Net字节码文件执行
-
位和字节的关系
位,bit,计算机数据存储的最小单位 ,一个二进制位只能表示为01两种状态
字节,byte,B, 1Byte = 8bit,一个ASCI码一个字节,一个中文汉字
字,在计算机中,一串数码作为一个整体来处理或运算的,称为一个计算机字,简称宇。字通常分为若干个字节(每个字节一般是8位)。在存储器中,通常每个单元存储一个字,因此每个字都是可以寻址的。字的长度用位数来表示。
-
b、B、KB、MB、GB的关系
1GB = 2^10MB = 2^20KB = 2^30B = 2^40b
-
PE8规范
缩进,空格,空行,命名,import,
-
通过代码实现如下转换(进制之间转换)
oct,bin,hex,int
-
python2如何迁移到python3
- 2to3模块 官方模块
-
请编写一个函数实现将IP地址转换成一个整数
字符串分割、进制转换
-
字符串全组合,全排列 TODO
-
python递归的最大层数?
998,可以通过
sys.setrecursionlimit(1000000)设置 -
求结果(and or or)
-
ascii、unicode、utf-8、gbk 区别
1. 不同的编码类型 1. ascii ,256个字符,只支持英文 2. unicode 万国码 所有字符(无论中文、英文等)1个字符:4个字节 (utf32) 3. utf8 , Unicode变种,英文1个字节,欧洲字符:2个字节, 亚洲: 3个字节 4. gbk 国标,中国的编码类型 1个字符,英文1个字节,中文2个字节。 5. [python下编译py成pyc和pyo](https://www.cnblogs.com/dkblog/archive/2009/04/16/1980757.html) 6. java 与 Python https://blog.csdn.net/ztf312/article/details/53995636 -
为什么python慢
- GIL 不能利用多核资源
- 解释性,相较于直接执行机器码,会慢很多,(JAVA编译为字节码后再JVM解释执行,会将部分代码再次编译为机器码)
- 关于JIT 即时编译, just in time
-
字节码和机器码的区别
1. C代码被编译成机器码(二进制),在机器上直接执行 2. Cpython编译你的python源代码,生成字节码。 3. 机器码快的多,字节码更易迁移,也安全。 4. python的 pyc文件,经py文件编译生成,是一种byte code ,跨平台,由虚拟机解释执行 -
三元运算写法和应用场景?
- 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
a = b if exat else c
-
Python3和Python2的区别?
- range
- str
- py2中分ascii(8位)、unicode(16位);
- py3中所有字符串都是unicode字符串
-
用一行代码实现数值交换
a,b = b,a
-
Python3和Python2中int和long区别
- python3 只有int 类似 Python2 long
- pyhton2
- int sys.maxint
- long 长整形, 无线长度,内部 数组实现
-
xrange和range的区别
- python2,xrange生成器,range 一个集合
- python3 ,一样效果,都是生成器
-
文件操作时:xreadlines和readlines的区别?
- 同上
-
列举布尔值为False的常见值?
[]、{}、None、’’、()、0、False
-
字符串、列表、元组、字典每个常用的5个方法?
- 字符串,
isdigst(),lowwer,upper(),strip(),split() - 列表
replace(),count(),index(),append(),insert() - 元组
index(),count() - 字典 ,
update(),get(),keys(),values(),items(),clear()
- 字符串,
-
lambda表达式格式以及应用场景?
f = lambda x : x+1- 与内置函数一起使用,一般定义调用一次
-
pass的作用
- Pass一般用于站位语句,保持代码的完整性,不会做任何操作。
-
*arg和
**kwarg作用- 他们是一种动态传参,一般不确定需要传入几个参数时,可以使用其定义参数,然后从中取参
- '*args':按照位置传参,将传入参数打包成一个‘元组’(打印参数为元组-- tuple)
- '**kwargs':按照关键字传参,将传入参数打包成一个‘字典’(打印参数为字典-- dict)
-
is和==的区别
- is 比较内存地址,唯一标值 id()
- ==比较值
-
谈谈Python的深浅拷贝?以及实现方法和应用场景。
-
#浅拷贝: 不管多么复杂的数据结构,只copy对象最外层本身,该对象引用的其他对象不copy, 内存里两个变量的地址是一样的,一个改变另一个也改变。 #深拷贝: 完全复制原变量的所有数据,内存中生成一套完全一样的内容;只是值一样,内存地址不一样,一方修改另一方不受影响 -
小数据池中的数据不拷贝
-
-
Python垃圾回收机制?
1. 以引用计数机制为主,分代处理后使用标记清除机制处理重复引用 -
Python的可变类型和不可变类型?
- 可变数据类型,[],{},{}
- 不可变数据类型,(),str,int
-
列举常见的内置函数
abs()
map
filter
map与filter总结
isinstance\type
zip 拉链函数 -
filter、map、reduce的作用? 内置函数:map、reduce、filter的用法和区别
-
# map:遍历序列,为每一个序列进行操作,获取一个新的序列 # reduce:对于序列里面的所有内容进行累计操作 # filter:对序列里面的元素进行筛选,最终获取符合条件的序列
-
-
一行代码实现9*9乘法表
print('\n'.join(['\t'.join(['{}*{}={}'.format(j, i, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))
-
如何安装第三方模块?以及用过哪些第三方模块?
pip install request
-
yield 与 yield from1. yield from 可以从另一个迭代器,返回值 2. 可以帮我们处理一些异常等 -
常用模块都有那些?
- os,sys,re,time,random,json
-
re的match和search区别?
- math,从字符串起始位置开始匹配,如果没有就返回None
- search,从字符串的起始位置开始匹配,匹配到第一个符合的就不会再去匹配了
-
什么是正则的贪婪匹配?
a.*a,匹配 所有字符a.?*a, 匹配到就结束
-
def func(a,b=[]) 这种写法有什什么坑?
- 可变类型作为参数,如果每个参数都传值了没问题,如果可变类型没有传递参数他将会一直使用一个容器
-
如何实现 “1,2,3” 变成 [‘1’,’2’,’3’]
-
如何实现[‘1’,’2’,’3’]变成[1,2,3]
-
a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
-
如何用一行代码生成[1,4,9,16,25,36,49,64,81,100]
-
一行代码实现删除列表中重复的值
-
如何在函数中设置一个全局变量
- global
-
logging模块的作用?以及应用场景?
- 管理我们程序的执行日志,省去用print记录操作日志的操作,并且可以将标准输入输出保存到日志文件
- 爬虫爬取数据时,对爬取进行日志记录,方便分析、排错。
-
请用代码简答实现stack
-
常用字符串格式化哪几种?
- %s
- format
-
简述 生成器、迭代器、可迭代对象 以及应用场景?
-
简述 生成器、迭代器、可迭代对象 以及应用场景? Python可迭代对象(Iterable) Python中经常使用for来对某个对象进行遍历,此时被遍历的这个对象就是可迭代对象,像常见的list,tuple都是。<br>如果给一个准确的定义的话,就是只要它定义了可以返回一个迭代器的__iter__方法,或者定义了可以支持下标索引的__getitem__方法<br>,那么它就是一个可迭代对象。 Python迭代器(iterator) 迭代器是通过next()来实现的,每调用一次他就会返回下一个元素,当没有下一个元素的时候返回一个StopIteration异常,<br>所以实际上定义了这个方法的都算是迭代器。 生成器(Generators) 生成器是构造迭代器的最简单有力的工具,与普通函数不同的只有在返回一个值的时候使用yield来替代return,然后yield会自动构建好next()和iter() 因为迭代器如此普遍,python专门为for关键字做了迭代器的语法糖。在for循环中,Python将自动调用工厂函数iter()获得迭代器,<br>自动调用next()获取元素,还完成了检查StopIteration异常的工作。
-
-
用Python实现一个二分查找的函数。
-
谈谈你对闭包的理解?
- 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。
-
os和sys模块的作用?
-
# os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口; # sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python运行环境
-
-
如何生成一个随机数?
random.random()
-
如何使用python删除一个文件?
os.remove()
-
谈谈你对面向对象的理解
-
#封装: 其实就是将很多数据封装到一个对象中,类似于把很多东西放到一个箱子中, 如:一个函数如果好多参数,起始就可以把参数封装到一个对象再传递。 #继承: 如果多个类中都有共同的方法,那么为了避免反复编写,就可以将方法提取到基类中实现, 让所有派生类去继承即可。 #多态: 指基类的同一个方法在不同派生类中有着不同功能。python天生支持多态。
-
-
Python面向对象中的继承有什么特点
- 多继承 ,C3算法
-
面向对象中super的作用?
- 主要在子类继承父类的所有属性和方法时来使用
-
是否使用过functools中的函数?其作用是什么?
- partical 偏函数
- cpm ,比较器
- wraps 装饰器
-
列举面向对象中带双下划线的特殊方法,如:
__new__、__init__-
__str__ __new__ __init__ __iter__ __call__
-
-
如何判断是函数还是方法?
-
# 看他的调用者是谁,如果是类,需要传入参数self,这时就是一个函数; # 如果调用者是对象,不需要传入参数值self,这时是一个方法。 (FunctionType/MethodType)
-
-
静态方法和类方法区别?
-
类方法:是类对象的方法,在定义时需要在上方使用“@classmethod”进行装饰,形参为cls, 表示类对象,类对象和实例对象都可调用。 静态方法:是一个任意函数,在其上方使用“@staticmethod”进行装饰,可以用对象直接调用, 静态方法实际上跟该类没有太大关系。
-
-
列举面向对象中的特殊成员以及应用场景
- 等同于 对象中的 双下滑线方法
-
1、2、3、4、5 能组成多少个互不相同且无重复的三位数
- 排列数
-
什么是反射?以及应⽤用场景?
-
反射就是以字符串的方式导入模块,以字符串的方式执行函数 # 应用场景: rest framework里面的CBV
-
-
metaclass作用?以及应用场景?
- 元类,用于 new 类 元类
-
用尽量多的方法实现单例模式
-
装饰器,元类, new
import threading class Singleton(object): _lock = threading.Lock() def __new__(cls, *args, **kwargs): with Singleton._lock: if not hasattr(Singleton, '_instance'): Singleton._instance = object.__new__(cls) return Singleton._instance -
-
装饰器器的写法以及应用场景。
-
异常处理写法以及如何主动跑出异常(应用场景)
-
什么是面向对象的mro
- 方法解析顺序,按照对象中的MRO表寻找方法,由C3算法完成MRO
-
isinstance作用以及应用场景?
- 判断一个是否是另外一个类的子类
-
json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
- 字典、列表、数字、字符串、元组;如果是元组,自动转成列表(再转回去的话也是列表)
-
json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
-
a=json.dumps({"xxx":"你好"},ensure_ascii=False)
-
-
什么是断言?应用场景?
-
# 条件成立则继续往下,否则抛出异常; # 一般用于:满足某个条件之后,才能执行,否则应该抛出异常。 '应用场景':rest framework中GenericAPIView类里,要设置queryset,否则断言错误
-
-
有用过with statement吗?它的好处是什么?
-
with open
-
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作, 释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
-
-
使用代码实现查看列举目录下的所有文件
path = os.listdir('.') #查看列举目录下的所有文件。
-
简述 yield和yield from关键字
- yield 就是保存当前程序执行状态。你用for 循环的时候,每次取一个元素的时候就会计算一次。用yield 的函数叫generator,和iterator 一样,它的好处是不用一次计算所有元素,而是用一次算一次,可以节省很多空间。generator每次计算需要上一次计算结果,所以用yield,否则一return,上次计算结果就没了。
第二部分 网络编程和并发 todo
- 简述 OSI 七层协议。
- 什么是C/S和B/S架构?
- 简述 三次握手、四次挥手的流程。
- TCP和UDP的区别?
- 为何基于tcp协议的通信比基于udp协议的通信更可靠?
- 什么是socket?简述基于tcp协议的套接字通信流程。
- 什么是粘包? socket 中造成粘包的原因是什什么? 哪些情况会发生粘包现象?
- IO多路复的作用?
- select、poll、epoll 模型的区别?(属于多路复用IO的模型)
- 什么是防火墙以及作用?
- 简述 进程、线程、协程的区别 以及应用场景?
- GIL锁是什么?
- Python中如何使用线程池和进程池?
- threading.local的作用?
- 进程之间如何进行通信?
- 什么是并发和并行?
- 进程锁和线程锁的作用?
- 解释什么是异步非阻塞?
- 路由器和交换机的区别
- 什么是域名解析?
- 如何修改本地hosts件?
- 生产者消费者模型应用场景及优势?
- 什么是cdn?
- LVS是什么及作用?
- Nginx是什么及作用?
- keepalived是什么及作用?
- haproxy是什么以及作用?
数据库和缓存(46题)
- 列举常见的关系型数据库和非关系型都有那些?
- MySQL常见数据库引擎及比较?
- 简述数据库三大范式?
- 什么是事务?MySQL如何支持事务?
- 简述数据库设计中一对多和多对多的应用场景?
- 如何基于数据库实现商城商品计数器?
- 常见SQL(必备)
- 简述触发器、函数、视图、存储过程?
- MySQL索引种类
- 索引在什么情况下遵循最左前缀的规则?
- 主键和外键的区别?
- MySQL常见的函数?
- 列举 创建索引但是无法命中索引的8种情况。
- 如何开启慢日志查询?
- 数据库导入导出命令(结构+数据)?
- 数据库优化方案?
- char和varchar的区别?
- 简述MySQL的执行计划?
- 在对name做了唯一索引前提下,简述以下区别:
- 1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?
- 什么是索引合并?
- 什么是覆盖索引?
- 简述数据库读写分离?
- 简述数据库分库分表?(水平、垂直)
- redis和memcached比较?
- redis中数据库默认是多少个db 及作用?
- python操作redis的模块?
- 如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?
- redis如何实现主从复制?以及数据同步机制?
- redis中的sentinel的作用?
- 如何实现redis集群?
- redis中默认有多少个哈希槽?
- 简述redis的有哪几种持久化策略及比较?
- 列举redis支持的过期策略。
- MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?
- 写代码,基于redis的列表实现 先进先出、后进先出队列、优先级队列。
- 如何基于redis实现消息队列?
- 如何基于redis实现发布和订阅?以及发布订阅和消息队列的区别?
- 什么是codis及作用?
- 什么是twemproxy及作用?
- 写代码实现redis事务操作。
- redis中的watch的命令的作用?
- 基于redis如何实现商城商品数量计数器?
- 简述redis分布式锁和redlock的实现机制。
- 什么是一致性哈希?Python中是否有相应模块?
- 如何高效的找到redis中所有以aaa开头的key?
第四部分 前端、框架和其他(155题)
- 谈谈你对http协议的认识。
- 谈谈你对websocket协议的认识。
- 什么是magic string ?
- 如何创建响应式布局?
- 你曾经使用过哪些前端框架?
- 什么是ajax请求?并使用jQuery和XMLHttpRequest对象实现一个ajax请求。
- 如何在前端实现轮训?
- 如何在前端实现长轮训?
- vuex的作用?
- vue中的路由的拦截器的作用?
- axios的作用?
- 列举vue的常见指令。
- 简述jsonp及实现原理?
- 什么是cors ?
- 列举Http请求中常见的请求方式?
- 列举Http请求中的状态码?
- 列举Http请求中常见的请求头?
- 看图写结果(js):
看图写结果(js):
看图写结果:(js)
看图写结果:(js)
看图写结果:(js)
看图写结果:(js) - django、flask、tornado框架的比较?
- 什么是wsgi?
- django请求的生命周期?
- 列举django的内置组件?
- 列举django中间件的5个方法?以及django中间件的应用场景?
- 简述什么是FBV和CBV?
- FBV与CBV的区别
- django的request对象是在什么时候创建的?
- 如何给CBV的程序添加装饰器?
- 列举django orm 中所有的方法(QuerySet对象的所有方法)
- only和defer的区别?
- select_related和prefetch_related的区别?
- filter和exclude的区别?
- 列举django orm中三种能写sql语句的方法。
- django orm 中如何设置读写分离?
- F和Q的作用?
- values和values_list的区别?
- 如何使用django orm批量创建数据?
- django的Form和ModeForm的作用?
- django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
- django的Model中的ForeignKey字段中的on_delete参数有什么作用?
- django中csrf的实现机制?
- django如何实现websocket?
- 基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
- django中如何实现orm表中添加数据时创建一条日志记录。
- django缓存如何设置?
- django的缓存能使用redis吗?如果可以的话,如何配置?
- django路由系统中name的作用?
- django的模板中filter和simple_tag的区别?
- django-debug-toolbar的作用?
- django中如何实现单元测试?
- 解释orm中 db first 和 code first的含义?
- django中如何根据数据库表生成model中的类?
- 使用orm和原生sql的优缺点?
- 简述MVC和MTV
- django的contenttype组件的作用?
- 谈谈你对restfull 规范的认识?
- 接口的幂等性是什么意思?
- 什么是RPC?
- Http和Https的区别?
- 为什么要使用django rest framework框架?
- django rest framework框架中都有那些组件?
- django rest framework框架中的视图都可以继承哪些类
- 简述 django rest framework框架的认证流程。
- django rest framework如何实现的用户访问频率控制?
- Flask框架的优势?
- Flask框架依赖组件
- Flask蓝图的作用
- 列举使用的Flask第三方组件?
- 简述Flask上下文管理流程?
- Flask中的g的作用?
- Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?
- 为什么要Flask把Local对象中的的值stack 维护成一个列表?
- Flask中多app应用是怎么完成?
- 在Flask中实现WebSocket需要什么组件?
- wtforms组件的作用?
- Flask框架默认session处理机制?
- 解释Flask框架中的Local对象和threading.local对象的区别?
- Flask中 blinker 是什么?
- SQLAlchemy中的 session和scoped_session 的区别?
- SQLAlchemy如何执行原生SQL?
- ORM的实现原理?
- DBUtils模块的作用?
- SQLAchemy中如何为表设置引擎和字符编码?
- SQLAchemy中如何设置联合唯一索引?
- 简述Tornado框架的特点。
- 简述Tornado框架中Future对象的作用?
- Tornado框架中如何编写WebSocket程序?
- Tornado中静态文件是如何处理的? 如:
- Tornado操作MySQL使用的模块?
- Tornado操作redis使用的模块?
- 简述Tornado框架的适用场景?
- git常见命令作用:
- 简述以下git中stash命令作用以及相关其他命令。
- git 中 merge 和 rebase命令 的区别。
- 公司如何基于git做的协同开发?
- 如何基于git实现代码review?
- git如何实现v1.0 、v2.0 等版本的管理?
- 什么是gitlab
- github和gitlab的区别?
- 如何为github上牛逼的开源项目贡献代码?
- git中 .gitignore文件的作用
- 什么是敏捷开发?
- 简述 jenkins 工具的作用?
- 公司如何实现代码发布?
- 简述 RabbitMQ、Kafka、ZeroMQ的区别?
- RabbitMQ如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?
- RabbitMQ如何对消息做持久化?
- RabbitMQ如何控制消息被消费的顺序?
- 以下RabbitMQ的exchange type分别代表什么意思?如:fanout、direct、topic。
- 简述 celery 是什么以及应用场景?
- 简述celery运行机制。
- celery如何实现定时任务?
- 简述 celery多任务结构目录
- celery中装饰器 @app.task 和 @shared_task的区别?
- 简述 requests模块的作用及基本使用?
- 简述 beautifulsoup模块的作用及基本使用?
- 简述 seleninu模块的作用及基本使用?
- scrapy框架中各组件的工作流程?
- 在scrapy框架中如何设置代理(两种方法)?
- 中间件
- 环境变量(os.environ['HTTPS_PROXY'] = 'https:ip:port')
- scrapy框架中如何实现大文件的下载?
- scrapy中如何实现限速?
- DOWNLOAD_DELAY = 1
- 如何提升爬虫的效率
- 线程池
- scrapy配置文件相关配置(禁用cookie,禁止重试,减小下载超时,增加并发,日志等级)
- scrapy中如何实现暂停爬虫?
- 分布式直接停止就可以
- 普通
- JOBDIR='sharejs.com'
- control-C
- scrapy中如何进行自定制命令?
- scrapy中如何实现的记录爬虫的深度?
- scrapy中的pipelines工作原理?
- scrapy的pipelines如何丢弃一个item对象?
- yield item 在spider 中判断
- item.class 在pipeline 中放弃持久化操作
- 简述scrapy中爬虫中间件和下载中间件的作用?
- scrapy-redis组件的作用?
- scrapy-redis组件中如何实现的任务的去重?
- scrapy-redis的调度器如何实现任务的深度优先和广度优先?....
- DEPTH_PRIORITY = 1
- SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
- SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
- 广度优先:不全部保留结点,占用空间少;运行速度慢
- 深度优先:保留全部结点,占用空间大;运行速度快
- https://www.cnblogs.com/zhaof/p/7092400.html
- 简述 vitualenv 及应用场景?
- 简述 pipreqs 及应用场景?
- 在Python中使用过什么代码检查工具?
- 简述 saltstack、ansible、fabric、puppet工具的作用?
- B Tree和B+ Tree的区别?
- 请列举常见排序并通过代码实现任意三种。
- 请列举常见查找并通过代码实现任意三种。
- 请列举你熟悉的设计模式?
- 有没有刷过leetcode?
- 列举熟悉的的Linux命令。
- 公司线上服务器是什么系统?
- 解释 PV、UV 的含义?
- 解释 QPS的含义?
- uwsgi和wsgi的区别?
- supervisor的作用?
- 什么是反向代理?
- 简述SSH的整个过程。
- 有问题都去那些找解决方案?
- 是否有关注什么技术类的公众号?
- 最近在研究什么新技术?
- 是否了解过领域驱动模型?
- 二进制与十进制之间的转换
- 整数部分

浙公网安备 33010602011771号