python備忘錄

小知識點

遞歸
def calculatedepth(mytree):
    maxdepth=0
    firststr=mytree.keys()[0]
    seconddict=mytree[firststr]
    for key in seconddict.keys():
        print key,
        if type(seconddict[key]).__name__=='dict':
            numdepth=1+calculatedepth(seconddict[key])
        else:
            numdepth=1   #到葉節(jié)點后演怎,計算樹深度的變量+1
        if numdepth>maxdepth:
            maxdepth=numdepth
        print numdepth,maxdepth
    return maxdepth

if __name__=='__main__':
    mytree={"紋理": {"模糊": "否", "清晰": {"根蒂": {"稍蜷": {"色澤": {"烏黑": {"觸感": {"軟粘": "否", "硬滑": "是"}}, "青綠": "是"}}, "蜷縮": "是", "硬挺": "否"}}, "稍糊": {"觸感": {"軟粘": "是", "硬滑": "否"}}}}
    b=calculatedepth(mytree)

1今穿、# -*- coding: UTF-8 -*-
作用是定義源代碼的編碼. 如果沒有定義, 此源碼中是不可以包含中文字符串的.PEP 0263 -- Defining Python Source Code Encodingshttps://www.python.org/dev/peps/pep-0263/
2艇抠、```
sys.getdefaultencoding()

是設置默認的string的編碼格式
https://segmentfault.com/q/1010000003066524

>當對str進行編碼時布疙,會先用默認編碼將自己解碼為unicode豺瘤,然后在將unicode編碼為你指定編碼姆钉。
這就引出了python2.x中在處理中文時说订,大多數出現錯誤的原因所在:python的默認編碼,defaultencoding是ascii
[Python中的str與unicode處理方法](http://python.jobbole.com/81244/)


- 
Python導入自定義包或模塊  
[sys.path.append](http://www.cnblogs.com/kaituorensheng/archive/2013/05/24/3096040.html)
> 對于模塊和自己寫的程序不在同一個目錄下潮瓶,可以把模塊的路徑通過sys.path.append(路徑)添加到程序中

import sys
sys.path.append(’引用模塊的地址')





- 狹義的Shell指的就是命令行終端
shell的作用:用戶輸入指令陶冷,通過Shell和內核溝通,控制硬件正常工作
> $ echo:表示輸出文本
$ echo cd:表示輸出路徑
$ ls:顯示本層目錄的所有文件和文件夾

$ cd Desktop/
$ ls -al #查看桌面目錄的所有文件毯辅,包括隱藏文件

可參考http://www.cnblogs.com/xiaodao/archive/2012/02/21/2361519.html
- 判斷一個變量是否是某個類型可以用isinstance()

a=list()
isinstance(a,list) #a表示數據類型對應實例埂伦,list表示數據類型
True
type(a)
<type 'list'>

- 獲得一個對象的所有屬性和方法,可以使用**dir()函數**


### Dataframe
- 建表
> dft=DataFrame({'B':[0,1,2,np.nan,4]},  
index=pd.Index([pd.Timestamp('20130101 09:00:00'), pd.Timestamp('20130101 09:00:02'), pd.Timestamp('20130101 09:00:03'),  pd.Timestamp('20130101 09:00:05'), pd.Timestamp('20130101 09:00:06')], name='foo'))

- 查詢已安裝包
>終端--pip list      #會出現相應包和版本信息

### Class
#### 1 思恐、類屬性
- 類的幾種特殊屬性的含義
> C.\__name__:以字符串的形式沾谜,返回類的名字膊毁,注意這時候得到的僅僅是一個字符串,它不是一個類對象
C.\__doc__:顯示類的文檔
C.\__base__:類C的所有父類类早。如果是按照上面方式定義的類媚媒,應該顯示object,因為以上所有類都繼承了它涩僻。等到學習了“繼承”缭召,再來看這個屬性,內容就豐富了
C.\__dict__:以字典形式顯示類的所有屬性
C.\__module__:類所在的模塊
 

if _name_ == "main": #此處_main_相當于一個模塊

C.base 查看類C的父類P
返回<class 'main.P'>

print C.mro #打印出類的繼承順序

#### 2逆日、
- 當建立實例的時候嵌巷,首先要執(zhí)行類中的初始化函數
- 單繼承VS多繼承
- 子類方法或屬性覆蓋父類方法或屬性VS調用父類被覆蓋的方法

### Python2.x中的編碼問題
#### 1、unicode與utf-8間的轉換
- 嚴格意義上說室抽,str其實是字節(jié)串搪哪,它是unicode經過編碼后的字節(jié)組成的序列。對UTF-8編碼的str'漢'使用len()函數時坪圾,結果是3晓折,因為實際上,UTF-8編碼的'漢' == '\xE6\xB1\x89'兽泄。
- unicode才是真正意義上的字符串漓概,對字節(jié)串str使用正確的字符編碼進行解碼后獲得,并且len(u'漢') == 1

coding: UTF-8

u=u'漢'
print repr(u)

u'\u6c49'病梢,等價于u

s=u.encode('UTF-8')
print repr(s)

'\xe6\xb1\x89' ,type(s)=str

u2=s.decode('UTF-8')
print repr(u2)

u'\u6c49'

對unicode進行解碼是錯誤的

s2 = u.decode('UTF-8')

同樣胃珍,對str進行編碼也是錯誤的

u2 = s.encode('UTF-8')


#### 2、讀寫文件
- open()方法打開文件時蜓陌,read()讀取的是str觅彰,讀取后需要使用正確的編碼格式進行decode()
- write()寫入時,如果參數是unicode钮热,則需要使用你希望寫入的編碼進行encode()填抬,如果是其他編碼格式的str,則需要先用該str的編碼進行decode()隧期,轉成unicode后再使用寫入的編碼進行encode()痴奏。
- 如果直接將unicode作為參數傳入write()方法,Python將先使用源代碼文件聲明的字符編碼進行編碼然后寫入厌秒。

coding: UTF-8

f=open('test.txt')
s=f.read()
f.close()
print type(s)

<type 'str'>

已知是GBK編碼读拆,解碼成unicode

u=s.decode('GBK')

f=open('test.txt','w')

編碼成UTF-8編碼的str

s=u.encode('UTF-8')
f.write(s)
f.close()

綜上:
***字節(jié)串本身是不帶編碼信息的,所以必須你事先知道字節(jié)串使用的編碼才能進行正確的解碼鸵闪。解碼得到的就是unicode了檐晕,在碼表中對應的就是中文***
但是兩種不同的編碼一般會存在一些互相不同的“真空區(qū)域”,如果字節(jié)串中包含這里面的字節(jié),解碼時會拋出異常辟灰。中文我們一般都是使用GBK和UTF-8居多个榕,所以有一個方法就是依次使用這兩種編碼嘗試解碼,哪個沒有拋出異常就認為是哪種編碼格式

-- coding: utf-8 --

u = '漢'
c = u'漢'
c
u'\u6c49'
u = '漢'
b=u.decode('UTF-8') # 直接加 u 和 decode('UTF-8')效果相同
b
u'\u6c49'
type(c)
<type 'unicode'>
type(b)
<type 'unicode'>
u
'\xe6\xb1\x89'
b.encode('UTF-8')
'\xe6\xb1\x89'

http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html
#### 3芥喇、str.encode()/str.decode()西采,引自老齊
######3.1
- 查看默認編碼方式,python命令行

import sys
sys.getdefaultencoding()
'ascii' #默認為ascii形式


- 修改默認編碼方式
在程序中加入如下代碼

import sys
reload(sys)
sys.setdefaultencoding('utf8')

https://github.com/qiwsir/ITArticles/blob/master/Python/Python%E7%9A%84%E4%B8%AD%E6%96%87%E6%98%BE%E7%A4%BA%E6%96%B9%E6%B3%95.md
###### 3.2 編碼的轉換方式
- 基于ACII得到的***字節(jié)串***继控,一個漢字兩個字節(jié)

a = "趙國"
type(a)
<type 'str'>
len(a)
4
a
'\xd5\xd4\xb9\xfa'


- 基于Unicode的***字符串***

b = u'趙國'
type(b)
<type 'unicode'>
len(b)
2
b
u'\u8d75\u56fd'


- Unicode的***字符串***轉為UTF-8編碼

c = b.encode("utf-8")
type(c)
<type 'str'> #中文str以GBK和UTF-8居多械馆,偶爾試試ACII
len(c)
6
c
'\xe8\xb5\xb5\xe5\x9b\xbd'

d = c.decode("utf-8")
type(d)
<type 'unicode'>
len(d)
2
d
u'\u8d75\u56fd'


#### 4、避免中文亂碼的經驗操作
- 使用utf-8編碼方案武通,因為它跨平臺不錯霹崎,開頭聲明。
目的是:為了在源代碼中支持非ASCII字符冶忱,必須在源文件的第一行或者第二行顯示地指定編碼格式尾菇。告訴python interpret如何解釋字符串的編碼

-- coding: utf-8 --

- 遇到字符(節(jié))串,立刻轉化為unicode囚枪,不要用str()派诬,直接使用unicode()

unicode_str = unicode('中文', encoding='utf-8')

因為此時python為ACII編碼方式,故不能處理非ascii編碼链沼,需要自己設置python的默認編碼

print unicode_str.encode('utf-8')
或者使用如下形式

import sys
reload(sys)
<module 'sys' (built-in)>
sys.setdefaultencoding('utf8')
cc=unicode('中文') #這里就不在需要申明
cc
u'\u4e2d\u6587'


- 如果對文件操作默赂,打開文件的時候,最好用codecs.open忆植,替代open(這個后面會講到放可,先放在這里)

import codecs
codecs.open('filename', encoding='utf8')


- 聲明字符串直接加u谒臼,聲明的字符串就是unicode編碼的字符串

a = u"中"

附:關于python編碼的前世今生
http://foofish.net/python-character-encode.html
  - python中和字符串相關的數據類型,分別是**str**朝刊、**unicode**兩種,他們都是basestring的子類蜈缤,可見str與unicode是兩種不同類型的字符串對象
  - 不論是Python3x拾氓、Java還是其他編程語言,Unicode編碼都成為語言的默認編碼格式底哥,而數據最后保存到介質中的時候咙鞍,不同的介質可有用不同的方式,有些人喜歡用UTF-8趾徽,有些人喜歡用GBK续滋,這都無所謂
![](http://upload-images.jianshu.io/upload_images/38359-92d48e677f783805?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  
### 函數
- 遞歸函數
定義:在函數內部,可以調用其他函數孵奶。如果一個函數在內部調用自身本身疲酌,這個函數就是遞歸函數

- 迭代
1 . 定義:給定一個list\tuple\str\dict\generator,我們可以通過**for...in**循環(huán)來遍歷這個list\tuple\str\dict\generator,這種遍歷我們稱為迭代(Iteration)
2 . 判別可迭代對象:

from collections import Iterable #iterable:可迭代的
isinstance('abc', Iterable)
True

- 列表生成式
列表生成式即List Comprehensions朗恳,是Python內置的非常簡單卻強大的可以用來創(chuàng)建list的生成式

- 列表生成器
定義:一邊循環(huán)一邊計算的機制湿颅,稱為生成器(Generator)

- 函數生成器yield 
使用函數來生成復雜的生成器

- 高階函數:
定義:***函數參數中可以接受函數傳入***
1 . map/reduce
 - map()
函數接收兩個參數,一個是函數粥诫,一個是序列(列表油航、元組、字符串)怀浆,map
將傳入的函數依次作用到序列的每個元素谊囚,并把結果作為新的list返回
 - reduce
函數接收兩個參數,一個是函數(接受2個參數)揉稚,一個是序列(列表秒啦、元組、字符串)搀玖,結果生成一個聚合值
2 . filter

- 返回函數
 - 閉包

def count():
... fs = []
... for i in range(1, 4):
... def f():
... return i*i
... fs.append(f)

此處相當于fs列表放了3個f函數余境。但是返回的函數沒有立即執(zhí)行,

直到調用了f()才執(zhí)行(相當于下面的f1()),此時i已經變成3
... return fs
...

f1, f2, f3 = count()
f1()
9
f2()
9
作為對照灌诅,使用如下函數
def count():
... fs = []
... for i in range(1, 4):
... def f():
... return i*i
... fs.append(f()) #此處為f()芳来,直接調用函數的結果
... return fs
...
f1,f2,f3=count()
f1
1
f2
4
f3
9


- 裝飾器
要增強函數的功能,比如猜拾,在函數調用前后自動打印日志即舌,但又不希望修改函數的定義,這種在代碼運行期間動態(tài)增加功能的方式挎袜,稱之為“裝飾器”(Decorator)顽聂。***decorator就是一個返回函數的高階函數***

### 類
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盯仪,隨后出現的幾起案子紊搪,更是在濱河造成了極大的恐慌,老刑警劉巖全景,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耀石,死亡現場離奇詭異,居然都是意外死亡爸黄,警方通過查閱死者的電腦和手機滞伟,發(fā)現死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炕贵,“玉大人梆奈,你說我怎么就攤上這事〕瓶” “怎么了亩钟?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我径荔,道長督禽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任总处,我火速辦了婚禮狈惫,結果婚禮上,老公的妹妹穿的比我還像新娘鹦马。我一直安慰自己胧谈,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布荸频。 她就那樣靜靜地躺著菱肖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旭从。 梳的紋絲不亂的頭發(fā)上稳强,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音和悦,去河邊找鬼退疫。 笑死,一個胖子當著我的面吹牛鸽素,可吹牛的內容都是我干的褒繁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馍忽,長吁一口氣:“原來是場噩夢啊……” “哼棒坏!你這毒婦竟也來了?” 一聲冷哼從身側響起遭笋,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤坝冕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坐梯,有當地人在樹林里發(fā)現了一具尸體徽诲,經...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡刹帕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年吵血,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片偷溺。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹋辅,死狀恐怖,靈堂內的尸體忽然破棺而出挫掏,到底是詐尸還是另有隱情侦另,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站褒傅,受9級特大地震影響弃锐,放射性物質發(fā)生泄漏。R本人自食惡果不足惜殿托,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一霹菊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧支竹,春花似錦旋廷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馒吴,卻和暖如春扎运,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饮戳。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工绪囱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人莹捡。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓鬼吵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親篮赢。 傳聞我的和親對象是個殘疾皇子齿椅,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內容

  • http://python.jobbole.com/85231/ 關于專業(yè)技能寫完項目接著寫寫一名3年工作經驗的J...
    燕京博士閱讀 7,574評論 1 118
  • 個人筆記,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,696評論 0 5
  • 可以看我的博客 lmwen.top 或者訂閱我的公眾號 簡介有稍微接觸python的人就會知道启泣,python中...
    ayuLiao閱讀 3,113評論 1 5
  • 字符集和編碼簡介 在編程中常郴两牛可以見到各種字符集和編碼,包括ASCII,MBCS,Unicode等字符集寥茫。確切的說...
    蘭山小亭閱讀 8,488評論 0 13
  • python學習筆記 聲明:學習筆記主要是根據廖雪峰官方網站python學習學習的遣蚀,另外根據自己平時的積累進行修正...
    renyangfar閱讀 3,043評論 0 10