資料類型變量
整數
浮點數
字元串
布爾值
空值
變量
常量
字元串和編碼
list和tuple
list是一個可變的有序表,可以向list中追加元素。
删除list中的元素用pop()方法
tuple是不可變的,和list類似。
tuple的不可變性,在編碼中盡量使用tuple代替list
python規定,隻有一個元素的tuple定義時必須加一個逗号,
t = (1,)
tuple的不可變隻是它的指向不變。例如tuple内嵌list的時候,内嵌list中的元素可變。
判斷和循環
if ... elif ... else
for ... in ...
while ...
dict和set
dict的查找速度極快,相當于使用的index查找。
dict中判斷一個key是否存在可使用兩種方法:
'key' in dict
dict.get('key')或者是指定一個自定義值dict.get('key', false)
删除一個key,使用pop(key)
dict是無序存放的。
dict和list比較的優缺點:查找和插入速度很快,不會随着key的增加而變慢;占用大量記憶體,記憶體浪費多。list的查找會随着元素的增多而變慢;占用記憶體小浪費少。
dict是用空間來換時間。
dict的key必須是不可變對象。
dict根據key來計算value的存儲位置,通過key計算位置的算法稱為雜湊演算法,保證hash的正确性,key的對象就不能變。python中,字元串,整數都是不可變,可作為key,list是可變的,不能作為key。
set
set是一組key的集合,不存儲value。key不能重複。
建立一個set需要提供一個list作為輸入集合
s = set([1,2,3])
重複元素在set中自動被過濾。add(key)添加元素到set,remove(key)删除元素。
set和dict的差別是沒有存儲對應的value,set的原理和dict一樣。同樣不可以放入可變對象,
函數
abs()
max()
int()
float()
str()
bool()
函數名就是指向一個函數對象的引用,可以把函數名賦給一個變量:
a = abs
a(-1)
1
定義函數
使用def,依次寫出函數名、括号、括号中的參數和冒号 -- 需要确定函數名和參數個數
可以對參數的類型進行檢查, 用return傳回函數結果。沒有傳回值的時候自動 傳回None,return None
空函數 -- 定義一個函數,使用pass作為該函數的函數體。
參數檢查 -- 代碼:
<code>def</code> <code>my_abs(x):</code>
<code> </code><code>if</code> <code>not</code> <code>isinstance</code><code>(x, (</code><code>int</code><code>, </code><code>float</code><code>)):</code>
<code> </code><code>raise</code> <code>TypeError(</code><code>'bad operand type'</code><code>)</code>
<code> </code><code>if</code> <code>x ></code><code>=</code> <code>0</code><code>:</code>
<code> </code><code>return</code> <code>x</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>return</code> <code>-</code><code>x</code>
函數傳回多個值,其實在傳回多個值的時候傳回的是一個tuple,在文法上,傳回一個tuple可以省略括号,而多個變量可以同時接收一個tuple,按位置賦給對應的值,是以python的函數傳回多值就是傳回一個tuple,寫起來更友善。
函數的參數
python除了正常定義的參數外,還可以使用預設參數,可變參數,關鍵字參數。
位置參數:func(p1,p2) -- p1,p2為位置參數
預設參數:func(p1,p2=value) -- p2=value為預設參數 定義預設參數時,預設參數必須指向不變對象。
可變參數:函數的參數是可變的,可以是0個,1個或多個。
定義可變參數和定義一個list或tuple相比,隻是在參數前面加了一個*号。在函數内部,參數接收到的是一個tuple,是以函數代碼完全不變。在調用的時候可以傳入任意個參數。
<code># 定義一個使用list或tuple作為參數的函數</code>
<code>def</code> <code>calc(numbers):</code>
<code> </code><code>sum</code> <code>=</code> <code>0</code>
<code> </code><code>for</code> <code>n </code><code>in</code> <code>numbers:</code>
<code> </code><code>sum</code> <code>=</code> <code>sum</code><code>+</code><code>n</code><code>*</code><code>n</code>
<code> </code><code>return</code> <code>sum</code>
<code># 調用的時候需要先弄一個list或tuple</code>
<code>calc([</code><code>1</code><code>, </code><code>2</code><code>, </code><code>3</code><code>])</code>
<code>14</code>
<code>cale((</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>))</code>
<code># 利用可變參數定義一個函數</code>
<code>def</code> <code>calc(</code><code>*</code><code>numbers):</code>
<code> </code>
<code># 調用可以是這樣的</code>
<code>calc(</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>)</code>
<code>calc(</code><code>1</code><code>,</code><code>3</code><code>,</code><code>5</code><code>,</code><code>7</code><code>) </code>
<code>84</code>
當一個list或者tuple調用一個可變參數的時候,可以把list或tuple的元素變為可變參數傳進去。
<code>nums</code><code>=</code><code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>]</code>
<code>calc(</code><code>*</code><code>nums)</code>
*nums表示把nums這個list的所有元素作為可變參數傳進去。
關鍵字參數:允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數内部自動組裝為一個dict。
<code>def</code> <code>person(name, age, </code><code>*</code><code>*</code><code>kw):</code>
<code> </code><code>print</code><code>(</code><code>'name:'</code><code>, name, </code><code>'age:'</code><code>, age, </code><code>'other:'</code><code>, kw)</code>
在調用person函數的時候,name和age必須傳之外,接收關鍵字參數kw(可以傳入任意個數的關鍵字參數)
<code>person(</code><code>'bob'</code><code>, </code><code>35</code><code>, city</code><code>=</code><code>'NewYork'</code><code>)</code>
<code>name:bob age:</code><code>35</code><code>, other:{</code><code>'city'</code><code>: </code><code>'NewYork'</code><code>}</code>
<code>person(</code><code>'lily'</code><code>, </code><code>24</code><code>, gender</code><code>=</code><code>'M'</code><code>, job</code><code>=</code><code>'engineer'</code><code>)</code>
<code>name:lily age:</code><code>24</code><code>, other: {</code><code>'gender'</code><code>: </code><code>'m'</code><code>, </code><code>'job'</code><code>: </code><code>'engineer'</code><code>}</code>
關鍵字參數的作用:擴充函數的功能。
把一個dict作為關鍵字參數傳遞給函數。
<code>extra </code><code>=</code> <code>{</code><code>'city'</code><code>:</code><code>'beijing'</code><code>, </code><code>'job'</code><code>: </code><code>'engineer'</code><code>}</code>
<code>person(</code><code>'jack'</code><code>, </code><code>24</code><code>, </code><code>*</code><code>*</code><code>extra)</code>
<code>name: jack age: </code><code>24</code> <code>other: {</code><code>'city'</code><code>:</code><code>'beijing'</code><code>, </code><code>'job'</code><code>: </code><code>'engineer'</code><code>}</code>
dict作為關鍵字參數傳遞給函數,使用的是值傳遞,對原dict不影響。
限制關鍵字參數的名字,使用命名關鍵字參數。
<code># 隻接收city和job作為關鍵字參數</code>
<code>def</code> <code>person(name, age, </code><code>*</code><code>, city, job)</code>
<code> </code><code>print</code><code>(name, age, city, job)</code>
命名關鍵字參數需要一個特殊分隔符*,*後面的參數視為命名關鍵字參數。*不是參數,缺少*則無法識别位置參數和命名關鍵字參數。
<code># 調用命名關鍵字參數</code>
<code>person(</code><code>'lucy'</code><code>, </code><code>22</code><code>, city</code><code>=</code><code>'tokyo'</code><code>, job</code><code>=</code><code>'engineer'</code><code>)</code>
<code>lucy </code><code>22</code> <code>tokyo engineer</code>
命名關鍵字參數必須傳入參數名,沒有将報錯。
命名關鍵字參數可以有預設值。調用帶預設值的命名關鍵字參數可不傳入該預設值參數。
參數組合
python定義函數,可用必選參數,預設參數,可變參數,關鍵字參數,命名關鍵字參數,除了可變參數不能和命名關鍵字參數使用外,其他可組合使用。
參數定義的順序是:必須參數、預設參數、可變參數/命名關鍵字參數和關鍵字參數。
<code>def</code> <code>func(a, b, c</code><code>=</code><code>0</code><code>, </code><code>*</code><code>args, </code><code>*</code><code>*</code><code>kw):</code>
<code> </code><code>pass</code>
<code>def</code> <code>function(a, b, c</code><code>=</code><code>0</code><code>, </code><code>*</code><code>, d, </code><code>*</code><code>*</code><code>kw):</code>
對于任意函數,都可以使用該函數的形式調用,無論它的參數是如何定義的。
<code>func(</code><code>*</code><code>args, </code><code>*</code><code>*</code><code>kw)</code>
謹記
預設參數一定要用不可變對象
函數的遞歸
遞歸的有點是邏輯簡單清晰。
遞歸的時候注意防止棧溢出。函數調用是通過棧實作的,每當進入一個函數調用,棧就會加一層棧幀。函數傳回棧就減一層
<code>def</code> <code>fact(n):</code>
<code> </code><code>if</code> <code>n</code><code>=</code><code>=</code><code>1</code><code>:</code>
<code> </code><code>return</code> <code>1</code>
<code> </code><code>return</code> <code>n</code><code>*</code><code>fact(n</code><code>-</code><code>1</code><code>)</code>
尾遞歸優化 -- 解決遞歸調用的棧溢出。尾遞歸 -- 在函數傳回的時候,調用自身并且return語句不能包含表達式,編譯器或者解釋器就可以把尾遞歸做優化,使遞歸本身無論調用多少次都隻占用一個棧幀,不會出現棧溢出。
上面的代碼改成尾遞歸:
<code> </code><code>return</code> <code>fact_iter(n, </code><code>1</code><code>)</code>
<code>def</code> <code>fact_iter(num, product):</code>
<code> </code><code>if</code> <code>num </code><code>=</code><code>=</code> <code>1</code><code>:</code>
<code> </code><code>return</code> <code>product</code>
<code> </code><code>return</code> <code>fact_iter(num</code><code>-</code><code>1</code><code>, num</code><code>*</code><code>product)</code>
return fact_iter(num-1, num*product)僅傳回遞歸函數本身,num-1和num*product在函數調用前就會被計算,不影響函數調用。
由于python解釋器沒有做尾遞歸優化,改成尾遞歸也會棧溢出。
本文轉自ting2junshui51CTO部落格,原文連結: http://blog.51cto.com/ting2junshui/1753956,如需轉載請自行聯系原作者