1. is 比較的是兩個實例對象是否是徹底相同,它們是否是同一個對象,佔用的內存地址是否相同python
== 比較的是兩個對象的內容是否相等程序員
2.數據庫
with語句時用於對try except finally 的優化,讓代碼更加美觀,數組
例如經常使用的開發文件的操做,用try except finally 實現:安全
f=open('file_name','r') try: r=f.read() except: pass finally: f.close()
打開文件的時候,爲了能正常釋放文件的句柄,都要加個try,而後再finally裏把f close掉,可是這樣的代碼不美觀,finally就像個尾巴,一直託在後面,尤爲是當try裏面的語句時幾十行多線程
用with的實現:函數
with open('file_name','r') as f: r=f.read()
這條語句就好簡潔不少,當with裏面的語句產生異常的話,也會正常關閉文件大數據
除了打開文件,with語句還能夠用於哪些地方呢?優化
with只適用於上下文管理器的調用,除了文件外,with還支持 threading、decimal等模塊,固然咱們也能夠本身定義能夠給with調用的上下文管理器spa
在開發的過程當中,會有不少對象在使用以後,是須要執行一條或多條語句來進行關閉,釋放等操做的,例如上面說的的文件,還有數據庫鏈接,鎖的獲取等,這些收尾的操做會讓代碼顯得累贅,也會形成因爲程序異常跳出後,沒有執行到這些收尾操做,而致使一些系統的異常,還有就是不少程序員會忘記寫上這些操做-_-!-_-!,爲了不這些錯誤的產生,with語句就被生產出來了。with語句的做用就是讓程序員不用寫這些收尾的代碼,而且即便程序異常也會執行到這些代碼(finally的做用)
3.gil
GIL是什麼?GIL的全稱是Global Interpreter Lock(全局解釋器鎖),來源是python設計之初的考慮,爲了數據安全所作的決定
在Python多線程下,每一個線程的執行方式:
1.獲取GIL
2.執行代碼直到sleep或者是python虛擬機將其掛起。
3.釋放GIL
可見,某個線程想要執行,必須先拿到GIL,咱們能夠把GIL看做是「通行證」,而且在一個python進程中,GIL只有一個。拿不到通行證的線程,就不容許進入CPU執行。
4.list是可變數組
truple是常量數組
5.python的值是參數傳遞仍是引用傳遞
說傳值或者傳引用都不許確。非要安一個確切的叫法的話,叫傳對象(call by object)
6.
Python 中的迭代器、生成器、裝飾器
迭代器; 是什麼:是一個抽象的概念,任何對象,若是它實現了next方法和iter方法,就是迭代器。
next方法要麼返回迭代中的下一項,要麼返回一個stapIteration異常,iter方法要返回一個迭代器對象,而它自己就是一個迭代器對象,全部返回本身自己。
做用:像咱們提供一箇中間人即迭代器幫助咱們迭代遍歷使用 for循環其實就實現了迭代器的功能,在遍歷list,string,dict,tuple這些容器時,在 for語句對容器對象調用的iter()方法返回一個定義next()方法的迭代器對象,它在函數中逐個訪問容器內的元素,next和iter都是python內置函數。
生成器: 是什麼:生成器是一種特殊的迭代器,在函數中有yield關鍵字就能夠說是生成器。 怎麼用:調用next(),就會返回yield後面的值,生成器掛起,再次使用next就從上次中止的位置繼續執行。 做用:延遲計算,一次返回一個結果。當咱們須要結果的時候纔會調用,而不是一次返回全部的結果。 也就是說,它不會一次生成全部的結果,這對於大數據量處理,將會很是有用。 建立方法:1.把列表生成式的[ ]改成()就是一個簡單的列表生成器 2.使用yield關鍵字
生成器和迭代器的區別:生成器能作到迭代器能作到的全部事,由於自動建立iter方法和next方法,顯的比較簡潔,高效。使用生成器表達式比列表解析要節省內存(前者是須要的時候才調用next返回一個值,後者直接返回一個列表),自動拋出StopIteration異常
裝飾器:在不改變已存在的對象的功能狀況下添加額外的功能 def set_fun(func): call_fun(*arge,**kwargs): reurn func(*arge,**kwargs) return call_fun