python學習筆記(二)更新中

數據結構:序列
1。python包含6中內建的序列:列表,元組,字符串,Unicode字符串,buffer對象,xrang對象。
序列是一種數據結構,它包含的元素都進行了編號(從0開始)。典型的序列包括列表字符串元組。其中列表是可變的,而元組和字符串是不可變。

列表和元組的區別是列表可修改,元組不能修改,絕大部分情況下列表可以代替元組(用元組作爲字典的K時不行,K不能修改),。列表元素用中括號( [ ])包裹,元素的個數及元素的值可以改變。元組元素用小括號(( ))包裹.
元組:
tag = ('robots', 77, 93, 'try')
列表:
tag = [1,2,3,4,5,6,7,8,9]
字典:
tag = {'host': 'earth'}
2。通用的序列操作:索引,分片(sliceing),加,乘,計算序列長度,找出最大或最小元素,檢查某個元素是否屬於該序列

分片示例:(包含起始不包含結尾,和JAVA一樣)
>>> tag = ('abcdefghijklmnopqrstuvwxyz')
>>> tag[3:6]
def

>>> tag = [1,2,3,4,5,6,7,8,9]
>>> tag[3:6]
[4,5,6]
如果要從尾向頭截取:(索引從尾算9就是-1,8是-2)
>>> tag = [1,2,3,4,5,6,7,8,9]
>>> tag[-6:-3]
[4,5,6]
如果要截取到尾部最後一個數應該這樣
>>>tag[-6:]
>>>[4,5,6,7,8,9]



分片賦值
>>>name=list('perl')
>>>name[2:]=list('ar')
>>>print name
['p', 'e', 'a', 'r']

利用分片插入元素
>>>numbers=[1,5] 
>>>numbers[1:1]=[2,3,4]
>>>print numbers
[1, 2, 3, 4, 5]

利用分片刪除元素
>>>numbers=[1,2,3,4,5]
>>>numbers[1:4]=[]
>>>print numbers
[1, 5]

分片可以設置步長
>>>n=[1,2,3,4,5]
>>>print n[::2]
[5, 3, 1]

分片可以實現反轉,通過講步長設置爲負值
>>>n=[1,2,3,4,5]
>>>print n[::-2]

列表
list函數適用於所有類型的序列,而不只是字符串
>>>list('hello')
['h','e','l','l','o']

extend方法可以在列表的末尾一次性追加另一個序列中的多個值。
>>>a=[1,2,3]
>>>b=[4,5,6]
>>>a.extend(b)
print a
[1, 2, 3, 4, 5, 6]

append方法用於在列表末尾追加新的對象
>>>a=[1,2,3]
>>>b=[4,5,6]
>>>a.append(b)
>>>print a
[1, 2, 3, [4, 5, 6]]

count方法統計某個元素在列表中出現的次數
>>>['1','2','3','4','1'].count('1')
2

index方法用於從列表中找出某個值第一個匹配項的索引位置:
>>>knights=['we','are','knights','who','say']
>>>knights.index('who')
4

insert方法用於將對象插入到列表中:
>>>numbers=[1,2,3,4]
>>>numbers.insert(3,'four')
>>>print numbers
[1,2,3,'four',4]


pop方法會移除列表中的一個元素(默認是最後一個元素),並且返回該元素的值(pop方法是唯一一個既能修改列表又返回元素值的列表方法)
>>>x=[1,2,3]
>>>print x.pop()
3
>>>print x
[1,2]
>>>print x.pop(0)
1
>>>print x
[2]

remove方法用於移除列表中某個值的第一個匹配項
>>>x=['to','be','or','not','to','be']
>>>x.remove('be')
>>>print x
['to','or','not','to','be']

刪除列表中元素
names=['a','b','c']
del names[2]

reverse方法將列表中的元素反向存放,reverse方法沒有返回值,reversed方法會返回一個iterator對象,可用於:
>>>x=[1,2,3]
>>>list(reversed(x))
[3,2,1]

sort方法用於在原位置對列表進行排序。sort方法是沒有返回值的
>>>x=[4,5,2,1,7,9]
>>>y=x.sort() #Don`t do this
>>>print y
None

sorted函數返回排序後的列表,sorted函數可以用於任何序列,卻總是返回一個列表。
>>>x=[4,5,2,1,7,9]
>>>y=sorted(x) 
>>>print x
[4,5,2,1,7,9]
>>>print y
[1,2,4,5,7,9]

