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)
運行結果如下: