小知識點
遞歸
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就是一個返回函數的高階函數***
### 類