-
python是静态还是动态类型?是强类型还是弱类型?
动态类型语言
动态还是静态指的是编译期还是运行期确定类型 无类型声明
强类型:js数字转字符串会自动转换是弱类型 不会自动转换 -
python作为后端语言的优缺点?
1.胶水语言,轮子多,应用广泛
2.语言写起来快
3.性能比较慢,python2 python3 不兼容 -
什么是鸭子类型?
关注对象的行为【方法】,而不是类型
比如file StringIO socket 对象都支持read/write方法(file like object)
再比如定义了_iter_魔术方法的对象可以用for迭代 -
什么是monkey patch?那些地方用到了?自己如何实现?
所谓的monkey patch就是运行时类型替换
比如gevent库需要修改内置的socket
from gevent import monkey;
monkey.patch_socket()
(把内置阻塞的库替换成非阻塞的socket) -
什么是自省?
运行是判断一个对象的类型的能力。
python一切皆对象 -
is 和 == 区别?
is:比较的是两个对象的id值是否相等,也就是比较两个对象是否是同一个实例,是否指向同一个地址。
==:比较的是两个对象的内容是否相等,默认会调用对象的__equal__()方法
python所做的性能优化:
1.小整数对象[-5,256]是全局解释器范围内被重复使用,永远不会被GC回收。
2.同一个代码块中的不可变对象,只要是值相等的,就不会重复创建新的对象。
3.字符串中单个20以内他们的内存地址一样,单个21以上,内存地址不一样
-
什么是列表和字典推导?
一种快速生成list/dict/set的方式 -
什么是生成器,迭代器?
1.生成器定义
在Python中,一边循环一边计算的机制,称为生 成器:generator。
生成器仅仅保存了一套生成数值的算法,并且没有让这个算法现在就开始执行,而是我什么时候调它,它什么时候开始计算一个新的值,并给你返回。1)生成器(generator)能够迭代的关键是它有一个next()方法, 工作原理就是通过重复调用next()方法,直到捕获一个异常。 (2)带有 yield 的函数不再是一个普通函数,而是一个生成器generator。 可用next()调用生成器对象来取值。next 两种方式 t.__next__() | next(t)。 可用for 循环获取返回值(每执行一次,取生成器里面一个值) (基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代)。 (3)yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。 (4).send() 和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果 ——换句话说,就是send可以强行修改上一个yield表达式值。比如函数中有一个yield赋值,a = yield 5,第一次迭代到这里会返回5,a还没有赋值。第二次迭代时,使用.send(10),那么,就是强行修改yield 5表达式的值为10,本来是5的,那么a=10 我又想要得到庞大的数据,又想让它占用空间少,那就用生成器。 迭代原理 面试题:for循环的原理是什么? 答:1. 获取迭代器 2. 循环获取下一个元素 3. 遇到异常停止迭代 可以被for的条件是什么? 答:能被for的对象必须具备__iter__方法 答:能被for的对象是可迭代对象 2.迭代器是一个可以记住遍历的位置的对象。 迭代器有两个基本的方法:iter() 和 next()。
-
python2/3差异常考题
1.python3中print为函数,python2中print为关键字。
2.编码问题 python3不再有Unicode对象,默认str就是unicode
3.除法返回浮点数
4.string 字母 大小写字符串
string.letters:包含所有字母(大写或小写)的字符串
Python 3.0中,string.ascii_letters.
5.python 2.7 cmp(x,y)函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1python3.7 cmp()已经不存在了,如果你需要实现比较功能,需要引入 operator 模块,适合任何对象
6.python3可以加类型注解,帮助IDE实现类型检查
7.优化的super()方便直接调用父类函数
8.高级解包操作:
9.参数传递: -
Python新增
yield from 链接子生成器
asyncio内置库
新增库enum -
python3改进
生成的pyc文件统一放到_pychche_
一些内置库的修改 urllib selector
dict性能优化 -
python如何传递参数?
对象引用的方式传递
默认参数只计算一次
不可变对象:bool,int,float,tuple,str
可变对象:list set dict -
函数传递中*args,**kwargs含义是什么?
*args 被打包成tuple
**kwargs 字典 -
什么时候需要捕获处理异常呢?看python内置异常的类型。
1.网络请求(超时,连接错误)
2.资源访问(权限问题)
3.代码逻辑异常
finally:无论异常有没有发送都会执行的代码,一般处理资源的关闭和释放 -
什么是Cpython GIL
GIL:global interpreter lock
Cpython使用简单的锁机制避免多个线程同时执行字节码。
限制了程序的多核执行
同一个时间只能有一个线程执行字节码
CPU密集程序难以利用多核
IO期间会释放GIL,对I/O密集程序影响不大CPU:cpu密集可以使用多进程+进程池
IO:IO密集使用多协程、线程 -
如何剖析程序性能
使用内置的profile/cprofile等工具 -
服务端性能优化措施
1.数据结构与算法优化
2.数据库层:添加索引,批量操作,减少IO
3.缓存:使用内存数据库redis
4.异步框架:asyncio
5.并发:gevent/多线程 -
什么是生成器?
可以生成值的函数
当一个函数里有了yield关键字就成了生成器
生成器可以挂起执行并且报存当前执行的状态
19.什么是单元测试?
单元测试相关库:nose/pytest
如何设计测试用例:
1.正常值功能测试
2.边界值(比如最大,最小,最左最右)
3.异常值 (比如None,空值,非法值)
- Python深拷贝和浅拷贝?
深拷贝:又开辟了一块空间,复制过来
浅拷贝:指向的是同一个对象