文章目錄
特色
print ‘a’*50 #打印50個’a’
print a,b,c #連續打印a,b,c的值,中間用空格分隔
print的格式化打印:
print “%s %s” % (‘a’, ‘b’) #注意此處應該把格式化的變量用小括號包含在一個元組裏
python的代碼塊不像c/c++/java那樣用{}來限定,而完全通過行首縮進來體現。
from future import division
python中沒有switch語句,但可通過字典來實現。
讀取網頁源碼
import urllib
page = urllib.urlopen(url)
html = page.read()
下載
urllib.retrive(url, localfilename)
文件名
後綴區別:.py, .pyc, .pyo
變量名
(a)只是標籤,一旦值發生改變,其地址(id(a))也變化。這一點與c語言不同。
同樣的值的變量,其地址相同(元組除外。因爲元組是隻讀的)
運算符
大部分與c相似,另類有:
//: 求商
**:乘冪
註釋符
單行註釋:#
多行註釋:’’’ 或 “”"
連行符
a=“hello
world”
引號
單引號和雙引號可相互替代(成對),注意用單(雙)引號定義的字符串中,單(雙)引號需要在前面加轉義字符\’(\”)來表示:
>>> a="asdf'"
>>> b='asdf\''
>>> a==b
True
三引號(單或雙)除了可以用來表示多行註釋,也可以用來定義帶有換行符的字符串:
>>> a="""
hello
world
'''
"""
>>> a
"\nhello\nworld\n'''\n"
Python搜索模塊的路徑
- 程序的主目錄
- $PYTHONPATH目錄(如果已經進行了設置)
- 標準連接庫目錄(一般在/usr/local/lib/python2.X/)
- 任何的.pth文件的內容(如果存在的話). 新功能,允許用戶把有效果的目錄添加到模塊搜索路徑中去。.pth後綴的文本文件中一行一行的地列出目錄。
這四個組建組合起來就變成了sys.path了,可用以下指令查看:
>>> import sys
>>> sys.path
['', '/usr/lib/python2.7/site-packages/MarkupSafe-1.0-py2.7-linux-x86_64.egg', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib64/python2.7/site-packages/gtk-2.0', '/usr/lib/python2.7/site-packages']
導入時,Python會自動由左到右搜索這個列表中每個目錄。
數據類型
序列
包括列表、元組、字符串
序列的基本操作:len(), +, *, in, max(), min(), cmp(tuple1, tuple2)
元組元素只讀。字符串只讀。列表可讀寫。
字符串 str
a[begin🔚step]。如a[1:4], a[:4], a[4:], a[-1], a[::2](步長爲2取字符)。例:
a=‘abcde’, 則
a[::2]==‘ace’
a[-2:-5:-1]=‘dcb’ //注意end指向的元素是不包括的。此處-5指向的是a。
單引號,雙引號,三引號(三個單引號或三個雙引號)三引號可輸入帶有換行符的字符串。
字符串前加’r’,字符串中的反斜槓就不代表轉義字符,而只代表其本身。
s=r’\nabc\n123’
len(s) == 10
元組 tuple ()
可用t=(x,y,z)來定義,用t[n]來取數據。
可定義空元組()。如果只有一個元素,也需要逗號,如(x,),如果不加逗號(x),則被認爲不是元組類型,等同於x。
元組可以賦值給一組變量。如t=(“name”,2,3)可以賦值給:a,b,c=t
列表 list []
list=[x,y,z]
如果只有一個元素,可以後邊不跟逗號。
list.append(x)
list.remove(x)
x in list
a=(1,2,3)
b=(4,5,6)
c=zip(a,b) #[(1, 4), (2, 5), (3, 6)]
type ( c ) #list
字典 dict {}
{key0:value0, key1:value1, …}
類似c++中的map模板。用key來引用,不可用偏移引用。
創建:
- 工廠方法:
d=dict([‘x’,1],[‘y’,2])
- 內建方法:
d={}.fromkeys((‘x’,‘y’),-1) #這裏字典裏的value值都爲-1
訪問:
for k in d:
print d[k]
增加/修改:
d.(key)=value
刪除:
d.pop(key)
d.clear()
del d
字典的方法:
len(), hash(), clear(), fromkeys(seq, val=None), get(key, default=None)
has_key(key), items(), keys(), iteritems(), iterkeys(), itervalues()
pop(key[,default]), setdefault(key,default=None), update(dict2), values()
遍歷字典數據的兩種方法:
for k in d:
print d[k]
for k,v in d.items():
...
系統內建函數
type(d), str(d), cmp(d)
格式化打印
"%08x”% num #輸出8位16進制數
流程控制
if
if condition:
action
elif condition2:
action2
else:
action3
True/False
and, or, not
循環
for iter in sequence:
statements
else: #循環正常結束會執行這個程序塊
statements
while condition:
statements
for i in range(100): #range(i,j,step) i默認爲0
…
print var,“text”
循環控制
break/continue/pass
函數
函數定義
def 函數名(參數列表):
函數體
支持c++式的默認參數
局部變量和全局變量:與c類似
在函數體中也可定義全局變量,前面加global
參數傳遞
函數的參數可以包含在一個元組中進行傳遞。如:
def func(a,b)
...
或,
t=(1,2)
func(*t) #注意t前面要加星號
參數在以下用法下可不必按照順序傳遞:
func (b=..., a=...)
參數也可放在字典中傳遞,字典中的keys應該與函數的形參同名。
func (**d)
定義可接收不定個數參數的函數:
def func(x, *args):
#...
func(1,2,3,4,5) #2,3,4,5作爲名爲args的元組
def func(x, *args, **kwargs):
#...
func(1,2,3) #args=(2,3)
func(x=1, 2, 3, 4, y=5, z=6, ...) #args=(2, 3, 4), kwargs={y:5, z:6}
匿名函數
g = lambda x,y : x*y
構造的是一個函數對象
遞歸的一個方法:
reduce(func, list) #func本身作用於list,而其結果與list的剩餘成員=繼續做func,往復循環直到結束。
常用函數
數學
abs, max, min, len, divmod (得到商和餘的元組), pow, round
常用
callable, isinstance(obj, type), cmp, range(start=0, max+1), xrange
類型轉換
type, int, long, float, complex(複數), str, list, tuple, hex, oct, chr, ord(返回單個字母對應的ascii碼數值)
string函數
s.xxx(…),或者import string後,string.xxx(s, …):
capitalize, replace, split(str, times)
序列
len, max, min,
filter(func, seq) 保留seq中對func函數返回爲true的值,
zip(lists) 把n個m元list組合成一個m元list,生成list中的成員爲n元組
map(func, lists) 對n個m元list, 生成一個m元list,如果func爲None,則與zip效果相同
否則生成list的每個成員,其值爲func(list1[i], list2[i], …)
reduce
函數返回
return語句
模塊
腳本可以單獨運行,也可導入另一個腳本中運行,這時稱爲模塊,文件名(不帶擴展名)即爲模塊名。
導入模塊的搜索順序:當前文件夾優先。
可按目錄組織爲包。需在目錄下放置一個__init__.py文件。
一些內置變量:
name: main,或者調用該模塊的文件名。
模塊導入
不要在同行導入多個頂級模塊
import (引用時應該寫modulename.func)
import as
from subprocess import Popen, PIPE
標準庫
相關第三方庫
本地應用/特殊庫
儘量不要用相對導入,這對修改於移植不大好
可以這樣導入類
from myclass import MyClass
from foo.bar.yourclass import YourClass
或者
import myclass
import foo.bar.yourclass
使用時 myclass.MyClass 和 yourclass.YourClass
正則表達式
import re
re.findall(r, s) #返回一個list
[], ^, $,
\d, \D(非數字字符), \s, \S(非空白字符), \w(字母或數字或_), \W
*, +, ?(出現1次或0次)
{m, n}
(r1|r2)
p=re.compile("patten")
p=re.compile("patten", re.I) #不區分大小寫
p.findall(s)
p的其他函數:
match, search, 返回MatchObject實例,match只匹配開頭
findall, finditer
match object方法:
group()返回re匹配的字符串
start()返回匹配開始位置
end()
span() 返回(開始,結束)
其他一些頂級函數:
match, search, sub, subn, split, findall
re.sub(r, new, str)
re的compile標誌:
DOTALL,S .可匹配所有字符包括換行
IGNORECASE, I
LOCALE, L
MULTILINE, M 多行匹配
VERBOSE, X 可通過多個換行來表示RE,使代碼更清晰,但是搜索時會忽略掉這些換行。
(xxx)代表分組,搜索時優先返回分組中的數據
淺拷貝
(只copy引用,其id不變),深拷貝(copy真正的資源,id發生變化)
import copy
a=[1,2,3,['a','b','c'],'d']
b=a #b完全和a一樣
c = copy.copy(a) #c和a的id不一樣,但是c[3]和a[3]的id一樣
d = copy.deepcopy(a) #d和a的id不一樣,包括d[3]和a[3]。
文件與目錄
f=open(filename, mode) 或 f=file(filename) #mode: r/r+/w/w+/a/a+/b(二進制)/U(支持所有換行符)
f.read
f.write
f.close
file object的其他方法
readline #string
readlines #list
next #similar to readline
writelines
seek(offset, option)
flush
for i in open(filename)
print i
import os
mkdir(path[,mode=777])
makedirs(name,mode=511) 一次多級目錄
rmdir(path)
removedirs(path)
listdir(path)
getcwd()
chdir(path)
walk(top, topdown=true, None) 返回三元組,分別爲遍歷的路徑、目錄列表、文件列表
g = os.walk(path)
g.next() …
os.path.isdir(path)
os.path.join
異常處理
try:
...
execpt errorType, e:
...
finally:
... //無論是否有異常,無論異常是否已被處理,都會調用
raise errorType(desc)
儘量使用基於類的異常
使用 raise ValueError(‘message’) 而非raise ValueError, message
mysql模塊
import MySQLdb
conn=MySQLdb.connect(user=‘root’,passwd=’’,host=‘127.0.0.1’)
cur=conn.cursor()
conn.select_db(name)
cur.execute(sqlstr)
cur.execute(sqlstr,(values)) //執行格式化打印的sql語句
cur.executemany(sqlstr, [(values1), (values2), …]) //可執行多條sql語句,如批量插入
cur.execute(“select …”) //返回查詢到的記錄條數
cur.fetchone() //連續執行以獲取整個查詢結果
cur.scroll(offset, ‘absolute’) //類似文件的seek
cur.fetchmany(count) //返回元組,每個成員也是元組(各域的值)
cur.close()
conn.close()
面向對象
class ClassName:
#data members
x=ClassName()
functions
def func(self): #至少要有self這樣一個形參
#...
函數:ClassName.function()
方法:object.function(),方法本身也是object
namespace and scope
從大到小:非local(在當前scope之外)的變量都是隻讀的
類的內建成員(變量或函數):
_doc_
_init_
Class and Instance Variables
class Dog:
kind = 'canine' # class variable shared by all instances
def __init__(self, name):
self.name = name # instance variable unique to each instance
繼承
class DerivedClassName(BaseClassName):
其他
使用 isinstance() 而非 type 比較
判定序列空時不要去用 len()
#Yes:
if not seq:
if seq:
#No:
if len(seq):
if not len(seq):
不要將 boolean 型值和 True, False 用 == 進行比較
Yes: if ha:
No: if ha == True:
Worse: if ha is True:
Python庫
telnetlib: telnet客戶端2.7自帶
paramiko: ssh客戶端
參考資料
http://study.163.com/course/courseMain.htm?courseId=302001
https://docs.python.org/2/tutorial/index.html
https://docs.python.org/2/library/index.html