python面试总结
-
python语言基础- 语言特点
- 语言基础
- 高级特性
- 算法和数据结构
- 常用算法和数据结构
- 分析时间/空间复杂度
- 实现常见数据结构和算法
- 编程范式
- 面向对象编程
- 常用设计模式
- 函数式编程
- 操作系统
- 常用Linux命令
- 进程/线程
- 内存管理
- 网络编程
- 常用协议TCP/IP/HTTP
- Socket编程基础
- Python并发库
- 数据库
- mysql常考,索引优化
- 关系型和NoSQL的使用场景
- Redis缓存
- python web框架
- 常用框架对比,RESTful
- WSGI原理
- Web安全问题
- 系统设计
- 设计原则,如何分析
- 后端系统常用组件(缓存、数据库、消息队列等)
- 技术选型和实现(短网址服务,Feed流系统)
- 技术之外,软实力
- 学习能力
- 业务理解能力,沟通交流能力
- 心态
-
python语言特性
-
python是静态还是动态类型?是强类型还是弱类型?
-
动态强类型语言
-
动态还是静态指的是编译期还是运行期确定类型
-
强类型指的是不会发生隐式类型转换
-
-
python作为后端语言的优缺点
-
为什么要用python?
-
胶水语言,轮子多,应用广泛
-
语言灵活,生产力高
-
性能问题、代码维护问题、python2/3兼容问题
-
-
什么是鸭子类型
-
关注点在对象的行为,而不是类型(duck typing)
-
比如file,StringIO,socket对象都支持read/write方法(file like object)
-
再比如定义了__iter__魔术方法的对象可以用for迭代
-
鸭子类型更关注接口而非类型
-
-
什么是monkey patch?哪些地方用到了?自己如何实现?
-
所谓的monkey patch就是运行时替换
-
比如gevent库需要修改内置的socket
-
from gevent import monkey;monkey.patch_socket()用阻塞的socket替换成非阻塞的
-
-
什么是自省?
-
Instrospection
-
运行时判断一个对象的类型的能力
-
Python一切皆对象,用type,id,isinstance获取对象类型信息
-
Inspect模块提供了更多获取对象信息的函数
-
id()打印十进制地址
-
isinstance
-
type
-
is和等号区别:等号判断数值,is判断数值和地址
-
-
-
什么是列表和字典推导?
-
List Comprehension
-
比如[ i for range(10) if i%2 == 0 ]
-
一种快速生成list/set/dict方式,用来代替map/filter等
-
-
-
知道python之禅吗
-
The Zen of Python
-
Tim Peters编写的关于Python编程的准则
-
import this
-
编程拿不准的时候参考
-
-
-
-
python2/3差异常考题
-
python3改进
-
print成为函数
-
编码问题,python3不会再有unicode对象,默认str就是unicode
-
除法变化。python3除号返回浮点数,不像python2直接截断返回整数
-
类型注解type hint.帮助ide类型检查
-
优化的super函数方便直接调用父类函数
-
高级解包操作a,b,*rest=range(10)
-
Keyword only arguments限定关键字参数
-
Chained exceptions.Python3重新抛出异常不会丢失栈信息
-
一切返回迭代器range,zip,map,dict,values,etc.are all iterators
-
懒加载,不返回列表占用内存,返回迭代器
-
-
-
python3新增语法和内置函数
-
yield from链接子生成器
-
asyncio内置库,async/await原生协程支持异步编程
-
新增的内置库,enum,mock,asyncio,ipaddress,concurrent.futures等等
-
生成的pyc文件统一放到__pycache__
-
一些内置库的修改。urllib,selector等
-
性能优化等。。。像dict
-
-
熟悉一些2/3兼容的工具
-
six模块
-
2to3等工具转换代码
-
__future__:在2里面用print()函数
-
-
-
-
python函数常考题
-
常考点:可变参数/不可变参数
-
python如何传递参数:一个容易混淆问题:
-
值传递还是引用?都不是,唯一支持的参数传递是共享传参
-
Call by Object(Call by Object Refrence or Call by Sharing)
-
Call by sharing(共享传参)函数行参获取实参中各个引用的副本
-
-
python可变/不可变对象
-
搞懂可变和不可变内置对象有利于理解函数参数的副作用
-
不可变对象bool/int/float/tuple/str/frozenset
-
可变对象list/set/dict
-
-
python可变参数作为默认参数:默认参数只计算一次
-
可变参数传递datetime.datetime.now(),日期不会每次调用函数方法的时候计算
-
-
python *args,**kwargs
-
函数传递中*args,**kwargs含义是什么
-
用来处理可变参数
-
*args打包成tuple
-
**kwargs打包成字典dict
-
-
-
-
-
python异常处理机制
-
python使用异常处理错误(有些语言使用错误码)
-
BaseException
-
SystemExit/KeyboardInterrupt/GeneratorExit
-
使用异常的常见场景
-
什么时候需要捕获处理异常呢?看python内置异常的类型
-
网络请求(超时,链接错误等)
-
资源访问(权限问题,资源不存在)
-
代码逻辑(越界访问、KeyError等)
-
-
如何处理异常
-
-
-
-
python性能分析与优化,GIL常考题
-
什么是Cpython GIL
-
GIL,Global Interpreter Lock
-
Cpython解释器的内存管理并不是线程安全的(多个线程访问同一个资源有问题)
-
保护多线程下对Python对象的访问
-
Cpython使用简单的锁机制避免多个线程同时执行字节码
-
-
GIL影响
-
限制了程序的多核执行
-
同一时间只有一个线程执行字节码
-
CPU密集程度难以利用多核优势
-
IO期间会释放GIL,对IO密集程序影响不大
有了GIL,非线程安全的
通过加锁保证线程安全,但对性能有一定影响
-
-
-
-
如何剖析程序性能
-
使用各种profile工具(内置或第三方)
-
二八定律,大部分时间耗时在少量代码上
-
内置的profile/cprofile等工具
-
使用pyflame(uber开源)的火焰图工具
-
-
服务端性能优化措施
-
web应用语言一般不会成为瓶颈
-
数据结构和算法优化
数据库层:索引优化、慢查询消除、批量操作减少IO、NoSQL
网络IO:批量操作、pipeline操作、减少IO
缓存:使用内存数据库redis/memcached
异步:asyncio,celery
并发:gevent/多线程
-
-
-
-
python单元测试
-
nose/pytest较为常用
-
mock模块用来模拟替代网络请求等
-
coverage统计单元覆盖率
-
-
python深拷贝和签拷贝
-
什么是深拷贝浅拷贝
-
python如何实现深拷贝
-
python中如何正确初始化一个二维数组?
-
CSDN-Ada助手: CS入门 技能树或许可以帮到你:https://edu.csdn.net/skill/gml?utm_source=AI_act_gml
皈依小和尚 回复 fomalhaut: 用来复习
fomalhaut: 牛逼