python干货_python 基础干货 02
list 與 tuple
list 類似 數組
tuple 跟 list 一樣, 只是一旦定義, 里邊的內容不可以改變.
這樣, 上邊的內容就不可以改變了.
"可變的" tuple, 不是說 tuple 是不可以改變的么?
想內存
dict 與 set
dict 是 python內置字典, 其他語言中稱為 map, 使用鍵-值(key-value)存儲,具有極快的查找速度.
dict 中是沒有順序先后關系的.
和list比較,dict有以下幾個特點:
1. 查找和插入的速度極快,不會隨著key的增加而變慢
2. 需要占用大量的內存,內存浪費多
而list相反:
1. 查找和插入的時間隨著元素的增加而增加
2. 占用空間小,浪費內存很少
所以,dict是用空間來換取時間的一種方法.
dict可以用在需要高速查找的很多地方,在Python代碼中幾乎無處不在,正確使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象.
這是因為dict根據key來計算value的存儲位置,如果每次計算相同的key得出的結果不同,那dict內部就完全混亂了。這個通過key計算位置的算法稱為哈希算法(Hash)
要保證hash的正確性,作為key的對象就不能變。在Python中,字符串、整數等都是不可變的,因此,可以放心地作為key。而list是可變的,就不能作為key.
set和dict類似,也是一組key的集合,但不存儲value。由于key不能重復,所以,在set中,沒有重復的key.
要創建一個set,需要提供一個list作為輸入集合:
注意,傳入的參數[1, 2, 3]是一個list,而顯示的{1, 2, 3}只是告訴你這個set內部有1,2,3這3個元素,顯示的順序也不表示set是有序的。。
b = a.replace('a', 'A')
要始終牢記的是,a是變量,而'abc'才是字符串對象!有些時候,我們經常說,對象a的內容是'abc',但其實是指,a本身是一個變量,它指向的對象的內容才是'abc':
當我們調用a.replace('a', 'A')時,實際上調用方法replace是作用在字符串對象'abc'上的,而這個方法雖然名字叫replace,但卻沒有改變字符串'abc'的內容。相反,replace方法創建了一個新字符串'Abc'并返回,如果我們用變量b指向該新字符串,就容易理解了,變量a仍指向原有的字符串'abc',但變量b卻指向新字符串'Abc'了:
函數
可以返回多個值(其實就是一個 tuple)
默認參數的坑
先定義一個函數,傳入一個list,添加一個END再返回:
當你正常調用時,結果似乎不錯
當你使用默認參數調用時,一開始結果也是對的
但是,再次調用add_end()時,結果就不對了
很多初學者很疑惑,默認參數是[],但是函數似乎每次都“記住了”上次添加了'END'后的list
原因解釋如下:
Python函數在定義的時候,默認參數L的值就被計算出來了,即[],因為默認參數L也是一個變量,它指向對象[],每次調用該函數,如果改變了L的內容,則下次調用時,默認參數的內容就變了,
不再是函數定義時的[]了.
所以,定義默認參數要牢記一點:默認參數必須指向不變對象
要修改上面的例子,我們可以用None這個不變對象來實現
為什么要設計str、None這樣的不變對象呢?因為不變對象一旦創建,對象內部的數據就不能修改,這樣就減少了由于修改數據導致的錯誤。此外,由于對象不變,多任務環境下同時讀取對象
不需要加鎖,同時讀一點問題都沒有。我們在編寫程序時,如果可以設計一個不變對象,那就盡量設計成不變對象。
可變參數
在函數內部,參數numbers接收到的是一個tuple, 因此,函數代碼完全不變, 但是,調用該函數時,可以傳入任意個參數,包括0個參數:
如果已經有一個list或者tuple,要調用一個可變參數怎么辦?可以這樣做
這種寫法當然是可行的,問題是太繁瑣,所以Python允許你在list或tuple前面加一個*號,把list或tuple的元素變成可變參數傳進去
*nums表示把nums這個list的所有元素作為可變參數傳進去。這種寫法相當有用,而且很常見
關鍵字參數: **kw, 把參數轉變成一個 dict.
參數組合
在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數.
最神奇的是通過一個tuple和dict,你也可以調用上述函數:
看來參數傳遞, 還真有點問題.
要注意定義可變參數和關鍵字參數的語法:
*args是可變參數,args接收的是一個tuple;
**kw是關鍵字參數,kw接收的是一個dict。
模塊
模塊的好處:
最大的好處是大大提高了代碼的可維護性。其次,編寫代碼不必從零開始。當一個模塊編寫完畢,就可以被其他地方引用。我們在編寫程序的時候,也經常引用其他模塊,包括Python內置的模塊和來自第三方的模塊.
你也許還想到,如果不同的人編寫的模塊名相同怎么辦?為了避免模塊名沖突,Python又引入了按目錄來組織模塊的方法,稱為包(Package)
舉個例子,一個abc.py的文件就是一個名字叫abc的模塊,一個xyz.py的文件就是一個名字叫xyz的模塊
現在,假設我們的abc和xyz這兩個模塊名字與其他模塊沖突了,于是我們可以通過包來組織模塊,避免沖突。方法是選擇一個頂層包名,比如mycompany,按照如下目錄存放
引入了包以后,只要頂層的包名不與別人沖突,那所有模塊都不會與別人沖突。現在,abc.py模塊的名字就變成了mycompany.abc,類似的,xyz.py的模塊名變成了mycompany.xyz.
請注意,每一個包目錄下面都會有一個__init__.py的文件,這個文件是必須存在的,否則,Python就把這個目錄當成普通目錄,而不是一個包。__init__.py可以是空文件,也可以有Python代碼,
因為__init__.py本身就是一個模塊,而它的模塊名就是mycompany
第1行和第2行是標準注釋,第1行注釋可以讓這個hello.py文件直接在Unix/Linux/Mac上運行,第2行注釋表示.py文件本身使用標準UTF-8編碼;
第4行是一個字符串,表示模塊的文檔注釋,任何模塊代碼的第一個字符串都被視為模塊的文檔注釋;
第6行使用__author__變量把作者寫進去,這樣當你公開源代碼后別人就可以瞻仰你的大名;
以上就是Python模塊的標準文件模板,當然也可以全部刪掉不寫,但是,按標準辦事肯定沒錯
導入sys模塊后,我們就有了變量sys指向該模塊,利用sys這個變量,就可以訪問sys模塊的所有功能
sys模塊有一個argv變量,用list存儲了命令行的所有參數。argv至少有一個元素,因為第一個參數永遠是該.py文件的名稱,例如:
運行python3 hello.py獲得的sys.argv就是['hello.py']
運行python3 hello.py Michael獲得的sys.argv就是['hello.py', 'Michael]。
最后,注意到這兩行代碼
當我們在命令行運行hello模塊文件(本身)時,Python解釋器把一個特殊變量__name__置為__main__,而如果在其他地方導入該hello模塊時,if判斷將失敗,因此,這種if測試可以讓一個模塊
通過命令行運行時執行一些額外的代碼,最常見的就是運行測試。
作用域
在一個模塊中,我們可能會定義很多函數和變量,但有的函數和變量我們希望給別人使用,有的函數和變量我們希望僅僅在模塊內部使用。在Python中,是通過_前綴來實現的
正常的函數和變量名是公開的(public),可以被直接引用,比如:abc,x123,PI等
類似__xxx__這樣的變量是特殊變量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊變量,hello模塊定義的文檔注釋也可以用特殊變量__doc__訪問,我們自己的變量一般不要用這種變量名;
類似_xxx和__xxx這樣的函數或變量就是非公開的(private),不應該被直接引用,比如_abc,__abc等
之所以我們說,private函數和變量“不應該”被直接引用,而不是“不能”被直接引用,是因為Python并沒有一種方法可以完全限制訪問private函數或變量,但是,從編程習慣上不應該引用private函數或變量.
安裝第三方庫
windows 確保安裝python時勾選了pip和Add python.exe to Path.
在命令提示符窗口下嘗試運行pip,如果Windows提示未找到命令,可以重新運行安裝程序添加pip。
注意:Mac或Linux上有可能并存Python 3.x和Python 2.x,因此對應的pip命令是pip3
現在,讓我們來安裝一個第三方庫——Python Imaging Library,這是Python下非常強大的處理圖像的工具庫。不過,PIL目前只支持到Python 2.7,并且有年頭沒有更新了,因此,基于PIL的
Pillow項目開發非常活躍,并且支持最新的Python 3
一般來說,第三方庫都會在Python官方的pypi.python.org網站注冊,要安裝一個第三方庫,必須先知道該庫的名稱,可以在官網或者pypi上搜索,比如Pillow的名稱叫Pillow,因此,安裝Pillow的命令就是:
pip install Pillow, 耐心等待下載并安裝后,就可以使用Pillow了
模塊搜索路徑
當我們試圖加載一個模塊時,Python會在指定的路徑下搜索對應的.py文件,如果找不到,就會報錯
默認情況下,Python解釋器會搜索當前目錄、所有已安裝的內置模塊和第三方模塊,搜索路徑存放在sys模塊的path變量中:
如果我們要添加自己的搜索目錄,有兩種方法:
一是直接修改sys.path,添加要搜索的目錄:
這種方法是在運行時修改,運行結束后失效.
第二種方法是設置環境變量PYTHONPATH,該環境變量的內容會被自動添加到模塊搜索路徑中。設置方式與設置Path環境變量類似。注意只需要添加你自己的搜索路徑,Python自己本身的搜索路徑不受影響。
總結
以上是生活随笔為你收集整理的python干货_python 基础干货 02的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LOL季中赛MSI五大特色全方位解秘 季
- 下一篇: 《星际争霸2》合作任务斯旺最强流派详解