標籤:重複 接受 ram == abs 偏函數 原理 空值 usr
首先,python有兩個版本,一個是Python2.X,一個是Python3.X,目前Python3.X越來越普及,這兩個版本是不相容的,但由於我所用的大部分學習資料是用Python2.X的文法規則寫的,因而我整理的文法規則是基於Python2.X。我整理的部分基本上是我容易遺忘的地方。
資料類型:整數(%d),浮點數(%f),字串(str)(%s),布爾值,空值,變數,常量 // -->地板除,除之後還是整數。Python的浮點數也沒有大小限制,但是超出一定範圍就直接表示為inf(無限大)。
字串與編碼,對於單個字元的編碼,Python提供了ord()函數擷取字元的整數表示,chr()函數把編碼轉換為對應的字元
#!/usr/bin/env python3# -*- coding: utf-8 -*-
第二行注釋是為了告訴Python解譯器,按照UTF-8編碼讀取原始碼,否則,你在原始碼中寫的中文輸出可能會有亂碼。
有些時候,字串裡面的%是一個一般字元怎麼辦?這個時候就需要轉義,用%%來表示一個%。
當str和bytes互相轉換時,需要指定編碼。最常用的編碼是UTF-8。Python當然也支援其他編碼方式,比如把Unicode編碼成GB2312。
Python內建的一種資料類型是列表:list。list是一種有序的集合,可以隨時添加和刪除其中的元素。list是一個可變的有序表
另一種有序列表叫元組:tuple。tuple和list非常類似,但是tuple一旦初始化就不能修改。
Python內建了字典:dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)儲存,具有極快的尋找速度。
set和dict類似,也是一組key的集合,但不儲存value。由於key不能重複,所以,在set中,沒有重複的key。
*args是可變參數,args接收的是一個tuple;
**kw是關鍵字參數,kw接收的是一個dict。
以及調用函數時如何傳入可變參數和關鍵字參數的文法:
可變參數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過*args傳入:func(*(1, 2, 3));
關鍵字參數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過**kw傳入:func(**{‘a‘: 1, ‘b‘: 2})。
使用*args和**kw是Python的習慣寫法,當然也可以用其他參數名,但最好使用習慣用法。
命名的關鍵字參數是為了限制調用者可以傳入的參數名,同時可以提供預設值。
定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔字元*,否則定義的將是位置參數。
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞迴函式。
L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素,如果第一個索引是0,還可以省略
前10個數,每兩個取一個:
>>> L[:10:2]
所有數,每5個取一個:>>> L[::5]
甚至什麼都不寫,唯寫[:]就可以原樣複製一個list
使用內建的isinstance函數可以判斷一個變數是不是字串
所以,如果列表元素可以按照某種演算法推算出來,那我們是否可以在迴圈的過程中不斷推算出後續的元素呢?這樣就不必建立完整的list,從而節省大量的空間。在Python中,這種一邊迴圈一邊計算的機制,稱為產生器:generator。
要建立一個generator,有很多種方法。第一種方法很簡單,只要把一個列表產生式的[]改成(),就建立了一個generator
如果要一個一個列印出來,可以通過next()函數獲得generator的下一個傳回值
我們講過,generator儲存的是演算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多的元素時,拋出StopIteration的錯誤。
當然,上面這種不斷調用next(g)實在是太變態了,正確的方法是使用for迴圈,因為generator也是可迭代對象:
fib函數實際上是定義了斐波拉契數列的推算規則,可以從第一個元素開始,推算出後續任意的元素,這種邏輯其實非常類似generator。也就是說,上面的函數和generator僅一步之遙。要把fib函數變成generator,只需要把print(b)改為yield b就可以了
我們已經知道,可以直接作用於for迴圈的資料類型有以下幾種:
一類是集合資料類型,如list、tuple、dict、set、str等;
一類是generator,包括產生器和帶yield的generator function。
這些可以直接作用於for迴圈的對象統稱為可迭代對象:Iterable
把list、dict、str等Iterable變成Iterator可以使用iter()函數
你可能會問,為什麼list、dict、str等資料類型不是Iterator?
這是因為Python的Iterator對象表示的是一個資料流,Iterator對象可以被next()函數調用並不斷返回下一個資料,直到沒有資料時拋出StopIteration錯誤。可以把這個資料流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個資料,所以Iterator的計算是惰性的,只有在需要返回下一個資料時它才會計算。
Iterator甚至可以表示一個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
我們先看map。map()函數接收兩個參數,一個是函數,一個是Iterable,map將傳入的函數依次作用到序列的每個元素,並把結果作為新的Iterator返回
再看reduce的用法。reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
Python內建的filter()函數用於過濾序列。
和map()類似,filter()也接收一個函數和一個序列。和map()不同的是,filter()把傳入的函數依次作用於每個元素,然後根據傳回值是True還是False決定保留還是丟棄該元素。
例如,在一個list中,刪掉偶數,只保留奇數,可以這麼寫:
def is_odd(n): return n % 2 == 1list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))# 結果: [1, 5, 9, 15]
注意到filter()函數返回的是一個Iterator,也就是一個惰性序列,所以要強迫filter()完成計算結果,需要用list()函數獲得所有結果並返回lis
預設情況下,對字串排序,是按照ASCII的大小比較的,由於‘Z‘ < ‘a‘,結果,大寫字母Z會排在小寫字母a的前面
sorted()函數也是一個高階函數,它還可以接收一個key函數來實現自訂的排序,例如按絕對值大小排序
>>> sorted([36, 5, -12, 9, -21], key=abs)[5, 9, -12, -21, 36]
要進行反向排序,不必改動key函數,可以傳入第三個參數reverse=True
高階函數除了可以接受函數作為參數外,還可以把函數作為結果值返回。
當我們在傳入函數時,有些時候,不需要顯式地定義函數,直接傳入匿名函數更方便。
函數對象有一個__name__屬性,可以拿到函數的名字
現在,假設我們要增強now()函數的功能,比如,在函數調用前後自動列印日誌,但又不希望修改now()函數的定義,這種在代碼運行期間動態增加功能的方式,稱之為“裝飾器”(Decorator)。
本質上,decorator就是一個返回函數的高階函數。所以,我們要定義一個能列印日誌的decorator,可以定義如下:
def log(func): def wrapper(*args, **kw): print(‘call %s():‘ % func.__name__) return func(*args, **kw) return wrapper
觀察上面的log,因為它是一個decorator,所以接受一個函數作為參數,並返回一個函數。
Python的functools模組提供了很多有用的功能,其中一個就是偏函數(Partial function)
所以,簡單總結functools.partial的作用就是,把一個函數的某些參數給固定住(也就是設定預設值),返回一個新的函數,調用這個新函數會更簡單。
注意到上面的新的int2函數,僅僅是把base參數重新設定預設值為2,但也可以在函數調用時傳入其他值。當參數過多需要化簡,對某些值進行固定可以使用該原理。
Python本身就內建了很多非常有用的模組,只要安裝完畢,這些模組就可以立刻使用。
在一個模組中,我們可能會定義很多函數和變數,但有的函數和變數我們希望給別人使用,有的函數和變數我們希望僅僅在模組內部使用。在Python中,是通過_首碼來實現的。
類似__xxx__這樣的變數是特殊變數,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊變數,hello模組定義的文檔注釋也可以用特殊變數__doc__訪問,我們自己的變數一般不要用這種變數名。
類似_xxx和__xxx這樣的函數或變數就是非公開的(private),不應該被直接引用,比如_abc,__abc等
我整理的Python代碼規則