python 學習筆記 (核心)
python
Python解釋器從頭至尾一行接一行執行腳本linux
# -*- coding: UTF-8 -*- //字符編碼git
不區分單引號和雙引號,x=’hello’,x[0],x[-1]指最後一個字符,x[2:4]取子串,正則表達式
‘’’hello’’’ #hello三引號會保留文本輸入時的換行符製表符等不須要轉義,用於多行原樣輸入保存shell
‘hello’+’world’ #字符串拼接,’hello’*2 #字符串重複數據庫
help(fun) #幫助,help(module.method)express
print(1,2,sep=’,’) #輸出常量、變量,也能夠經過變量名直接查看變量編程
>> #重定向api
int(9.9) #強制轉換爲int數組
+ - * /傳統除法有小數 //用做浮點除法對結果進行四捨五入 %求餘 **乘方,pow(x,y)#x^y
< <= > >= == != and or not 如:not 2<4,not優先級最高僅次於比較運算符
變量名:字符或下劃線開頭後接數字、字母、下劃線,區分大小寫
Python是動態語言:不須要預先聲明變量的類型,變量的類型和值在賦值那一刻被初始化
y*=10;能夠,可是y++不能夠
int、long(比c語言的長整數大,int會自動擴充到long)、bool、float、complex
列表:x=[1,2,’3’] #能夠用[1:3]取子列表二、3,元素可修改
元組:x=(1,2,’3’) #元組元素不能夠修改,能夠經過下標也能夠訪問子元組
字典:x={1:2,’3’:’4’},x.keys()#返回鍵,x.values()#值
if expression:
commands;
elif expression:
commands;
else:
commands;
if not expr1 and expr2:#not優先級比and高
while expression:#直至表達式爲假
commands;
for i in range(3):#range(start=0,stop,step=1)#[start,stop),start和step要麼都不出現要麼同時出現
print(‘hello world’);
break可用於while和for中
continue
pass #標記的語句忽略
三元表達式:x if C else y #C?x:y
def fun_name([arguments]):#[]表示可選,函數經過引用傳遞即函數內對參數的改變會影響原始對象,沒有return語句則自動返回None對象
commands;
class ClassName(base_class):
static_member_declarations;
__name;#定義私有變量
def __init__(...):#構造函數,在對象建立後執行的第一個方法用於初始化對象
建立對象:object=ClassName()#自動調用__init__(),每一個對象都有一個計數器
import moudle後調用fun必須module.fun()
from module import * 後可直接調用fun()
模塊:module_name.py,導入模塊import module_name,訪問模塊屬性和訪問對象屬性是同樣的object.attribute即module_name.fun(),module_name.variable,如:import sys; sys.stdou.write(‘Hello World\n’)
if __name__==’__main__’:#當在命令行python module_name時腳本會自動執行,而在Python IDE下__name__爲具體的模塊名稱不是__main__,直接執行就是__main__,被導入import就是模塊名字
fun();
dir() #顯示全局變量的名字,dir(x) #列出x的內建方法
cmp(x,y) # 若 x<y 返回 <0, 若 x>y 返回 >0,x==y 返回 0 ,自定義對象則會調用類的 __cmp__() 方法
repr(x) # 返回一個對象的字符串表示,能夠還原對象 ,x==eval(repr(x)) 一般成立
str(x) # 返回對象適合可讀性好的字符串表示
type(x) #返回對象的類型,type(x).__name__返回類型名稱
isinstance(x,(int,long)) #第二個參數是元組,若x類型在元組中則返回true
id(x) # 返回對象的 id 能夠認爲是對象的內存地址,能夠用於判斷兩個對象是否相同 is(a)==id(b)
x is y / x is not y # 測試兩個變量是否執行同一個對象
del x #刪除對象,實際是引用計數減1
\ #代碼分行
y=x=1 #賦值
x,y,z=1,2,’z’ #(x,y.z)=(1,2,’z’), x,y=y,x#交換兩變量值
下劃線的特殊用法:可見儘可能避免使用下劃線做爲變量名的開始
_xxx 不用從from module import *導入
__xxx__ 系統定義的名字
__xxx 類中私有成員
None #Nonetype 對象,不支持任何運算和內建方法,相似於 void ,它的 bool 爲 false
全部標準對象都可用於布爾測試,同類型對象之間能夠比較大小,空對象 ({}) 、值爲零、 None 的 bool 值爲 false
運算符優先級:內置函數如 cmp 比較運算符 對象比較 is/is not 邏輯比較 not/and/or
變量分類:
數字 標量 不可變 直接訪問
字符串 標量 不可變 順序訪問
列表 容器 可變 順序訪問
元組 容器 不可變 順序訪問
字典 容器 可變 映射訪問 key
數字:整型、長×××、布爾型、雙精度浮點型、十進制浮點型、複數 x=complex(1,2);x.conjugate()# 共軛 ;x.real 實部 ;x.imag 虛部
1/2=0 地板除 ;1/2.0=0.5 浮點除法真正的除法
整數位運算: ~ 取反, & 按位與, | 或, ^ 異或, << 左移, >> 右移
數字類型函數: int(),long(),float(),complex(),bool(x) 即 x.__nozero__(),abs(),divmod() 返回商和餘數的元組 ,pow(),round(x,num) 四捨五入 num 是小數位數,這裏注意 int() 是直接截去小數部分, floor() 是返回最接近原數但小於的整數, round() 最接近原數可能大於原數的整數, coerce(x,y)# 將 x 和 y 轉換爲同一類型返回 (x,y) 的元組
oct(x) # 八進制, hex(x)# 十六進制
chr(97)#ASCII 字符, ord('a')#ASCII 碼, unichr(num)# 將 unicode 值轉爲 unicode 字符
序列:下標從 0 開始至 -1
obj [not] in seq # 若對象 obj 在序列 seq 中返回 true
seq[index1:index2] # 取子序列,支持負索引
seq*num # 序列重複 num 次
seq1+seq2 # 鏈接兩個序列
seq[::-1] # 翻轉序列, seq[::2] # 隔一個取一個
enumerate(iter) # 以一個可迭代對象爲參數,返回一個 enumerate 對象 ( 也是一個迭代器 ) ,該對象生成由 iter 每一個元素的 index 值和 iter 值組成的元組
reversed(x) # 返回一個逆序訪問的迭代器
sorted(iter,func=None,key=None,reverse=False) #iter 是可迭代對象,返回一個有序列表, key :用列表元素的某個屬性和函數進行做爲關鍵字,有默認值,迭代集合中的一項 ;reverse :排序規則. reverse = True 或者 reverse = False,有默認值 ;func :用於比較的函數,比較什麼由 key 決定 , 有默認值,迭代集合中的一項 ;
sum(x,init=0) # 以初值 init 求序列和
max(x),min(x)
zip(x) # 返回一個列表,列表元素是元組,元組的第一個元素的 x 的值, zip(x,y)# 構成元組
字符串是不可變的,即 x='hello world'; x[0]='H' 是錯誤的,能夠變量賦值的方式更新字符串, x=x[:2]+x[3:]# 刪除第一個 l
x=raw_input(「Input:」) # 輸入
字符串內置函數:
str(3.14) # 數字轉爲字符 '3.14'
s.capitalize() # 把第一字符大寫
s.center(width) # 將原始字符串置於寬度爲 width 的中間
s.count(str,beg=0,end=len(s)) # 返回 str 在 s 出現的次數
s.encode(encoding='UTF-8',errors='strict') # 指定編碼格式, s.decode 解碼
s.endswith(obj,beg=0,end=len(s)) # 檢查指定範圍內的子串是否以 obj 結束
s.find(str,beg=0,end=len(s)) # 檢測 str 是否包含在 s 中,返回開始的索引值不然返回 -1
s.index(str,beg=0,end=len(s)) # 同上 , 若不在則報一個異常
s.isalnum() #s 至少有一個字符而且全部字符都是字母或數字則返回 true
s.isalpha() # 至少一個字符且全部都是字母返回 true
s.isdecimal() # 只含有十進制數字返回 true
s.isdigit() # 只包含數字返回 true
s.islower() # 都是小寫返回 true
s.isumeric() # 只包含數字字符返回 true
s.isspace() # 只包含空格返回 true
s.istitle() # 標題化的返回 true
s.isupper() # 全是大寫返回 true
s.join(seq) #s='xyz';s.join('abc') 爲 'axyzbxyzc'
s.ljust(width) # 左對齊
s.lower() # 小寫
s.lstrip() # 截掉左邊的空格
s.partition(str) # 當 s 中包含 str 時 s 被切分爲元組 (pre,str,end), 若 str 不在 s 中 pre==s
s.replace(str1,str2,num=s.count(str1)) # 將 s 中的 str1 替換爲 str2 不超過 num 次
s.rfind(str,beg=0,end=len(s)) # 相似於 find 可是從右邊查找
s.rindex(str,beg=0,end=len(s)) # 相似於 index ,從右邊開始
s.rpartition(str)
s.rstrip()
s.split(str=」」,num=s.count(str))# 以 str 默認空格爲分隔切分字符串, num 爲分割次數
s.splitlines(num=s.count('\n')) # 返回一個包含各行做爲元素的列表, num 指定元素個數
s.startswith(obj,beg=0,end=len(s)) # 檢查 s 是否以 obj 開頭
s.strip(obj) # 執行 lstrip 和 rstrip, 去掉左右兩邊的空格
s.swapcase()# 翻轉大小寫
s.title() # 標題化,全部單詞開始都大寫
s.translate(str,del='') # 根據 str 給出的錶轉換 s 的字符,須要過濾的字符放在 del 中
s.upper(0 # 該爲大寫
s.zfill(width) # 右對齊
列表 list :能夠包含任意個不一樣類型對象,如 x=[1,'2',['x',complex(1,1)]]
list(),tuple() # 強轉
x.append('h') # 追加元素
del(x[3]) # 刪除指定下標的元素, del x # 刪除列表
x.remove('2') # 移除具體的元素
obj [not] in x # 檢查一個對象是否在列表中
x+y # 列表鏈接,新建一個列表
x.extend(y) # 將 y 追加到 x 中
x*num # 列表重複 num 次
x.count(obj) # 統計 obj 在列表中出現的次數
x.index(obj,i=0,j=len(x)) # 在指定範圍內查找等於 obj 的下標
x.insert(index,obj) # 指定下標 index 處插入 obj
x.pop(index=-1) # 刪除並返回指定下標位置的對象
x.reverse() # 原地翻轉列表
x.sort(func=None,key=None,revers=False) # 修改對象的方法是沒有返回值的,字符串內置的 sort 有返回值是由於字符串不可修改
元組:不可變,鏈接可用,重複操做可用,元組內可變的元素仍是能夠變的。函數 return x,y,z; 返回的多對象就是以元組形式
淺拷貝:當對象賦值時是簡單的對象引用 ( 增長計數 ) , copy.cpoy()
深拷貝:徹底拷貝, import copy; x=copy.deepcopy(y); 非容器類型沒有拷貝一說,若元組只包含原子類型對象對它的深拷貝不會進行
字典: key 是不變的因此數字和字符串能夠做爲 key 且可 hash 的,可是列表、其它字典不能夠,不支持拼接和重複操做
x=dict((['x',1],['y',2])) 或者 x={'x':1,'y':2}
for key in x.keys(): # 遍歷字典
for key in x: # 遍歷字典
x.has_key('x') # 檢測是否有 'x'
'x' [not] in x # 檢測是否有 'x'
del x['x'] # 刪除 key 爲 'x' 的條目, del x # 刪除整個字典
x.clear() # 清空字典
x.pop('x') # 刪除並返回 'x' 的值
x.copy() # 淺拷貝一個副本
x.fromkeys(seq,value=None) # 建立一個新字典 seq 是 key , val 默認是 None
x.get(key,default=None) # 茶盞 key 的 value ,不存在則返回 default
x.items() # 返回字典中 (key,value) 的列表
x.iter() # 返回一個迭代子
x.pop(key,default) # 若 key 在則刪除, key 不在且沒有 default 則異常
x.setdefault(key,default=None) #x[key]=default
x.update(y) # 將字典 y 添加到 x 中
x.values()# 值列表
集合: set 、 frozenset 不可變集合,支持 [not] in,len(),for 迭代,不支持索引和切片 : 操做,沒有 keys().set 是可變的因此是不可哈希的, frozenset 是不可變的故可哈希因此能夠做爲字典的 key 就或集合的成員
集合建立的惟一方法: x=set('123') # 可迭代做爲參數,字符串可迭代, x=frozenset(range(3))
'1' in x # 檢測元素,屬於, not in 不屬於
x.add('4') # 添加
x.update('345') # 添加
x.remove('1') # 刪除元素
x.discard('3') # 刪除元素
del x
x==y x!=y
x<y x<=y x 是否爲 y 的真子集 / 子集
x>y x>=y x 是否爲 y 的嚴格超集 / 超集
x|y # 並集, x.union(y)
x&y # 交集, x.intersection(y)
x-y # 差集,屬於 x 不屬於 y 的集合, x.difference(y)
x^y # 對稱差分,不可能同時屬於 x 或 y 的元素, x.symmetric_difference()
x|=y # 複合賦值
x.issubset(y) # 若 x 是 t 的子集返回 true
x.issuperset(y) # 若 y 是 x 的超集返回 true
x.copy() # 淺拷貝
i=iter(x) # 獲得迭代器, i.next()# 訪問迭代器
列表解析: [expr for iter in iterable] #for 迭代 iterable 對象的全部條目而後 expr 應用於序列的每一個成員,最後的結果值是該表達式產生的列表
x=[y**2 for y in range(10) if not y%2] #[0, 4, 16, 36, 64] ,過濾掉知足 if 的序列成員
[(x,y) for x in range(3) for y in range(5)] # 迭代一個三行五列的矩陣
a=(x>0 for x in range(-2,3,1)); for it in a: print it; #False False False True True
lst=[0 for t in range(10)] # 生成固定長度序列,所有初始化爲 0
x='hello python world'; x.split(); #['hello', 'python', 'world']
生成器表達式: (expr for iter in iterable if cond_expr) # 沒產生一個符合條件的條目就用 expr 判斷
x=open(file_name,mode=’rwa’) #+ 表示讀寫, b 二進制訪問, r 文件必須存在, w 文件若存在先清空, a 追加,默認 r
for line in x: print line, # 也能夠 x.readlines() 可是這樣會讀取文本的所有內容,而前一種是靠文件迭代器 , 這裏 print Iine, 防止 print 產生換行符
data=[line.strip() for line in x.readlines()] #strip 去除換行符
x.close() # 關閉文件
x.fileno() # 返回文件的描述符
x.flush() # 刷新文件的內部緩衝區
x.isatty() # 判斷 x 是不是一個類 tty 設備
x.next() # 返回文件下一行
x.read(size=-1) # 從文件讀取 size 個字節,當 size 爲負時讀取剩餘全部字節
x.readline(size=-1) # 從文件中讀取並返回一行,或者返回最大 size 個字符
x.readlines(sizhint=0) # 讀取文件的全部行並返回一個列表,若 sizhint>0 返回綜合大約爲 sizhint 字節的行
x.seek(off,whence=0) # 移動文件從 whence=0 文件開始 1 當前位置 2 文件末尾偏移 off 個字節
x.tell() # 返回當前文件的位置
x.truncate(size=x.tell()) # 截取文件到最大 size 字節,默認截取到當前位置
x.write(str) # 向文件寫入字符串,如有必要 str 須要本身添加換行符
x.writelines(seq) # 向文件寫入字符串序列 seq ,必要時在 seq 中每行添加換行符
x.closed # 若文件關閉返回 True
x.mode # 訪問模式
x.name # 文件名
x.softspace #0 表示輸出以數據後要加上一個空格符, 1 表示不加
import sys # 有 sys.stdin,sys.stdout,sys.stderr
sys.argv # 是命令行參數列表即 argv[][] ,len(sys.argv) 是參數個數, sys.argv[0] 是程序名
import os;
os.linesep # 用於在文件中分隔行的字符串, linux 是 \n
os.sep # 用於分隔文件路徑的字符串
os.pathsep # 用於分隔文件路徑的字符串
os.curdir # 當前工做目錄的字符串名稱
os.pardir # 父目錄的名稱
os.mkfifio() # 建立命名管道
os.remove() # 刪除文件
os.rename() # 重命名文件
os.symlink() # 建立符號鏈接
os.utime() # 更新時間戳
os.tempfile() # 建立並打開一個臨時文件
os.chdir() # 更改工做目錄
os.chroot() # 改變當前進程的根目錄
os.listdir() # 列出指定目錄的文件
os.getcwd() # 返回當前工做目錄
os.mkdir() # 建立目錄
os.rmdir() # 刪除目錄
os.access(0 # 檢驗權限模式
os.chmod() # 改變權限模式
os.chown() # 改變全部者
os.umask() # 設置默認權限模式
os.path.basename() # 去掉目錄路徑返回文件名
os.path.dirname() # 去掉文件名,返回目錄路徑
os.path.join() # 將分離的各部分組合成一個路徑名
os.path.split() # 返回 (dirname(),basename()) 元組
os.path.splitdrive() #(drivename,pathname)
os.path.splitext() #(filename,extension)
os.path.getatime() # 返回最近訪問時間
os.path.getmtime() # 返回最近文件修改時間
os.path.getsize() # 返回文件大小
os.path.exists() # 指定路徑是否存在
os.path.isabs() # 指定路徑是否爲絕對路徑
os.path.isdir() # 指定路徑是否爲目錄
os.path.isfile() # 指定路徑是否爲一個文件
os.path.islink() # 指定路徑是否爲一個符號連接
os.path.ismount() # 指定路徑是否爲一個掛載點
os.path.samefile() # 兩個路徑名是否指向同一個文件
函數: def fun(): 若沒有顯示的 return 返回元素則返回 None ,若返回多個對象則 python 把它們彙集起來並以一個元組返回,函數支持嵌套,外層函數內定義裏層函數,而且外層函數須要調用裏層函數纔會執行裏層函數
def foo():
'foo()--just an test fun'# 函數文檔
print 'hello first fun';
foo.__doc__ # 輸出函數文檔
裝飾器:函數調用之上的修飾,這些修飾僅當聲明一個函數或者方法的時候纔會額外調用
@g
@f
def foo():
foo()=g(f(foo))
函數和其它對象同樣能夠被引用、作參數、容器元素,比對象多了一個可調用特徵,函數能夠複製
fun=lambda arg1,.... :expression # 返回可調用的函數對象
非關鍵字 ( 不具名 ) 可變長的參數元組必須在位置參數和默認參數以後:
def fun(formal_args,*vargs_tuple): #* 號以後的形參做爲元組傳遞給函數元組保存了全部傳遞給函數的額外參數
for ExtrArg in vargs_tuple:
print(「the extra args:」,ExtrArg);
fun(1,2,3)# fun(1,2,3,4)
關鍵字變長參數:保存在參數名做爲 key ,參數值做爲 value 的字典中
def fun(formal_args,*vargs_tuple,**vargsd): #
for ExtraArg in vargs_tuple:
print(「the extra args:」,ExtraArg);
for each in vargsd.keys():
print(each,vargsd[each]);
fun(1,2,3,a=1,b=2) #1 是位置參數, 2 、 3 是不具名非關鍵字變長參數, a 、 b 是關鍵字參數
fun(1,*(2,3),**{'a':1,'b':2}) # 結果同上
A=(2,3);B={'a':1,'b':2};fun(1,*A,**B) # 結果同上
apply(func,nkw,kw) # 用可選的參數調用 func , nkw 是非關鍵字 ( 不具名 ) 參數, kw 是關鍵字參數,返回值的函數 func 的返回值
filter(func,seq) # 調用一個布爾函數來迭代遍歷 seq 中的每一個元素,返回一個使 func 爲 true 的序列
filter(lambda x:x>0,range(-3,3,1)) # [1,2]
map(func,seq1,seq2...) # 將函數 func 做用 ( 映射 ) 於給定序列的每一個元素 , 並用一個列表返回,多個序列時 map 會並行的迭代每一個序列
reduce(func,seq,init) # 將二元函數 func 做用於 seq ,首先取出 seq 的頭兩個元素做爲 func 的參數而後返回一個值 temp ,而後 temp 和 seq 的第三個元素做爲 func 的參數 ... 直至序列尾返回一個單一的值,如有 init 則開始用 init 和 seq 第一個元素做爲 func 的參數
reduce(func,[1,2,3]) <==> func(func(1,2),3)
全局變量除非被刪除,不然在整個腳本都存在且對全部函數均可訪問
global var # 在函數體內局部變量會覆蓋同名的全局變量,可是使用 global 聲明後會使用全局變量,函數體內對它的任何修改都會影響到全局變量
閉包的例子:
def fun(x):
def g():
return x+1;
return g;
a=fun(1);
a(); #2
yield :生成器能暫停執行並返回一箇中間結果並暫停執行,當生成器的 next() 方法被調用的時候會從暫停的地方繼續執行,當沒有更多的 next() 調用時拋出 StopIteration 異常。 for 循環有 next() 調用和 StopIteration 處理,因此 for 會自動遍歷生成器。如: yield (1,2) # 返回一個元組
生成器除了經過 next() 得到下一個值 ( 調用者使用 next) ,調用者還能夠向生成器發送 send() ,生成器能夠拋出異常,要求生成器 close()
def counter(start=0):
count=start;
while True:
val=(yield count)
if val is not None:
count=val;
else:
count+=1;
count=counter(5);
count.next() #5
count.next() #6
count.send(9) #9
count.next() #10
coun.close()
sys.path.append('../..') # 添加搜索路徑
__builtins__ 包含內建名稱空間中內建名字的集合
__builtin__ 包含內建函數、異常以及其它屬性, __builtins__ 包含 __bulitin__ 的全部名字
import module1,module2.... # 導入模塊
from module import name1,name2... # 導入模塊指定的屬性, from numpy import *
import Tkinter as tk
module.__name__ # 模塊名稱
globals()/locals() # 返回全局 / 局部名稱空間的字典
reload(module) # 從新導入模塊
類必須有一個父類,默認是 object
class X(base):
'class doc--'
def __init__(self,arg):# 構造器 ( 每一個類都有一個默認版本 ), 返回 None
self.no='mankind';# 實例屬性
def __new__() # 構造器,必須返回一個合法的實例
def __del__() # 解構器
sex='male'; # 靜態成員,類屬性
類體
a,b=X(),X();
a.sex == b.sex ==X.sex =='male'
a.sex='female' # 此時實例屬性覆蓋掉類屬性, b.sex=='male', X.sex=='male'
X.sex='animal' # a.sex=='female', b.sex=='animal' # 類屬性的修改會影響到全部的實例
del a.sex
a.sex =='male' # 刪除實例屬性後類屬性又出現了
靜態方法屬於類,類方法也屬於類:
class test:
@staticmethod # 函數修飾符
def fun():
print(static method);
@classmethod
def foo():
print('class method');
類的特殊方法:
dir(X) / X.__dict__ # 查看類的屬性 ( 數據成員和方法 )
X.__name__ 類名
X.__doc__ 類的說明文檔
X.__bases__ 基類
X.__module__ 類所屬模塊
X.__class__ 對象所屬的類
X__unicode__(self) #unicode 字符串輸出,內建 unicode()
X.__call__(self,*args) # 可調用的實例
X.__nonzero__(self) # 爲對象定義 bool 值,內建 bool()
X.__len__(self) # 類的長度,內建 len()
X.__cmp__(self,obj) # 對象比較,內建 cmp()
X.__lt__(self,obj) and #<=
X.__gt__(self,obj) and #>=
X.__eq__(self,obj) and #==
X.__getattr__(self,attr) # 獲取屬性,內建 getattr()
X.__setattr__(self,attr,val) # 設置屬性
X.__delattr__(self,attr) # 刪除屬性
X.__getattribute__(self,attr) # 獲取屬性,內建 getattr()
X.__get__(self,attr) # 獲取屬性
X.__set(self,attr,val) # 設置屬性
X.__delete__(self,attr) # 刪除屬性
X.__*add__(self,obj) #+,* 表明 : __and__ 顯示 self+obj,__radd__,__iadd__ 至關於 +=
X.__*sub__(self,obj) #-
X.__*mul__(self,obj) #*
X.__*div__(self,obj) #/
X.__*truediv__(self,obj) #/
X.__*floordiv__(self,obj) #//
X.__*mod__(self,obj) #%
X.__*divmod__(self,obj) # 除和取模
X.__*pow__(self,obj,mod) # 內建 pow(),**
X.__*lshift__(self,obj) #<<
X.__*rshift__(self,obj) #>>
X.__*add__(self,obj) #&
X.__*or__(self,obj) #&
X.__*or__(self,obj) #|
X.__*xor__(self,obj) #^
X.__neg__(self) # 一元負
X.__pos__(self) # 一元正
X.__abds__(self) # 內建 abs()
X.__invert__(self) #~ 求反
X.__complex__(self,com) # 內建 complex ,轉爲複數
X.__int__(self) # 內建 int(), 轉爲 int
X.__long__(self) # 內建 long() ,強轉爲 long
X.__float__(self) # 內建 float(), 轉爲 float
X.__oct__(self) # 內建 oct(), 八進制表示
X.__hex__(self) # 內建 hex(), 十六進制表示
X.__coerce__(self,num) # 內建 coerce(), 壓縮成一樣的數值類型
X.__index__(self) # 壓縮可選的數值類型爲整型
X.__len__(self) # 項目數
X.__getitem__(self,ind) # 獲取單個序列的元素
X.__setitem__(self,ind,val) # 設置單個序列的元素
X.__delitem__(self,ind) # 刪除單個序列元素的表示
X.__getslice__(self,ind1,ind2) # 獲取切片
X.__setslice__(self,i1,i2,val) # 設置序列切片
X.__delslice__(self,ind1,ind2) # 刪除切片
X.__contains__(self,val) # 測試序列成員,內建 in 關鍵字
X.__*add__(self,obj) # 鏈接
X.__*mul__(self,obj) # 鏈接
X.__iter__(self) # 內建 iter() ,建立迭代類
X.__hash__(self) # 散列
issubclass(sub,sup) # 判斷 sub 是不是 sup 的子類, sup 能夠是一個元組只要知足元組中任一個即返回 true ,固然 sup 能夠是 sub
isinstance(obj1,obj) # 判斷 obj1 是不是類 obj 的一個實例
hasattr(obj,'foo') # 判斷實例 obj 是否有屬性 'foo'
getattr(obj,'foo',default) # 獲取 obj.foo 屬性,若屬性不存在則引起 AttributeError 異常 , 若指定 defult 則沒有屬性時返回 default 不會拋出異常
setattr(obj,'foo',val) # 給 obj 賦值 foo 屬性值爲 val , obj.foo=val
delattr(obj,'foo') # 刪除屬性
assert isinstance(val,float) # 斷言 val 是 float 型
在類中實現 __str__() 或者 __repr__() 之一就能夠用 'print 對象 ' 語句打印想要的輸出:
class test:
def __str__(self): #self 必須, return 必須
return 'there is str;
def __repr__(self):
return 'there is repr';
a=class();
print a; #'there is str'
a; #'there is repr'
重載加法 : __add__()
重載 __i*__() 方法必須返回 self
callable(obj) # 若 obj 可調用返回 true
compile(string,file,type) # 從 type 類型中建立代碼對象存放咋 file 中
eval(obj) # 對 obj 進行求值 eval('1+2') #3
正則表達式:
re1 | re2 匹配 re1 或 re2 , or 關係
. 匹配任何字符,換行符除外
re.match('.end','bend').group() #'bend'
^ 字符串的開始
$ 字符串的結尾, .*\$$ 匹配以美圓符號結尾的字符串
* 匹配零次或屢次
+ 匹配一次或屢次
? 零次或一次
{n} 匹配 n 次
{m,n} 匹配 m 到 n 次
[…] 匹配集合中的任意一個字符
[x-y0-9] 匹配序列 x 至 y 或 0-9
[^...] 不匹配集合中的任意一字符
() 分組
\d 匹配任何數字
\w 匹配任何數字、字母
\s 匹配任何空白字符
re.split('\s\s+','hello the python world') # 超過兩個空格的劃分
\b 匹配單詞邊界, \bthe\b 僅匹配 the , \Bthe 包含 the 但不以 the 開頭的單詞
re.search(r'\bthe','bit the dog').group() #'the',r 表示後面是普通字符串,即 \ 不是轉義的含義
\nn 匹配已保存的子組 () 產生子組 ,\16
\c 匹配特殊字符, \. \\ \*
\A \Z 字符串的開始或結束
import re;
match(pattern,string,flags=0) # 嘗試用 pattern 匹配字符串 string , flags 是可選標誌符,成功返回一個匹配對象不然返回 None
search(pattern,string,flags=0) # 查找 string 模式 pattern 第一次出現,成功返回匹配對象不然返回 None
re.match('foo','seafood').group() #None
re.match('foo','seafood').group() #'foo' 說明 seach 會從字符串任意位置作匹配
findall(pattern,string) # 查找全部匹配對象
re.findall('car','scary the car'])#['car','car'] 返回一個列表
finditer(pattern,string) # 同上,可是返回的是迭代器
split(pattern,string,max=0) # 根據正則表達式 pattern 分割字符串最大 max 次默認是全部
sub(pattern,repl,string,max=0) # 將匹配的替換爲 repl , max 沒有給出替換全部
re.sub('s','x','she is nurse') #'xhe ix nurxe'
group() # 返回全部匹配對象或特定子組
re.match('foo','food on table').group() #'foo'
groups() # 返回一個包含惟一或全部子組的元組,若正則表達式沒有子組的話返回一個空元組
import socket # 網絡編程
建立套接字: socket(socket_family,socket_type,protocol=0) #socket_family:AF_UNIX/AF_INET,socket_type:SOCK_STREAM/SOCK_DGRAM,protocal:0
x=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp 套接字, udp 爲 SOCK_DGRAM
x.bind() # 綁定到 IP 和 port
x.listen() # 開始監聽
x.accept() # 阻塞式等待客戶鏈接
x.connect() # 發起鏈接
x.connect_ex() #connect 的擴展版本出錯時返回出錯碼而不是拋出異常
x.recv() # 開始接收 TCP 數據
x.send() # 發送 TCP 數據
x.sendall() # 完整發送 tcp 數據
x.recvfrom() # 接收 UDP 數據
x.sendto() # 發送 udp 數據
x.getperrname() # 獲取到當前套接字的遠端地址
x.getsockname() # 當前套接字的地址
x.getsockopt() # 返回指定套接字的參數
x.setsockopt() # 設置指定套接字的參數
x.close() # 關閉套接字
x.setblocking() # 設置爲阻塞 / 非阻塞
x.settimeout() # 設置阻塞套接字操做的超時時間
x.gettimeout() # 得到阻塞套接字操做的超時時間
x.fileno() # 套機字的文件描述符
x.makefile() # 建立一個與套接字關聯的文件
fromfd() # 用一個已經打開的文件描述符建立一個套接字對象
ssl() # 在套接字初始化一個安全套接字層 ssl 不作證書驗證
getaddrinfo() # 獲得地址信息
getfqdn() # 返回完整的域的名字
gethostname() # 獲得當前主機名
gethostbyname() # 由主機名獲得對應的 ip 地址
gethostbyname_ex() # 同上,返回主機全部的別名和 IP 地址列表
gethostbyaddr() # 由 IP 地址獲得 DNS 信息
getprotobyname() # 由協議獲得對應的號碼
getservbyname() # 由服務器名獲得對應的端口號或相反
getserbyport() # 由端口獲得服務名
ntohl()/ntohs() # 整數網絡轉爲主機字節序
htonl()/htons() # 整數由主機字節序轉爲網路 字節序
inet_aton() /inet_ntoa()#IP 地址轉爲整數或相反
inet_pton()/inet_ntop() # 將 IP 地址轉爲二進制格式或相反
getdefaulttimeout()/setdefaulttimeout() # 得到 / 設置套接字的超時時間
TCP 服務端僞碼:
ss = socket() # 建立服務器套接字
ss.bind() # 把地址綁定到套接字上
ss.listen() # 監聽鏈接
inf_loop: # 服務器無限循環
cs = ss.accept() # 接受客戶的鏈接
comm_loop: # 通信循環
cs.recv()/cs.send() # 對話(接收與發送)
cs.close() # 關閉客戶套接字
ss.close() # 關閉服務器套接字(可選)
TCP 客戶端僞碼:
cs = socket() # 建立客戶套接字
cs.connect() # 嘗試鏈接服務器
comm_loop: # 通信循環
cs.send()/cs.recv() # 對話(發送/接收)
cs.close() # 關閉客戶套接字
UDP 服務端僞碼:
ss = socket() # 建立一個服務器套接字
ss.bind() # 綁定服務器套接字
inf_loop: # 服務器無限循環
cs = ss.recvfrom()/ss.sendto() # 對話(接收與發送)
ss.close() # 關閉服務器套接字
UDP 客戶端僞碼:
cs = socket() # 建立客戶套接字
comm_loop: # 通信循環
cs.sendto()/cs.recvfrom() # 對話(發送/接收)
cs.close() # 關閉客戶套接字
TCP 通訊實例 ( 粗糙的邏輯設計 echo 服務 )
服務端代碼:
from socket import *
server=socket(AF_INET,SOCK_STREAM)
server.bind(('192.168.13.125',8000))# 查看端口 shell 命令 netstat -ntl | grep 8000
server.listen(5)
while True:
client,addr=server.accept();
while True:
data=client.recv(1024);
if not data:
break;
client.send(data)
客戶端代碼:
from socket import *
client=socket(AF_INET,SOCK_STREAM)
client.connect(('192.168.13.125',8000))
while True:
client.send('hello python');
while True:
data=client.recv(1024);
if data:
print data;
break;
Python 解釋器能夠運行多個西啊不是但在任意時刻只有一個線程在解釋器中運行, python 虛擬機的訪問由全局解釋器鎖 GIL 來控制該鎖能保證同一時刻只有一個線程在運行
threading 模塊:
Thread 表示一個線程的執行的對象
Lock 鎖原語對象
Rlock 可重入鎖對象 ( 遞歸鎖 )
Conditon 條件變量,條件改變時只有線程喚醒
Event 多個線程等待條件變量時,當事件發生時全部線程被喚醒
Semaphore 信號量
Timer 定時器
t=threading.Thread(target=loop,args=(...))
t.start() # 線程開始執行
t.run() # 定義線程的功能函數
t.join(timeout=None) # 程序掛起直到線程結束,若指定了 timeout 最多阻塞 timeout 秒
t.getName() # 返回線程的名字
t.setName(name) # 設置線程的名字
t.isAlive() # 線程是否在運行中
t.idDaemon() # 返回西啊不是的 dameon 標誌
t.sertDaemon(daemonic) # 在 start 以前設置 daemon 標誌
import Tkinter
top=Tkinter.Tk() # 底層窗口對象
Button 按鈕,提供額外的功能
Canvas 畫布提供繪圖功能
Checkbutton 選擇按鈕一組方框能夠選擇其中的任意個
Entry 文本框
Frame 框架包含其它組件的容器
Label 標籤顯示文字或圖片
Listbox 列表框,一個選項列表能夠從中選擇
Menu 菜單點下菜單按鈕後彈出的一個選項列表能夠供選擇
Menubutton 菜單按鈕用來包含菜單的組件
Message 消息框相似於標籤
Radiobutton 單選按鈕
Scale 進度條,
Scrollbar 滾動條
Text 文本域
Toplevel 頂級
鏈接 MySQL : sudo apt-get install python-msyqldb
import MySQLdb
conn=MySQLdb.connect(host='localhost',user='root',passwd='123') # 鏈接數據庫系統
cursor=conn.cursor() # 獲取操做遊標
cursor.exectue('create database test') # 建立數據庫 test
cursor.close() # 關閉鏈接
conn.select_db('test') # 選擇數據庫
cursor.execute('create table student(id int,info varchar(100))') # 建立數據表
cursor.execute('insert into student values(%s,%s)',value) #value=[1,'male']# 插入一條記錄
cursor.executemany('insert into student values(%s,%s)',values) # 插入一個列表 values
count=cursor.execute('select * from student') # 查詢
result=cursor.fetchone() # 獲取一條記錄
result=cursor.fetchmany(count) # 獲取查詢的記錄
for r in result:
print r;
cursor.scroll(0,mode='absolute') # 重置遊標位置, 0 爲偏移量, mode=absolute, 默認 relative, 前提是當前遊標沒有越界
results=cursor.fetchall()
for r in results:
print r;
cursor.close()
ctypes 模塊:
dll=CDLL('../***.so') # 加載動態庫
f=getattr(dll,fun_name) # 從動態庫中獲取函數對象
f.restype=c_int # 設置函數返回類型
f.argtypes=(c_int,...) # 設置函數參數類型
聲明類和聯合必須繼承自 Structure 和 union, 類中必須有定義一個屬性 _fileds_ 其中 _fields_ 是一個元素爲 2 元組的列表, 2 元組是 ( 屬性名,屬性類型 ) ,如:
class Point(Structure):
_fields_=[('x',c_int),('y',c_int)]
Numpy:
1 安裝numpy:sudo apt-get install python-numpy
安裝Matplotlib: sudo apt-get install python-matplotlib
2 退出:quit()
3 numpy練習:
from numpy import* #
random.rand(4,4)#生成一個數組
randMat=mat(random.rand(4,4))#矩陣
randMat.I#逆矩陣
eye(4)#單位矩陣
4 查看並改變工做目錄
import os
os.getcwd()
os.chdir("PATH")#PATH爲目標路徑
5 定義函數體
import operator#加載運算符模塊
def 函數名(參數列表)
函數體語句
實例:
from numpy import *
import operator
def createDataSet()
group=array([[1,2,],[3,4],[5,6]])
labels=['A','B','C']
return group,labels
調用:
group,labels=createDataSet()
6 查看幫助help,如help(sorted),內建函數的查詢:help(array([1,2]).sort)
5) Numpy包的數組array
import numpy as np
a = np.arange(10)
a.reshape(2,5)#重塑數組爲2行5列
a.dtype# 元素數據類型
print(a.shape)#數組的維度具體狀況如(2,3,4)表示數組最底層爲4個元素,而後是3個一維數組2個二維數組
a.ndim#數組維數
a.size# 數組元素個數
a.itemsize# 查看元素大小
a = np.array([2,3,4])# 使用 array 函數,從 Python 列表或元組中建立
b = np.array([1.2, 4.6, 7.8])
c = np.array([(1,2,3), (4,5,6)])
d = np.array( [ [1,2], [3,4] ], dtype=complex )# 建立複數數組 dtype 決定元素類型
e = np.zeros((3,4))# 建立全是 0 的數組
f = np.ones( (2,3,4), dtype=np.int16 )# 建立全是 1 的數組
g = np.empty( (2,3) )# 使用隨機數來填充
h = np.arange( 10, 30, 5 )# 建立序列
i = np.arange(0,2,0.3)
j = np.linspace(0,2,9)
print(np.arange(10000))# 打印 numpy 數組與 Python 列表基本同樣,但有些差異
print(np.arange(10000).reshape(100,100))
7 Numpy包
a=mat([1,2,3])#矩陣
b=matrix([1,2,3])
a[0,1]#取元素
a*b.T#矩陣相乘,.T是取矩陣轉置
shape(a)#查看矩陣維數
a.shape[0]#獲取a的行數
multiply(a,b)#兩個矩陣每一個元素對應相乘
a.sort()#a的原地排序
a.argsort()#獲得矩陣中每一個元素的排列序號
a.mean()#計算矩陣的均值
a=mat([[1,2,3],[4,5,6]])#多維數組
a[:,0:2]#採用冒號選取多列或行,全部行0和1列
9 sorted(iteratble,cmp=None, key=None, reverse=False)。sorted和那些容器內建的sort的區別是sort是原地排序,sorted是新建一個列表
1)key:用列表元素的某個屬性和函數進行做爲關鍵字,有默認值,迭代集合中的一項;
2)reverse:排序規則. reverse = True 或者 reverse = False,有默認值。
3)cmp:用於比較的函數,比較什麼由key決定,有默認值,迭代集合中的一項;
4)iterable是須要排序的數據
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=operator.itemgetter(1,2)) #先跟句第二個域排序,再根據第三個域排序
結果:[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
10 python數組下標從0開始
11 type(a)#查看a的數據類型
12 strip聲明:s爲字符串,rm爲要刪除的字符序列
s.strip(rm) 刪除s字符串
中開頭、結尾處,位於 rm刪除序列的字符
s.lstrip(rm) 刪除s字符串中開頭處,位於 rm刪除序列的字符
s.rstrip(rm) 刪除s字符串中結尾處,位於 rm刪除序列的字符
1) 當rm爲空時,默認刪除空白符(包括'\n', '\r', '\t', ' ')
2) 這裏的rm刪除序列是隻要邊(開頭或結尾)上的字符在刪除序列內,就刪除掉,如:a='123a',a.strip('21')結果爲'3a'
13 包 profile 查看模塊運行的時間: import profile; profile.run(「fun()」)
14 for item in set: #for 循環遍歷 set 中的元素,若二維矩陣則 item 是行數據
15 in/not in 成員測試,如: if x not set 若 x 不在 set 中
16 list 的擴展: x.extend(y)# 接受列表參數 y 的擴展而且 y 的每一個元素做爲 x 的元素, x.expand(y) 是將列表 y 總體做爲 x 的一個元素 (expand 將參數做爲一個總體, extend 只能接收一個列表是逐個元素追加到原列表 )
scikit-learn:
安裝:
sudo apt-get install build-essential python-dev python-numpy python-setuptools python-scipy libatlas-dev//先安裝依賴
kmeans 的使用:
k_means=cluster.KMeans(k); #k 是簇數
k_means.fit(data);#data 是數據集,要求 data 的樣本數大於 k
labels=list(k_means.labels_);# 獲取每一個樣本的分類號