Python

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ù)中的ifreturn

  • 遞歸函數(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)了。
所以,forrange的這一條組合式的語(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中fileopen基本沒(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ǔ)存器模塊使用中使用的是rw等,而python3中則需要用rb,wb等,b表示二進(jìn)制。

18、關(guān)于range和xrange

  • python3中已經(jīng)取消了xrange,而python2中xrangerange共存。

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ì)于readreadlines兩個(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 re

      url = '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)題,這就需要再次用decodeencode函數(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']
  • delremove類(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'
    • delremove一樣,作為通過(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ì)于combinationspermutations兩個(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.solvescipy.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ù)組。

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 中的 mgridmeshgrid

  • 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 圖前,我們一般用mgridmeshgrid來(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 曲面圖是一樣的,都是用到了mgridmeshgrid函數(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 搜索

44、requests 庫(kù)

  • 消除 SSL warning
import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專(zhuān)業(yè)技能寫(xiě)完項(xiàng)目接著寫(xiě)寫(xiě)一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,809評(píng)論 1 118
  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號(hào) 簡(jiǎn)介有稍微接觸python的人就會(huì)知道,python中...
    ayuLiao閱讀 3,397評(píng)論 1 5
  • 字符集和編碼簡(jiǎn)介 在編程中常常可以見(jiàn)到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集。確切的說(shuō)...
    蘭山小亭閱讀 9,092評(píng)論 0 13
  • 本節(jié)內(nèi)容 Python介紹 發(fā)展史 Python 2 or 3? 安裝 Hello World程序 變量 用戶輸入...
    小小不懂11閱讀 3,544評(píng)論 2 30
  • 網(wǎng)站構(gòu)建初級(jí)指南 什么是WWW WWW指萬(wàn)維網(wǎng)(World Wide Web),萬(wàn)維網(wǎng)常被稱(chēng)為Web,Web是由遍...
    Galory閱讀 373評(píng)論 0 1

友情鏈接更多精彩內(nèi)容