Since Jan.26th,2016
1、ubuntu 下運(yùn)行 python 的幾種方式
在 terminal下,直接
python進(jìn)入交互模式,然后開(kāi)始正常輸入代碼,每輸入一行就執(zhí)行一行。在 terminal 下,
python /home/rancho/桌面/test.py,即以默認(rèn)的 python 版本執(zhí)行該文件,一次性輸出結(jié)果,不再是一行一行的了。-
在 terminal 下,直接執(zhí)行
./home/rancho/桌面/helloworld.py的命令,前提是需要在【helloworld.py】這個(gè)文件中的首行先用#!開(kāi)頭注明使用的解釋器。注:需要執(zhí)行屬性。
在編輯器中,如 sublime text 3,輸入后直接 ctrl+B,即在下方命令窗口中出現(xiàn)執(zhí)行結(jié)果。
2、關(guān)于print時(shí)代碼的多行輸入
'''…'''用來(lái)注釋多行(本質(zhì)上為一串字符串)。-
\用來(lái)轉(zhuǎn)義\n,\t等等字符,每個(gè)需要轉(zhuǎn)義的字符前都要家加\,而r則用來(lái)簡(jiǎn)化,只要在引號(hào)前加r,引號(hào)中的就被作為原始字符串輸出。
代碼示例如下:
>>> print('\ttest')
test
>>> print('\ttest')
\ttest
>>> print(r'\ttest')
\ttest
但是,需要特別注意的是r似乎不能把引號(hào)本身作為原始字符串輸出,只能用\來(lái)實(shí)現(xiàn)。
比如輸出三個(gè)單引號(hào),用r會(huì)報(bào)錯(cuò),print(r''''')
但是用\則正常。
print('\'\'\'')
另外,正則表達(dá)式中的一些特殊符號(hào)似乎也不能用r轉(zhuǎn)義,比如輸出.就必須用代碼\.來(lái)實(shí)現(xiàn)。
-
在一個(gè)字符串中,行末的單獨(dú)一個(gè)反斜杠表示字符串在下一行繼續(xù),而不是開(kāi)始一個(gè)新的行。如下圖等價(jià)于 "This is the first sentence. This is the second sentence."
<http://old.sebug.net/paper/python/ch04s03.html>注:除了字符串中,
\也能起到連接多行的作用。<http://old.sebug.net/paper/python/ch04s08.html>
3、遞歸函數(shù)中的if和return
-
遞歸函數(shù)實(shí)現(xiàn)的一個(gè)重要原因是函數(shù)內(nèi)部調(diào)用了它本身,其實(shí)也就是
return的內(nèi)容還是不明確的,仍然需要調(diào)用它本身來(lái)實(shí)現(xiàn)的,比如一個(gè)表達(dá)式。因此一旦當(dāng)return的內(nèi)容確定下來(lái),比如變成了一個(gè)常熟或是字符串,則這個(gè)函數(shù)就結(jié)束了,return后的語(yǔ)句不會(huì)被再次執(zhí)行。
比如
def fact(n):
if n == 1:
return 1
return n*fact(n - 1)print(fact(5))
輸出得到的是120,即5!,事實(shí)上當(dāng)進(jìn)行到5×4×3×2×fact(1)的時(shí)候,由于n == 1,因此return得到的不再是一個(gè)表達(dá)式,而是常數(shù)1,從而,返回的5×4×3×2×fact(1)也成為了一個(gè)確定的值,120,函數(shù)return一個(gè)確定值的目標(biāo)已經(jīng)的達(dá)到,也就不再進(jìn)行接下來(lái)的語(yǔ)句,即函數(shù)調(diào)用完畢了。
但是
x=19
if x >= 17:
print(x)
print(x)
則會(huì)得到兩個(gè)19的輸出結(jié)果,因?yàn)?code>if語(yǔ)句的語(yǔ)法中就沒(méi)有執(zhí)行后跳過(guò)下面所有語(yǔ)句的定義,仍會(huì)執(zhí)行print(x)。
4、range()的用法
-
range(n)是指從0到n,但要注意的是0是被包括的,n是不被包括的,也就是0~(n-1)。
我們所做的只是提供兩個(gè)數(shù),range返回一個(gè)序列的數(shù)。這個(gè)序列從第一個(gè)數(shù)開(kāi)始到第二個(gè)數(shù)為止。例如,
range(1,5)給出序列[1, 2, 3, 4]。默認(rèn)地,range的步長(zhǎng)為1。如果我們?yōu)閞ange提供第三個(gè)數(shù),那么它將成為步長(zhǎng)。例如,range(1,5,2)給出[1,3]。記住,range 向上延伸到第二個(gè)數(shù),即它不包含第二個(gè)數(shù)。
在C/C++中,如果你想要寫(xiě)for (int i = 0; i < 5; i++),那么用Python,你寫(xiě)成for i in range(0,5)。你會(huì)注意到,Python的for循環(huán)更加簡(jiǎn)單、明白、不易出錯(cuò)。
http://old.sebug.net/paper/python/ch06s04.html
range輸出的是有序的。
- 另一點(diǎn)要注意的是,在
for i in range(5)這樣的循環(huán)中并不是隱藏了i += 1這樣的語(yǔ)句(注意 python 中沒(méi)有i++),而是先通過(guò)range(5)生成了一個(gè)可遍歷的對(duì)象(迭代器?),而后對(duì)它進(jìn)行遍歷。因此在循環(huán)內(nèi)部改變i的值不影響循環(huán)進(jìn)行。
舉例代碼:
for i in xrange(5):
print i,
i = 100
print i
輸出為:
0 100
1 100
2 100
3 100
4 100
顯然,每次執(zhí)行完i = 100的語(yǔ)句并輸出后,進(jìn)行下一次循環(huán)時(shí),i又變成了下一個(gè)數(shù),而與100無(wú)關(guān)了。
所以,for和range的這一條組合式的語(yǔ)句有兩個(gè)意義:
1.提供了一個(gè)一定次數(shù)的循環(huán)。
2.為每次循環(huán)提供了一定一個(gè)按照固定規(guī)律變化的值(i)。
5、輸出時(shí)* times的用法
-
print('test' * 5)得到輸出為testtesttesttesttest
6、enumerate的用法
- enumerate(列舉,枚舉)
# iter list with index:
print('iter enumerate([\'A\', \'B\', \'C\']')
for i, value in enumerate(['A', 'B', 'C']):
print(i, value)
https://github.com/michaelliao/learn-python3/blob/master/samples/advance/do_iter.py
得到的輸出結(jié)果為
iter enumerate(['A', 'B', 'C'])
0 A
1 B
2 C
因此,就可以通過(guò)這種方式把list變成索引-元素對(duì),在迭代時(shí)同時(shí)迭代這二者。
7、isinstance的用法
- 可以判斷一個(gè)變量是否是某些類(lèi)型中的一種(例如第三條就是兩種類(lèi)型)
>>> isinstance('test', str)
True
>>> isinstance('313', str)
True
>>> isinstance(313, (int,str))
True
還可以用來(lái)判斷是否是可迭代對(duì)象
from collections import Iterable
>>> isinstance([], Iterable)
True
>>> isinstance({}, Iterable)
True
>>> isinstance('test', Iterable)
True
>>> isinstance((x for x in range(3)), Iterable)
True
8、關(guān)于內(nèi)置字符串處理函數(shù)
-
內(nèi)置字符串處理函數(shù)可以看成是是新生成了一個(gè)字符串,而
[]所在位置不同決定了是先提取再進(jìn)行函數(shù)處理還是先進(jìn)行函數(shù)處理再提取。
當(dāng)然,在某些情況下兩者有相同的效果,比如下面的兩段代碼就分別自定義了一個(gè)首字母大寫(xiě),其他小寫(xiě)的函數(shù),輸出效果完全相同。
這是第一段:
def normalize(name):
return name.upper()[0] + name.lower()[1:]L1 = ['adam', 'LISA', 'barT'] L2 = list(map(normalize, L1)) print(L2)
這是第二段:
def normalize(name):
return name.upper()[0] + name.lower()[1:]
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)
輸出結(jié)果都是
['Adam', 'Lisa', 'Bart']
9、關(guān)于在dictionary中通過(guò)value查找key
-
用迭代實(shí)現(xiàn)
search_age = 19 dict = {'george':16, 'amber': 19} for x, y in dict.items(): if y == search_age: print(x)
輸出結(jié)果為
amber
特別注意:上述的x和y都是任意更換的,完全可以換成name和age,即字典被創(chuàng)建的時(shí)候key和value是沒(méi)有變量來(lái)指向的,無(wú)論是x,y還是name,age都是臨時(shí)用來(lái)迭代的。
10、關(guān)于切片
- 對(duì)于
y = x[a:b:c]
當(dāng)c > 0時(shí),a,b缺省值為0,len[x]。
當(dāng)c < 0時(shí),a,b缺省值為-1,-len[x] - 1。因此y = x[::-1]即為x的倒序。
11、關(guān)于字符串或list相等的比較
- 如果要比較兩個(gè)字符串或list是否相等,可以直接用
==進(jìn)行比較。
12、關(guān)于字符串和list的方法
- list的方法似乎是直接作用于list本身的。
fs = []
fs.append('test')
print(fs)
輸出為
['test'] - 字符串的方法似乎是創(chuàng)建了一個(gè)新的字符串,而非直接作用于字符串本身。
gs = 'GGG'
gs.lower()
print(gs)
輸出為
GGG
13、關(guān)于python輸出時(shí)取消自動(dòng)換行
- 在python2中是在句末直接加
,即可
a = [1,2,3,4,5]
for i in a:
print i,
得到輸出
1 2 3 4 5 - 在python3中是用
end來(lái)控制,不光可以取消換行,還可以任意設(shè)定間隔
a = [1,2,3,4,5]
for i in a:
print(i, end = ' ')
得到輸出
1 2 3 4 5
又比如
a = [1,2,3,4,5]
for i in a:
print(i, end = '\t')
得到輸出
1 2 3 4 5
14、含有0個(gè)或1個(gè)項(xiàng)目的元組
- 含有0個(gè)或1個(gè)項(xiàng)目的tuple
一個(gè)空的元組由一對(duì)空的圓括號(hào)組成,如
myempty = ()。然而,含有單個(gè)元素的元組就不那么簡(jiǎn)單了。你必須在第一個(gè)(唯一一個(gè))項(xiàng)目后跟一個(gè)逗號(hào),這樣Python才能區(qū)分元組和表達(dá)式中一個(gè)帶圓括號(hào)的對(duì)象。即如果你想要的是一個(gè)包含項(xiàng)目2
的元組的時(shí)候,你應(yīng)該指明singleton = (2 , )。
http://old.sebug.net/paper/python/ch09s03.html
也就是說(shuō)
string = (2)
print(5 - string)
這時(shí)string被認(rèn)為是一個(gè)int,輸出為
3
而
string = (2,)
print(5 - string)
此時(shí)string才被認(rèn)為是一個(gè)tuple,會(huì)報(bào)錯(cuò)。
15、關(guān)于字典增加元素
- dictionary增加元素與list不同,它沒(méi)有append方法(應(yīng)當(dāng)注意到dict是無(wú)序的)。
直接為dictionary創(chuàng)建一個(gè)鍵/值對(duì)即可。
she = {}
she['lomo'] = 'test'
print(she)
輸出為
{'lomo': 'test'}
事實(shí)上,代碼和更改一個(gè)key對(duì)應(yīng)的value是一樣的,不過(guò)當(dāng)這個(gè)key已經(jīng)存在的時(shí)候是更改,而當(dāng)它不存在的時(shí)候則是創(chuàng)建。
16、關(guān)于file和open方法
- python2中
file和open基本沒(méi)區(qū)別,而在python3則沒(méi)有了file的方法。
f = open('poem.txt', 'w')
以上代碼是可行的,直接創(chuàng)建了文件,而若將open換為file,則在python3中是會(huì)報(bào)錯(cuò)的。
17、關(guān)于pickle模塊
- python2中含有CPickle和pickle模塊(注意大小寫(xiě)),而python3中移除了CPickle模塊。
- python2中儲(chǔ)存器模塊使用中使用的是
r,w等,而python3中則需要用rb,wb等,b表示二進(jìn)制。
18、關(guān)于range和xrange
- python3中已經(jīng)取消了
xrange,而python2中xrange和range共存。
19、關(guān)于decode和encode
- decode是把其他編碼方式編碼的字符串轉(zhuǎn)換成用unicode編碼的字符串。
str.decode('utf-8')
上述代碼表示把utf-8編碼的字符串轉(zhuǎn)換成用unicode編碼的字符串。 - encode則是相反,把unicode編碼的字符串轉(zhuǎn)化為其他編碼方式編碼的字符串。
str.encode('utf-8')
上述代碼表示把unicode編碼的字符串轉(zhuǎn)換成用utf-8編碼的字符串。
可能在爬蟲(chóng)爬取的網(wǎng)絡(luò)數(shù)據(jù)的寫(xiě)入讀出時(shí)會(huì)用到以上兩種編碼方式。
19、關(guān)于正則表達(dá)式
- 在
{m,n}中,逗號(hào),前后不可有空格(容易習(xí)慣性地在逗號(hào)后面加空格),總之,在書(shū)寫(xiě)正則表達(dá)式的時(shí)候,不用考慮美觀問(wèn)題的空格,怎么簡(jiǎn)潔貼切怎么來(lái)。 -
.能匹配任意除\n以外的字符,因此.*?只適合于一行內(nèi)的任意匹配,而要跨行匹配的話,應(yīng)當(dāng)使用[\s\S]*?(\s匹配空白符,\S匹配非空白符)。
-
^一般表示匹配字符串開(kāi)頭或多行字符串的每一行開(kāi)頭,但當(dāng)它以這樣的形式[^...]出現(xiàn)時(shí),表示取反,如[^abc]表示不是 abc 的其他字符。
20、關(guān)于文件讀寫(xiě)
-
open('/home/rancho/test.txt', 'module'),module可以是以下幾種
r 只能讀
r+ 可讀可寫(xiě),不會(huì)創(chuàng)建不存在的文件。如果直接寫(xiě)文件,則從頂部開(kāi)始寫(xiě),覆蓋之前此位置的內(nèi)容,如果先讀后寫(xiě),則會(huì)在文件最后追加內(nèi)容。
w+ 可讀可寫(xiě) 如果文件存在 則覆蓋整個(gè)文件 不存在則創(chuàng)建
w 只能寫(xiě) 覆蓋整個(gè)文件 不存在則創(chuàng)建
a 只能寫(xiě) 從文件底部添加內(nèi)容 不存在則創(chuàng)建
a+ 可讀可寫(xiě) 從文件頂部讀取內(nèi)容 從文件底部添加內(nèi)容 不存在則創(chuàng)建
https://segmentfault.com/q/1010000003813594
- 在打開(kāi)一個(gè)文件的情況下,只要不關(guān)閉,寫(xiě)入是可以進(jìn)行多次的,并且是連續(xù)的,每次都是在上次的基礎(chǔ)上繼續(xù)寫(xiě)入的。即在一個(gè)
with…as…塊中,可以多次使用write方法,后面的不會(huì)覆蓋前面的。
但是一旦關(guān)閉文件后,再次打開(kāi)時(shí),如果用的是w模式,則會(huì)全部覆蓋重寫(xiě)。 - 對(duì)于
read和readlines兩個(gè)方法,都只能讀取一次,再進(jìn)行讀取就會(huì)變空白。而readline則可以進(jìn)行逐行讀取,雖然表面是多次讀取,實(shí)際上每短文本內(nèi)容也只被讀取了一次。 - 對(duì)于非二進(jìn)制文件(純文本),使用
w讀寫(xiě)方式;而對(duì)于二進(jìn)制文本(音樂(lè),視頻,圖像等),要采用wb讀寫(xiě)方式,不然可能會(huì)出現(xiàn)問(wèn)題(不同的系統(tǒng)下可能問(wèn)題不一樣)。 - 對(duì)于
w+,實(shí)際上是不能讀取到原文件內(nèi)容的,因?yàn)樗鼤?huì)先執(zhí)行清空操作。也就是說(shuō)你能夠讀取到的是你寫(xiě)入的內(nèi)容。
21 、關(guān)于urllib(urllib2)模塊
- urllib2和urllib在python3中合并為了urllib,而在python2中主要區(qū)別在于urllib2可以接受一個(gè)Request類(lèi)的對(duì)象,從而可以設(shè)置headers等。
-
response = urllib.urlopen('https://www.baidu.com/')后想要取得網(wǎng)頁(yè)的源代碼,需要用read方法,response.read()得到的是一個(gè)字符串,這里有兩點(diǎn)需要注意:-
read方法使用后response就變?yōu)榭樟耍簿褪?code>read方法只能用一次,而后無(wú)論是使用response還是response.read()得到的都不是剛才的數(shù)據(jù)了。
比如說(shuō)要在使用response.read()的同時(shí)測(cè)得字符串長(zhǎng)度,則應(yīng)該先foobar = response.read()把其保存在其他變量里,然后再對(duì)foobar使用len函數(shù)。
可以通過(guò)一下以下代碼感受一下
import urllib
import reurl = 'http://tieba.baidu.com/p/3138733512?see_lz=1&pn=5' response = urllib.urlopen(url) print len(response.read()) print len(response.read())
-
輸出為
212251
0
-
read得到的網(wǎng)頁(yè)源代碼往往很長(zhǎng),會(huì)保存在內(nèi)存中進(jìn)行接下來(lái)的一系列操作,每對(duì)一段進(jìn)行操作后最好要及時(shí)將它寫(xiě)入文件,不要累加在同一個(gè)變量下多次分塊操作后最后統(tǒng)一寫(xiě)入文件,這樣容易導(dǎo)致內(nèi)存爆掉。
22、關(guān)于PyQt
- 設(shè)定快捷鍵時(shí)在
+前后不要留空格,即輸入一個(gè)完整的字符串。 - 在坐標(biāo)系指定位置時(shí)(一般以px為單位),從左上角開(kāi)始,x 從左到右,y 從上到下。
但碰到網(wǎng)格布局時(shí),是一行一行從上往下來(lái)的,然后再是一列一列從左往右去的,比如(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2)
23、關(guān)于中文字符編碼
- 在 python2.x 中,加入以下代碼可以解決絕大多數(shù)問(wèn)題
# -- coding: utf-8 --
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )- 第一行主要是解決 python 文件(源文件)對(duì)字符串的編碼。
- 后三行主要是更改系統(tǒng)(指的是具體的操作系統(tǒng),比如 ubuntu )默認(rèn)的編碼方式,因?yàn)樵?python2.x 中,
encode函數(shù)無(wú)所謂直接從一種格式到另一種格式,但decode函數(shù)在轉(zhuǎn)化時(shí)需要用系統(tǒng)默認(rèn)編碼作為中介,而默認(rèn)的一般是 ascii ,不支持中文,所以即使轉(zhuǎn)換的雙方是 unicode 和 utf-8 ,都支持中文,仍然報(bào)錯(cuò)。所以這三行主要是解決由于打開(kāi)文件,網(wǎng)頁(yè)源碼獲取等等廣泛的 python 應(yīng)用過(guò)程中引起的編碼格式轉(zhuǎn)化問(wèn)題。 - 以上解決絕大多數(shù)問(wèn)題是指 python 解釋器不會(huì)報(bào)錯(cuò),但是仍可能碰到亂碼問(wèn)題,這就需要再次用
decode和encode函數(shù)進(jìn)行轉(zhuǎn)化了。 - 需要注意的是,真正的原理并不像上述文字說(shuō)的那么簡(jiǎn)單,涉及到 python2.x 中的字符串和 byte 數(shù)組類(lèi)型, python 有時(shí)會(huì)自動(dòng)地轉(zhuǎn)化編碼格式等等問(wèn)題,因此有時(shí)可能會(huì)碰到編碼問(wèn)題不在上述文字闡述理解的范圍內(nèi),但實(shí)際上都是 python2.x 在編碼上的一個(gè)設(shè)計(jì)問(wèn)題(據(jù)說(shuō)要考慮到兼容性),而 python3.x 似乎對(duì)這方面就有所改善,在字符串和 byte 數(shù)組類(lèi)型上有改變。
24、關(guān)于錯(cuò)誤處理時(shí)的 try 語(yǔ)句
-
try…except…是一個(gè)組合,不可拆分,即不可單獨(dú)使用try。當(dāng)然在語(yǔ)句塊最后加finally是可以的
25、關(guān)于 Windows 和 Linux 跨平臺(tái)的問(wèn)題
- 文件路徑
-
使用
os.absname('.')查看得到的當(dāng)前目錄可能是當(dāng)前的 python 文件(.py)所在目錄,但也可能是編輯器或者 IDE 所在目錄。所以要選擇當(dāng)前 python 文件(.py)所在目錄應(yīng)當(dāng)避免使用os.absname('.'),雖然在某些情況下得到的是我們想要的。可以使用以下幾種方式:
-
sys.argv[0]得到的是當(dāng)前 python 文件(.py)的絕對(duì)路徑,若要查看目錄,則可以用os.path.dirname(sys.argv[0]),保險(xiǎn)起見(jiàn)可以使用os.path.abspath(os.path.dirname(sys.argv[0])),記得先導(dǎo)入os即可。 -
os.path.dirname(__file__)也是可以得到當(dāng)前 python 文件(.py)所在目錄的。
跨平臺(tái)編譯時(shí)路徑的準(zhǔn)確性尤顯重要因此,因此可以定義一個(gè)通過(guò)上述的代碼定義一個(gè)
basepath作為基礎(chǔ)目錄,而資源文件(與 python 文件放在同一目錄下)絕對(duì)路徑可以用以下代碼實(shí)現(xiàn)
basepath + os.sep + 'background.jpg' -
路徑前最好加上
r,若在 linux 下問(wèn)題不大,但在 windows 下,會(huì)出現(xiàn)\的轉(zhuǎn)義問(wèn)題,因此最好養(yǎng)成習(xí)慣,只要有路徑,就使用r。
例子如下,此為 ubuntu 下代碼
'background.jpg'
此為 windows 下代碼
r'C:\Users\Rancho\Desktop\background.jpg'
-
26、判斷變量或字符是否為整數(shù)的方法
- 判斷變量
一般來(lái)說(shuō)用isinstance是可行的,但是不幸的是,布爾值也是int下的一個(gè)子類(lèi),因此isinstance(True, int)會(huì)得到True的輸出,故此判斷是否是整數(shù)的更合適的方法,應(yīng)當(dāng)是使用type(3) == int來(lái)判斷。
注意print int, type(3), type('test')結(jié)果如下:
<type 'int'> <type 'int'> <type 'str'>
注意正則表達(dá)式針對(duì)的是字符串,也就是說(shuō)你要是想用它來(lái)判斷必須要先將當(dāng)前變量轉(zhuǎn)化為字符串,而正則表達(dá)式判斷出來(lái)也只是這個(gè)字符串所攜帶的信息是否是整數(shù),和從根本上判斷上變量是否是整形變量還是有區(qū)別的。 - 判斷字符
除了使用正則表達(dá)式,也可以使用'isdigit'方法,
test = '313'
print test.isdigit()
test = 'lomo'
print test.isdigit()
輸出為
True
False
同理,對(duì)于判斷字母(注意是判斷字符是否為字母),有isalpha方法。
但要注意的是,bool 類(lèi)型的變量沒(méi)有isdigit,isalpha之類(lèi)的方法,若使用會(huì)報(bào)錯(cuò)。
27、關(guān)于 and 和 or 以及 not 的優(yōu)先順序
- and 優(yōu)先于 or
- not 會(huì)和緊鄰的結(jié)合
28、關(guān)于刪除數(shù)組中元素的幾種方法(del,remove,pop)
-
remove是通過(guò)指定value,并且用從頭開(kāi)始搜索的方式來(lái)刪除第一個(gè)符合的元素,要求輸入的變量為 value
test = ['t', 'e', 's', 't']
test.remove('t')
print test
test.remove(test[0])
print test
輸出為
['e', 's', 't']
['s', 't'] -
pop是通過(guò)指定索引來(lái)確定要?jiǎng)h除元素的位置,要求輸入的變量為 index ,同時(shí)還會(huì)返回被刪除的 value
test = ['t', 'e', 's', 't']
print test.pop(3)
print test
輸出為
t
['t', 'e', 's'] -
del和remove類(lèi)似,也是通過(guò)指定 value 來(lái)刪除的,但因?yàn)樗皇菙?shù)組的方法,因此還要指定數(shù)組
test = ['t', 'e', 's', 't']
del test[3]
print test
輸出為
['t', 'e', 's']
注意,- 不可以把
del test[3]替換為del 't' -
del和remove一樣,作為通過(guò) value 來(lái)刪除的方法,都是從頭搜索,一旦遇到符合條件的即刪除,然后結(jié)束,也就是只會(huì)刪除第一個(gè)符合條件的。因此要精確刪除的話,還是需要pop來(lái)指定索引位置的。
- 不可以把
29、關(guān)于排列組合
- 可以通過(guò)
itertools這個(gè)庫(kù)來(lái)實(shí)現(xiàn)快速的排列組合,組合使用combinations函數(shù),排列使用premutations函數(shù)。兩者都接受參數(shù)來(lái)指定挑選的元素的個(gè)數(shù)
import itertools
test = [1,2,3]
print list(itertools.combinations(test, 2))
print list(itertools.permutations(test, 2))
輸出為
[(1, 2), (1, 3), (2, 3)]
[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
注意到,itertools是個(gè)迭代器的庫(kù),因此對(duì)于combinations和permutations兩個(gè)函數(shù)的返回結(jié)果都是迭代器,如果需要一次性輸出的需要轉(zhuǎn)化為 list 形式。
30、關(guān)于 set 和 list 的性能問(wèn)題
- 二者性能差距很大,
set可能比list快上百倍以上,因此對(duì)大數(shù)據(jù)的遍歷,查找,刪除等,盡量利用set,或者將list轉(zhuǎn)為set后進(jìn)行操作。
31、爬蟲(chóng)中將cookie的字符串轉(zhuǎn)化為字典形式
pre = "utf8=?&authenticity_token=P/W5Eok1+QuvE2FgNomsDbFYBWYNWl1zv0a2K3smQjTPXeafoVXuJYnzWStGl4jzxZq8TKSbsXsFoBcL1uRo8A==&entry[field_1][]=UlT9&commit=提交" cookies={} for line in pre.split('&'): #其設(shè)置為1就會(huì)把字符串拆分成2份 name,value=line.strip().split('=',1) print name,value cookies[name]=value
以上代碼將&作為連接字符,具體因情況而變。
32、scipy內(nèi)模塊的導(dǎo)入問(wèn)題
- 大概就是說(shuō)scipy是一系列模塊的集合,如果你只
import scipy,那么 optimize 等這些模塊是不會(huì)自動(dòng)導(dǎo)入的,所以你需要這樣導(dǎo)入,from scipy import optimize,然后就可以使用scipy.optimize了。
https://github.com/scipy/scipy/issues/4005
33、科學(xué)計(jì)算時(shí)的浮點(diǎn)數(shù)和整數(shù)
- python2 中科學(xué)計(jì)算時(shí)還是不要用
from __future__ import division來(lái)用\表示精確除法代替原本的截?cái)喑ǎㄖ蝗〗Y(jié)果整數(shù)部分)了,因?yàn)檫@僅僅在普通表達(dá)式中起效,當(dāng)用到一些第三方庫(kù)的時(shí)候,就不一定識(shí)別\為精確除法了。所以目前建議,簡(jiǎn)單的計(jì)算的話,還是把每個(gè)數(shù)都寫(xiě)成浮點(diǎn)數(shù)而非整數(shù)形式好了。
33、解方程
- 一般使用
sympy.solve和scipy.optimize.fsolve。
https://www.zhihu.com/question/34987285- 因?yàn)?lambda 函數(shù)的特殊性,我現(xiàn)在還沒(méi)有找到 python 中方便快速的字符串轉(zhuǎn) lambda 的方法,因此有時(shí)候
scipy.optimize.fsolve還是挺不適合的。 - 要注意
sympy.solve得到的是一個(gè)數(shù)組。
- 因?yàn)?lambda 函數(shù)的特殊性,我現(xiàn)在還沒(méi)有找到 python 中方便快速的字符串轉(zhuǎn) lambda 的方法,因此有時(shí)候
34、求導(dǎo)數(shù)
- 一般使用
sympy.diff,接受參數(shù)是一個(gè)字符串。
輸入:
import sympy
expression = sympy.diff('3.0*x**2.0+2.0*x')
print expression
print type(expression)
輸出:
6*x + 2
<class 'sympy.core.add.Add'>
還可以配合sympy.solve一起使用(求導(dǎo)數(shù)的零點(diǎn)):
x0 = sympy.solve(sympy.diff(expression))
print x0
[-0.333333333333333]
35、numpy 中的 mgrid和meshgrid
-
meshgrid用法(用())
>>> x1 = np.arange(1, 11, 2)
>>> y1 = np.arange(-12, -3, 3)
>>> x1, y1 = np.meshgrid(x1,y1)
>>> x1
array([[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9],
[1, 3, 5, 7, 9]])
>>> y1
array([[-12, -12, -12, -12, -12],
[ -9, -9, -9, -9, -9],
[ -6, -6, -6, -6, -6]])
-
mgrid用法(用[])
>>> x2, y2 = np.mgrid[1:11:2, -12:-3:3]
>>> x2
array([[1, 1, 1],
[3, 3, 3],
[5, 5, 5],
[7, 7, 7],
[9, 9, 9]])
>>> y2
array([[-12, -9, -6],
[-12, -9, -6],
[-12, -9, -6],
[-12, -9, -6],
[-12, -9, -6]])
另一種用法是不提供步長(zhǎng)參數(shù),但提供數(shù)量參數(shù)
xs,ys = np.mgrid[-4:1:30j,0.8:1.1:30j]
其中的30j表示的是從 start 到 end 的總個(gè)數(shù),如果兩個(gè)不一致,會(huì)取大的那個(gè)。保證兩者個(gè)數(shù)一致。
36、matplotlib 畫(huà)圖
- 2D 折線圖或散點(diǎn)圖
import matplotlib.pyplot as plt
plt.figure()
ax = plg.gca()
ax.set_aspect(1) # 使橫縱坐標(biāo)軸對(duì)單位區(qū)間的實(shí)際長(zhǎng)度(axes per unit length)相等
plt.plot(x,y,'rx-',linewidth=2,markersize=5,label='test')
plt.xlim([-1,1])
plt.title()
plt.xlabel()
plt.ylabel()
plt.legend()
plt.show()
- 3D 折線圖
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.plot(xs,ys,'rx-',zs=zs,linewidth=2,markersize=5,label='test')
ax.set_zlim([-1,1])
plt.title()
ax.set_title()
ax.set_xlabel()
ax.set_ylabel()
ax.legend()
plt.show()
- 3D 曲面圖
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
k,b=np.mgrid[1:3:3j,4:6:3j]
f_kb=3*k+2*b+1
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')
ax.plot_surface(k,b,f_kb)
plt.show()
在畫(huà) 3D 圖前,我們一般用mgrid或meshgrid來(lái)生成需要 x,y軸上的變量矩陣。畫(huà) 3D 圖的要求是 z 矩陣的行數(shù)等于 x 矩陣的行數(shù),列數(shù)等于 y 矩陣的列數(shù)。也就是由如下的對(duì)應(yīng)關(guān)系(以 3 階矩陣為例):
| y1,1 | y1,2 | y1,3 | |
|---|---|---|---|
| x1,1 | z1,1 | z1,2 | z1,3 |
| x2,1 | z2,1 | z2,2 | z2,3 |
| x3,1 | z3,1 | z3,2 | z3,3 |
以mgrid為例,我們看mgrid生成的矩陣可以發(fā)現(xiàn),x 的每一行都是一樣的,而 y 的每一列都是一樣的,這其實(shí)是為了代入 z 的函數(shù)進(jìn)行計(jì)算比較方便,比如 z 就可以直接生成z = 2*x + 3*y,正好是一一對(duì)應(yīng)的。
colorbar:注意,如果要顯示 colorbar,需要在 plot_surface 時(shí)先指定映射
from matplotlib import cm
ax.plot_surface(k,b,f_kb,cmap=cm.coolwarm)
fig.colorbar(surf, shrink=0.5, aspect=5)
ax.legend()
- 等高線圖(2D 和 3D)
2D 代碼:
k,b=np.mgrid[1:3:3j,4:6:3j]
f_kb=3*k+2*b+1
fig = plt.figure()
ax = fig.add_subplot(111)
ax.contour(k,b,f_kb,np.logspace(-2, 2, 70))
plt.show()
在處理數(shù)據(jù)時(shí)和 3D 曲面圖是一樣的,都是用到了mgrid或meshgrid函數(shù),而上述代碼中contour的第四個(gè)參數(shù)是指 z 軸取 0.01 到 100 之間,并劃分成70個(gè)平面,即有 70 條等高線充滿這個(gè)范圍(但實(shí)際顯示可能不到70條,因?yàn)檫€要看 x 軸和 y 軸的范圍限制)。
如果我只想畫(huà)出 z=1,z=2,z=3 這 3 條等高線呢?
plt.contour(X, Y, Z,[1,2,3])
要注意的是
contour(X, Y, Z,1)的意思是只畫(huà)一條等高線出來(lái),至于是哪一條,就不知道了,而contour(X, Y, Z,[1])的意思是畫(huà)出 z=1 的這一條等高線。
http://blog.csdn.net/william_2015/article/details/47304687。
如果需要對(duì)等高線加上圖例,不能直接通過(guò)ax.contour(xc,yc,zc,label='text')實(shí)現(xiàn),而需要單獨(dú)設(shè)置,比如:
CS = ax.contour(xc,yc,zc)
CS.collections[0].set_label('text')
ax.legend()
同樣地,設(shè)置 linewidth 等屬性也類(lèi)似,使用CS.collections[0].set_linewidth(2)等語(yǔ)句來(lái)實(shí)現(xiàn)。
其實(shí),等高線圖可以直接在圖上標(biāo)出每條線代表的值,而不需要通過(guò)圖例。具體代碼如下:
CS = ax.contour(xc,yc,zc)
ax.clabel(CS)
因?yàn)檫@不是圖例,所以不需要legend方法即可顯示。
最后,如果要畫(huà) 3D 的等高線圖,只要將
ax = fig.add_subplot(111)
改為
ax = fig.add_subplot(111,projection='3d')
即可。
- 在同一個(gè) figure 中同時(shí)畫(huà) 2D 和 3D
fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(212,projection='3d')
plt.show()
- 3D 圖中坐標(biāo)軸的隱藏,背景顏色的設(shè)置等
color_bg = (0.1843,0.3098,0.3098)
color_green = 'g'
color_yellow = '#f06215'
color_white = '#ffffff'
color_red = 'r'
fig = plt.figure(facecolor=color_bg) # 設(shè)置外圍顏色
fig.suptitle('3D Realtime Re-modeling',color=color_white) # 設(shè)置主標(biāo)題顏色
ax = fig.add_subplot(111,projection='3d',axisbg=(0.1843,0.3098,0.3098)) # 設(shè)置畫(huà)圖區(qū)域背景顏色
ax.w_xaxis.set_pane_color(color_bg) # 設(shè)置坐標(biāo)平面顏色
ax.w_zaxis.line.set_lw(0.) # 設(shè)置 z 軸線寬(類(lèi)似語(yǔ)句對(duì) x,y無(wú)效)
ax.tick_params(axis='x', colors=color_white) # 設(shè)置坐標(biāo)軸刻度顏色
ax.set_xlabel('x',color=color_red) # 設(shè)置坐標(biāo)軸標(biāo)簽顏色
ax.set_xlim([1,6]) # 設(shè)置坐標(biāo)軸范圍
ax.set_yticks(np.linspace(1,4,4)) # 設(shè)置坐標(biāo)軸刻度
ax.set_zticks([]) # 設(shè)置坐標(biāo)軸無(wú)刻度
plt.gca().invert_yaxis() # 翻轉(zhuǎn)坐標(biāo)軸
如果要設(shè)置網(wǎng)格線參數(shù),需要在實(shí)例化 figure 之前設(shè)置如下代碼:
from matplotlib import rcParams
rcParams['grid.linestyle'] = '-'
rcParams['grid.color'] = 'g'
rcParams['grid.linewidth'] = 0.5
如果要隱藏所有坐標(biāo)軸:
ax._axis3don = False
- 動(dòng)態(tài)畫(huà)圖(實(shí)時(shí)更新)
正常情況下plt.show()會(huì)阻塞線程,因此需要plt.ion(),這樣的話plt.show()就不會(huì)阻塞線程,程序可以繼續(xù)運(yùn)行。但是圖像仍然不會(huì)更新,需要使用循環(huán)plt.pause(0.05),在這 0.05s 的時(shí)間內(nèi)更新圖像并支持鼠標(biāo)移動(dòng),因?yàn)槭茄h(huán),所以感覺(jué)不到明顯的阻塞。如果 pause 時(shí)間過(guò)長(zhǎng)的話,那么這段時(shí)間內(nèi)新的數(shù)據(jù)就會(huì)無(wú)法繪制圖像,會(huì)導(dǎo)致圖像繪制的延遲。
- 設(shè)置坐標(biāo)軸
注意ax.set_yticks或者plt.yticks都要在plot后執(zhí)行才能生效。 - 設(shè)置 subplot 之間的間距
plt.subplot(121)
plt.plot(x_list, y_list)
plt.subplots_adjust(wspace = 0.05, hspace=0.05)
關(guān)于 subplots_adjust 的參數(shù)說(shuō)明:
subplots_adjust(left=None, bottom=None, right=None, top=None,
wspace=None, hspace=None)
left = 0.125 # the left side of the subplots of the figure
right = 0.9 # the right side of the subplots of the figure
bottom = 0.1 # the bottom of the subplots of the figure
top = 0.9 # the top of the subplots of the figure
wspace = 0.2 # the amount of width reserved for blank space between subplots,
# expressed as a fraction of the average axis width
hspace = 0.2 # the amount of height reserved for white space between subplots,
# expressed as a fraction of the average axis height
- 消除保存的圖片兩側(cè)的空白
在 jupyter 中看圖片兩側(cè)可能沒(méi)有空白,但保存下來(lái)的圖片會(huì)顯示有空白,消除空白的方法是在保存時(shí)加上bbox_inches='tight'
fig = plt.figure()
fig.savefig('test.png', bbox_inches='tight')
- 保存高質(zhì)量的圖片
使用 svg 格式(可能會(huì)很大,可以和 raw 格式匹敵)或者高 dpi 的 png 格式
fig = plt.figure()
fig.savefig('test.png', dpi=600)
fig = plt.figure()
fig.savefig('test.svg')
37、numpy 中為矩陣添加一行(列)和在同一行(列)中添加元素
- numpy.c_
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> b = np.ones(3)
>>> np.c_[a,b]
array([[ 1., 2., 3., 1.],
[ 4., 5., 6., 1.],
[ 7., 8., 9., 1.]])
其實(shí)有好幾種實(shí)現(xiàn)函數(shù),見(jiàn)http://www.tuicool.com/articles/ZVrUjq3
- numpy.append
>>> np.append([1, 2, 3], [[4, 5, 6], [7, 8, 9]])
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.append(np.array([1,2,3]),[4,5,6])
array([1, 2, 3, 4, 5, 6])
38、numpy 中 array 的復(fù)制
- 不能直接使用
=或切片([:]),應(yīng)該使用顯式復(fù)制,即copy
import numpy as np
a = np.array([[1,2,3]])
b = np.copy()
這一點(diǎn)和 list 不同,對(duì)于 list,=不會(huì)復(fù)制數(shù)據(jù),而切片可以。對(duì)于 numpy 中的 array,=和切片都不會(huì)復(fù)制數(shù)據(jù),需要copy才可以。
參考http://blog.csdn.net/xidianliutingting/article/details/51682867
39、numpy 中 array 和 matrix 對(duì)一維的處理
-
array 把一維看成列向量,而 matrix 則看成以行數(shù)為 1 的矩陣(行向量)
In [1]: np.array([1,1,1]).shape Out[1]: (3,) In [2]: np.matrix([1,1,1]).shape Out[2]: (1, 3)
40、pandas 基本操作
-
按標(biāo)簽取出一行(得到series):
df.ix['lable'](比如在使用 describe之后)# df is a dataframe -
求標(biāo)準(zhǔn)差:pandas 求標(biāo)準(zhǔn)差是樣本標(biāo)準(zhǔn)差(N-1),numpy 求標(biāo)準(zhǔn)差是總體標(biāo)準(zhǔn)差(N)。因此需要求樣本標(biāo)準(zhǔn)差(無(wú)偏)時(shí),
df.std()需要求總體標(biāo)準(zhǔn)差時(shí),需要用
values轉(zhuǎn)成 numpy 的 array 計(jì)算,df.values.std()
41、超長(zhǎng)字符串的聲明
-
特殊格式
long_string = ( 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, ' 'sed do eiusmod tempor incididunt ut labore et dolore magna ' 'aliqua. Ut enim ad minim veniam, quis nostrud exercitation ' 'ullamco laboris nisi ut aliquip ex ea commodo consequat. ' 'Duis aute irure dolor in reprehenderit in voluptate velit ' 'esse cillum dolore eu fugiat nulla pariatur. Excepteur sint ' 'occaecat cupidatat non proident, sunt in culpa qui officia ' 'deserunt mollit anim id est laborum.' )參考http://stackoverflow.com/questions/8577027/how-to-declare-a-long-string-in-python
42、缺失值(NAN)
-
缺失值不能用
==判斷In [11]: None == None Out[11]: True In [12]: np.nan == np.nan Out[12]: False 可以使用
pandas.isnull()來(lái)判斷單個(gè)數(shù)據(jù)是否是NAN
43、字典 key 搜索
- 利用
in來(lái)搜索某個(gè)值是否是 dictionary 的一個(gè)鍵時(shí),直接使用test_value in adict比用test_value in adict.keys()要快多。
參考https://stackoverflow.com/questions/1602934/check-if-a-given-key-already-exists-in-a-dictionary
44、requests 庫(kù)
- 消除 SSL warning
import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()



