python筆記

特色

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來引用,不可用偏移引用。

創建:

  1. 工廠方法:
d=dict([‘x’,1],[‘y’,2])
  1. 內建方法:
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章