天天看點

python基礎

資料類型變量

整數

浮點數

字元串

布爾值

空值

變量

常量

字元串和編碼

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 &gt;</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,如需轉載請自行聯系原作者