元組
tuple函數的功能與list函數基本上是一樣的:以一個序列作爲參數並把它轉換爲元組。如果參數就是元組,那麼該參數就會被原樣返回。
>>>tuple([1,2,3])
(1,2,3)
>>>tuple('abc')
('a','b','c')

字符串
字符串格式化
>>>format="Hello,%s.%s enough for ya?"
>>>values=('world','Hot')\
>>>print format % values
Hello,world.Hot enough for ya?

>>>'Price of eggs: $%d' %  42
'Price of eggs: $42'

>>> '%s is %s' % (names[i],ages[i])

字符串可以按照字母順序排列進行比較
>>>'alpha'<'beta'
True
字符串方法
find方法可以在一個較長的字符串中查找子字符串。它返回子串所在位置的最左端索引。如果沒有找到返回-1.
find方法還可以接受可選的起始點和結束點參數:
>>>subject='abcdefg'
>>>subject.find('bcd')
>>>subject.find('bcd',2) #只提供起始點
>>>subject.find('bcd',2,6) #提供起始點和結束點

join方法是非常重要的字符串方法,它是split方法的逆方法。
>>>dirs='','usr','bin','env'
>>>'/'.join(dirs)
/usr/bin/env
>>>print 'C:'+'\\'.join(dirs)
C:\usr\bin\env

lower方法返回字符串的小寫母板,相關的方法有:islowecapitalizeswapcasetitleistitleupperisupper
title方法
>>>"hello word".title()
"Hello Word"

replace方法
>>>'This is a test'.replace('is','eez')
'This eez a test'

split方法(如果不提供任何分隔符,程序會把所有空格作爲分隔符)
>>>'1+2+3+4+5'.split('+')
['1','2','3','4','5']

strip方法返回去除兩側(不包括內部)空格的字符串
>>>'            This is a test          '.strip()
'This is a test'

字符串反轉
>print ''.join(reversed("abcd"))
也可以用分片來實現
>print 'abcd'[::-1]

字典
dict函數,通過其他映射(比如其他字典)或者(鍵,值)這樣的序列對建立字典。
>>>items=[('name','Gumby'),('age',42)]
>>>d
{'age':42,'name':'Gumby'}

clear方法清除字典中所有的項。這個是原地操作(類似list.sort),所以無返回值(或者說返回值爲None)

copy方法返回一個具有相同鍵-值的新字典(這個方法實現的是淺複製(shallow copy),因爲值本身就是相同的,而不是副本),深複製(deep copy)參見deepcopy函數

 fromkeys方法使用給定的鍵建立新的字典,每個鍵默認對應的值爲None.

get方法是個更寬鬆的訪問字典項的方法。一般來說,如果試圖訪問字典中不存在的項時會出錯:
>>>d={}
>>>print d['name']
#error
而使用get就不會:
>>>print d.get{'name'}
None

has_key方法可以檢查字典中是否含有給出的鍵。表達式d.has_key(k)相當於表達式 k in d。

items方法將所有的字典項以列表方式返回,這些列表項中的每一項都來自於(鍵,值)。但是項在返回時並沒有特殊的順序。

iteritems方法作用大致相同,但是會返回一個迭代器對象而不是列表。

keys方法將字典中的鍵以列表形式返回,而iterkeys則返回針對鍵的迭代器。

pop方法用來獲得對應於給定鍵的值,然後將這個鍵-值從字典中移除。

popitem方法類似於list.pop,後者會彈出列表的最後一個元素。但不同的是,popitem彈出隨機的項,因爲字典並沒有“最後的元素”或者其他有關順序的概念。若想一個接一個地移除並處理項,這個方法就非常有效了(因爲不用首先獲取鍵的列表)

setdefault方法在某種程度上類似於get方法,就是能夠獲得與給定鍵相關聯的值,除此之外,setdefault還能在字典中不含有給定鍵的情況下設定相應的鍵值。
>>>d={}
>>>d.setdefault('name','N/A')
>>>print d
{'name': 'N/A'}

update方法可以利用一個字典項更新另外一個字典,提供的字典中的項會被添加到舊的字典中,若有相同的鍵則會覆蓋。
>>>d={1:'a',2:'b',3:'c',4:'d'}
>>>x={1:'c',5:'e'}
>>>d.update(x)
>>>d
{1: 'c', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

values方法以列表的形式返回中的值(itervalues返回值的迭代器)。與返回鍵的列表不同的是,返回值的列表中可以包含重複元素。

循環遍歷字典元素
>>>d={1:'a',2:'b'}
>>>for D in d:
          print D,' ',d[D]
1 a
2 b


條件、循環和其他語句

從模塊中導入函數
import somemodule
from somemodule import somefunction
from somemodule import somefunction,yetanotherfunction
from somemodule import *
爲整個模塊起別名
>>>imort math as foobar
>>>foobar.sqrt(4)
2.0
爲函數起別名
>>>from math import sqrt as foobar
>>>foobar(4)
2.0

賦值
序列解包
>>>x,y,z=1,2,3
>>>print x,y,z
1 2 3
>>>x,y=y,x
>>>print x,y,z
2 1 3
這種就是序列解包,更形象的表示:
>>>values=1,2,3
>>>values
(1,2,3)
>>>x,y,z=values
>>>x
1
應用:
>>>scoundrel={'name':'Robin','girlfirend':'Marion'}
>>>key,value=scoundrel.popitem()   #隨機彈出一項,詳細說明搜索本文popitem方法
>>>key
'girlfriend'
>>>value
'Marion'

條件和條件語句
除了下面的值在做布爾表達式的時候,會被解釋器看作false,其他的值都是true
False None 0 "" () [] {}
True和False屬於布爾類型,bool函數可以用來(和list、str、tuple一樣)轉換其他值
>>>bool('ewafeawf')
True
>>>bool(42)
True
>>>bool('')
False
>>>bool(0)
False
注意雖然[]和""都是假值,但是他們本身卻不相等。也就是說[]!=""

if用法見筆記一,這裏只做補充
python中比較運算符和賦值運算一樣是可以連接的:
>>>i=12
>>>if 0<i<20:
             print True
True

對於python中==和is的用法:
==是同等運算符
is是同一性運算符
總結:使用==運算符來判定兩個對象是否相等,使用is判定兩者是否等同(同一個對象)
注意:避免將is運算符用於比較類似數值和字符串這類不可變值。由於python內部操作這些對象的方式的原因,使用is運算符的結果是不可預
測的。


並行迭代
同時迭代兩個序列
>>>names = ['a','b','c','d','e']
>>>ages = [1, 2, 3, 4, 5]
>>>for i in range(len(names)):
              print '%s is %s' % (names[i],ages[i])

zip函數可以用來進行並行迭代,可以把兩個序列“壓縮”在一起,然後返回一個元組列表。
>>>zip(names,ages)
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]

解包元組
>>>for name,age in zip(names,ages)
                print name,'is',age
zip函數也可以作用於任意多的序列。zip可以應付不等長的序列:當最短的序列“用完”的時候就會停止:
>print zip(range(5),xrange(1000000000))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
在上面的代碼中,不推薦用range替換xrange。儘管只需要前5個數字,但是range會計算所有的數字,這要花費很長時間。而使用xrange就不用擔心這個問題,它只計算前5個數字。

列表推導式-輕量級循環
>print [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>print [x*x for x in range(10) if x%3==0]
[0, 9, 36, 81]
>print [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

抽象
創建函數
用python寫的斐波那契數舉例:
def fibs(num):
    '這裏可以添加函數註釋'
    result = [0, 1]
    for x in range(num-2):
        result.append(result[-2] + result[-1])
    return result

print fibs(8)
#[0, 1, 1, 2, 3, 5, 8, 13]

定義函數時可以給參數設置默認值:
def test(name,age=22,sex='man'):
    print '%s %d %s' %(name,age,sex)

test('zhangsan',25)
#zhangsan 25 man

不定長參數:
參數分裝在元組中:
def test(*params):
    print params

test('zhangsan','lisi','wangwu')
#('zhangsan', 'lisi', 'wangwu')
應用:
def test(*params):
    print params
    
para={'a','b','c'}    
test(*para)
#('a', 'c', 'b')

參數分裝在字典中:
def test(**params):
    print params

test(a=1,b=2,c=3)
#{'a': 1, 'c': 3, 'b': 2}
應用:
def test(**params):
    print params
    
para={'a':1,'b':2,'c':3}    
test(**para)
#{'a': 1, 'c': 3, 'b': 2}


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