二十一, 谈谈正则的贪婪模式和非贪婪模式
在数量级匹配符中使用
默认为贪婪模式,用最多量的方式完成匹配
数量级匹配符后加?即为非贪婪 用最少的方式完成匹配
二十二, a=1 a=a+1 的堆栈内存过程
不可变类型,在调用栈里分配地址,地址直接对应值,如果修改会开辟一块新空间,存储新值,相互不影响
可变类型,在调用栈里分配地址,地址对应堆里分配的地址,堆的地址存储真正的值,如果修改会相互影响。
二十三, python的内存管理
从三个方面来说
一,对象的引用计数机制
二, 垃圾回收机制
三, 内存池机制
一, 对象的引用计数机制python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况
1,一个对象分配一个名称
2, 将其放入一个容器中(如列表,元组或字典)
引用计数减少的情况:
1, 使用del语句对对象别名显示的销毁
2, 引用超出作用域被重新赋值 sys,getrefcount()函数可以获得对象的当前引用计数
多数情况下,引用计数比我们猜测的要大的多。对于不可变类型(如数字和字符串), 解释器会在程序的不同部分共享内存,以便节约内存
二、垃圾回收
1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄漏)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
三、内存池机制
python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统
1,pymalloc机制,为了加速python的执行效率,python引入一个内存池机制,用于管理对小块内存的申请和释放
2,python中所有小于256字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc.
3,对于python对象,如整数,浮点数和list,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数
二十四, *arg和**kwarg作用
*arg代表位置的参数,它会接收任意多个参数并把这些参数作为元组传递给函数。
**kwargs代表的关键字参数,允许你使用没有事先定义的参数名。
位置参数一定要放在关键字参数的前面
作用:使用*args和**kwargs可以方便的定义函数,同时可以加强扩展性,以便日后的代码维护
二十五, is和==的区别
==是python标准操作符中的比较操作符,用来判断两个对象的value是否相等
is也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是id是否相同
二十六, filter, map, reduce的作用
filter()将符合条件的值过滤出来
map(lambda x:x*x, [12345]) # 根据提供的函数做指定序列的映射
reduce(function, iterable[,initializer]) # 对参数序列中的元素进行累计
二十七, 至少列举8个常用模板有哪些
1,sys 用于提供对解释器相关的访问以及维护,并有很强的交互功能
2,time:时间模块
3, os: 用于提供操作系统模块
4, ashlib: 用于加密相关的操作
5, random:生成随机变量
6,pickle:用于python特有类和python的数据类型间进行转换
7, datetime: data和time的结合体
8,re:正则表达式模块
二十八, json序列化时,可以处理的数据类型有哪些?如何定制支持datatime类型
json只能支持int\str\list\tuple\dict\
python
import json, datetime
from json import JSONEncoder
class ComplexEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
else:
return super(ComplexEncoder, self).default(obj)
d = {'name': 'alex', 'data': datetime.datetime.now()}
print(json.dumps(d, cls=ComplexEncoder))
# {"name": "alex", "data": "2018-09-28 14:49:42"}
自定义对datatime类型的序列化类, 继承JSONEncoder 使用里面的default方法,将编码失败的数据传入到这里,判断传入的对象是否是datatime类型,如果是则使用strtime方法进行还原成字符串。
三十, json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办
python
import json
a = json.dumps({"ddf": "你好"}, ensure_ascii=False)
print(a)
# {"ddf": "你好"}