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,都有独立的私有内存池。也就是你分配又释放了大量的整数,用于缓存这些整数的内存就不能在分配给浮点数
2 lambda函数
lambda通常在需要一个函数却不想去命名一个函数的场合下使用,也就是指匿名函数
lambda函数:首要用途是指点短小的回调函数
lambda[arg]:expression
例如 a = lambda x,y:x+y
3 tuple list转换
tuple(list) list(tuple)
4 删除list里的重复元素
使用set函数 set(list)
5 sorted与sort
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。
sorted(iterable,key=None,reverse=False),返回新的列表,对所有可迭代的对象均有效
sort(key=None,reverse=False) 就地改变列表 reverse:True反序;False 正序
例如
>>>sorted([1,3,2,4,5])
[1,2,3,4,5]
>>>a=[5,4,3,2,1]
>>>a.sort()
>>>a
[1,2,3,4,5] #若用list.sort()则list本身将被修改
>>>sorted("This is a test string from Andrew".split(), key=str.lower) #加了key,忽略大小写
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This'] #key=len按照长度进行排序
>>>sorted("This is a test string from Andrew".split()) #未加key,默认大写在前,小写在后
['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
>>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>>student_tuples.sort(key=lambda x: x[2])
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>>s=”Hello79351WorldMyNameIsMrFiona0352231964”
>>>''.join(sorted(s,key=lambda x: (x.isdigit(),x.isdigit() and int(x)%2==0,x.islower(),x.isupper(),x)))
'FHIMMNWaadeeilllmnooorrsy113335579902246'
大写在前,小写在后,数字放在最后并且奇数在偶数之前
>>>s={‘a’:10,’t’:5,’c’:2,’b’:12}
>>>sorted(s,key=lambda x:x[0])
[‘a’,’b’,’c’,’t’]
>>>s=[]
一个学校,有3个办公室,现在有8位老师等待工位的分配,请编写程序,完成随机的分配
#encoding=utf-8importrandom
# 定义一个列表用来保存3个办公室
offices = [[],[],[]]
# 定义一个列表用来存储8位老师的名字
names = ['A','B','C','D','E','F','G','H']
i =0
for name in names:
index = random.randint(0,2)
offices[index].append(name)
i =1
for tempNames in offices:
print('办公室%d的人数为:%d'%(i,len(tempNames)))
i+=1
for name in tempNames:
print("%s"%name,end='')
print("\n")
print("-"*20)
运行结果如下: