異常
捕獲異常 try...except...
else? 沒有捕獲異常云行
finally? 一定運(yùn)行的代碼
有異常 中斷,然后在except中執(zhí)行
raise 拋出異常 與Java throw 一樣
模塊
import? from .. import? from .. import *
as 起小名
定位模塊? 順序是:
1當(dāng)前目錄
2shell 變量PYTHONPATH下的每個(gè)目錄
3 默認(rèn)路徑? Unix下? 默認(rèn)路徑一般為/usr/local/lib/python/
4模塊搜索路徑存儲(chǔ)在system模塊的sys.path變量中。變量里包含當(dāng)前目錄,PYTHONPATH和由安裝過程決定的默認(rèn)目錄。
包 功能相同模塊放在一起? 有一個(gè)__init__.py文件,里面是__all__=["模塊名","模塊名"]
包將有聯(lián)系的模塊組織在一起,即放到同一個(gè)文件夾下,并且在這個(gè)文件夾創(chuàng)建一個(gè)名字為__init__.py?文件,那么這個(gè)文件夾就稱之為包
有效避免模塊名稱沖突問題,讓應(yīng)用組織結(jié)構(gòu)更加清晰
__init__.py?文件寫方法那么導(dǎo)入包時(shí)就會(huì)被調(diào)用
設(shè)計(jì)模式 :
簡(jiǎn)單工廠模式:定義一個(gè)類,通過傳入?yún)?shù) 返回一個(gè)特定的類
單例模式:確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,這個(gè)類稱為單例類,單例模式是一種對(duì)象創(chuàng)建型模式。
元類:創(chuàng)建類的類,像type(python 所有類的父) str(創(chuàng)建字符串對(duì)象) int(創(chuàng)建整數(shù)對(duì)象)
可以通過__class__來(lái)看自己是誰(shuí)創(chuàng)建的,__class__.__class__可以看到更上的創(chuàng)建類;
__metaclass__可以指定元類來(lái)創(chuàng)建對(duì)象,如果不指定,(先找父類,再找模塊)默認(rèn)type
動(dòng)態(tài)創(chuàng)建屬性與方法
P.run = types.MethodType(run, P)#給這個(gè)對(duì)象添加實(shí)例方法
Person.testClass = testClass? #給Person類綁定類方法? testClass? 上要有@classmethod
Person.testStatic = testStatic #給Person類綁定靜態(tài)方法 testStatic 上要有@staticmethod
刪除屬性方法
刪除的方法:
del 對(duì)象.屬性名
delattr(對(duì)象, "屬性名")
列表生成式? [ x*2 for x in range(5)]
生成器:一邊循環(huán)一邊計(jì)算的機(jī)制,稱為生成器:generator? ( x*2 for x in range(5))? 上面改成小括號(hào),生成對(duì)象,通過調(diào)用next()得到下個(gè)值,沒有值時(shí)報(bào)錯(cuò),還可以有yield
迭代器:可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱為迭代器:Iterator。
是可以記住遍歷的位置的對(duì)象。迭代器對(duì)象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會(huì)后退。
isinstance()?判斷對(duì)象是否可以迭代
一類是集合數(shù)據(jù)類型,如 list 、 tuple 、 dict 、 set 、 str 等;
一類是 generator ,包括生成器和帶 yield 的generator function。
生成器都是 Iterator 對(duì)象? 通過iter([]) 可以將 list 、 tuple 、 dict 、 set 、 str變成迭代器
閉包:
#在函數(shù)內(nèi)部再定義一個(gè)函數(shù),并且這個(gè)函數(shù)用到了外邊函數(shù)的變量,那么將這個(gè)函數(shù)以及用到的一些變量稱之為閉包
內(nèi)部函數(shù)對(duì)外部函數(shù)作用域里變量的引用(非全局變量),則
稱內(nèi)部函數(shù)為閉包。
1.閉包似優(yōu)化了變量,原來(lái)需要類對(duì)象完成的工作,閉包也可以完成
2.由于閉包引用了外部函數(shù)的局部變量,則外部函數(shù)的局部變量沒有及時(shí)釋放,消耗內(nèi)存
裝飾器:運(yùn)用閉包原理給方法加上其它功能
引入日志
函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)
執(zhí)行函數(shù)前預(yù)備處理
執(zhí)行函數(shù)后清理功能
權(quán)限校驗(yàn)等場(chǎng)景
緩存
作用域
LEGB 規(guī)則? ? locals 當(dāng)前所在命名空間-> enclosing function 外部嵌套函數(shù)的命名空間(閉包中常見)-> globals 全局變量,函數(shù)定義所在模塊的命名空間 -> builtins 內(nèi)建模塊的命名空間。
is與==? is 比較是否指向同一個(gè)對(duì)象? == 比較兩對(duì)象是否相等
深拷貝,? 深拷貝是對(duì)于一個(gè)對(duì)象所有層次的拷貝(遞歸)? copy.deepcopy
淺拷貝 : 拷貝了引用,并沒有拷貝內(nèi)容? 賦值=
copy.copy? ? 拷貝不可變類型直接淺拷貝, 如果可變類型 ,只考貝第一層
可變類型? ? 列表? 字典
不可變? 元祖,數(shù)字,字符串
copy是淺拷貝,只拷貝可變對(duì)象的父級(jí)元素。 deepcopy是深拷貝,遞歸拷貝可變對(duì)象的所有元素
[-5, 257)? 數(shù)字已經(jīng)在python中建好? 其他的大數(shù)字均要?jiǎng)?chuàng)建新對(duì)象
intern機(jī)制? 字符串? (沒空格)不可修改,默認(rèn)開啟intern機(jī)制引用計(jì)數(shù)為0則銷毀? 有空格不開啟
垃圾回收
1引用計(jì)數(shù)機(jī)制 (主要) :python每個(gè)東西都是對(duì)象,核心是一個(gè)結(jié)構(gòu)體? PyObject(每個(gè)對(duì)象必有),里面的ob_refcnt就是做為引用計(jì)數(shù)。當(dāng)一個(gè)對(duì)象有新的引用時(shí),它的ob_refcnt就會(huì)增加,當(dāng)引用它的對(duì)象被刪除,它的ob_refcnt就會(huì)減少。當(dāng)引用計(jì)數(shù)為0時(shí),該對(duì)象生命就結(jié)束了。
優(yōu)點(diǎn): 簡(jiǎn)單,實(shí)時(shí)(垃圾回收時(shí)間分?jǐn)偟狡綍r(shí))
缺點(diǎn):維護(hù)引用計(jì)數(shù)消耗資源,循環(huán)引用無(wú)法回收
+1情況
對(duì)象被創(chuàng)建,例如a=23
對(duì)象被引用,例如b=a
對(duì)象被作為參數(shù),傳入到一個(gè)函數(shù)中,例如func(a)
對(duì)象作為一個(gè)元素,存儲(chǔ)在容器中,例如list1=[a,a]
-1 情況
對(duì)象的別名被顯式銷毀,例如del a
對(duì)象的別名被賦予新的對(duì)象,例如a=24
一個(gè)對(duì)象離開它的作用域,例如f函數(shù)執(zhí)行完畢時(shí),func函數(shù)中的局部變量(全局變量不會(huì))
對(duì)象所在的容器被銷毀,或從容器中刪除對(duì)象
2標(biāo)記-清除和分代收集為輔:
標(biāo)記的時(shí)候需要確定內(nèi)存對(duì)象的集合Root set,集合里的對(duì)象都是可以訪問的。如果Root set中的對(duì)象引用了其他的對(duì)象,那么被引用的對(duì)象也不能被標(biāo)記為垃圾對(duì)象。然后從Root set出發(fā),遞歸遍歷Root set能訪問到的所有對(duì)象,進(jìn)行標(biāo)記為不是垃圾對(duì)象。遍歷結(jié)束后,沒有被標(biāo)記的就是垃圾對(duì)象。
分代收集:
分代回收的整體思想是:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時(shí)間劃分為不同的集合,每個(gè)集合就成為一個(gè)“代”,垃圾收集頻率隨著“代”的存活時(shí)間的增大而減小,存活時(shí)間通常利用經(jīng)過幾次垃圾回收來(lái)度量。
Python默認(rèn)定義了三代對(duì)象集合,索引數(shù)越大,對(duì)象存活時(shí)間越長(zhǎng)
常用的python庫(kù)

