數(shù)據(jù)類型
數(shù)據(jù)類型由三部分組成身份(id)、類型(type)、值。
看對(duì)象有沒(méi)有改變使用id(object)查看對(duì)象的內(nèi)存地址是否改變蛹磺。
def compare(a,b):
if a is b: #a和b是同一個(gè)對(duì)象
statements
if a == b: #a和b具有相同的值
statements
if type(a) =type(b): #a和b具有相同的類型
statements
python能直接處理的數(shù)據(jù)類型有以下幾種(type)
數(shù)值number:整數(shù)int,長(zhǎng)整型long同仆,浮點(diǎn)數(shù)float #python3中l(wèi)ong不存在萤捆,int可以存儲(chǔ)64位整數(shù)
布爾值bool:True、False #注意大小寫(xiě)俗批,在與數(shù)值運(yùn)算時(shí)俗或,True的值為1,F(xiàn)alse的值為0
空值:None
字符串:str
線性容器:list扶镀,tuple #支持迭代蕴侣,字符串也是一種線性容器
Hash容器:dict,set
如果對(duì)象的值是可以修改的臭觉,則稱為可變對(duì)象(mutable)昆雀,否則成為不可變對(duì)象(immutable)辱志。
可以進(jìn)行對(duì)象類型和值的對(duì)比。其他比較操作符也支持>狞膘、<揩懒、>=、<=挽封、!=已球、==,邏輯操作符and辅愿、or智亮、not
數(shù)值
查看int對(duì)象所具有的方法:help(int),dir(int),int.doc
bit_length(Number of bits necessary to represent self in binary.返回表示該數(shù)字的時(shí)占用的最少位數(shù))
a = 1
print a.bit_length()
二進(jìn)制符號(hào)
位移 >> <<
x << y \ x >> y #左移(補(bǔ)0)和右移(切尾)是基于二進(jìn)制的一種算法 >>、 <<,使用bin函數(shù)查看二進(jìn)制
x << y == x * ( 2 ** y )
可用于計(jì)算硬盤容量点待,比如 1024 >> 10按位與 &
二進(jìn)制靠右對(duì)齊阔蛉,不足補(bǔ)0,比較位置都是1則返回1癞埠,其他位返回0
可用于奇偶數(shù)判斷,數(shù)值與1進(jìn)行&運(yùn)算状原,返回0則為偶數(shù),返回1則為奇數(shù):5 & 1 == 1按位或 |
二進(jìn)制靠右對(duì)齊苗踪,不足補(bǔ)0颠区,比較位置只要有1,則返回1按位異或 ^
比較位相異返回1通铲,相同返回0-
按位取反 ~
?
字符串
python默認(rèn)ascii碼毕莱。使用單引號(hào)和雙引號(hào)效果一樣。
跟C語(yǔ)言類似测暗,可以使用\進(jìn)行轉(zhuǎn)義:\n換行央串,\t制表符,\r回車符碗啄,\0空值(Null)
如果長(zhǎng)字符串需要跨越多行,有如下三種方法:
- 使用'''xxxxxxxx'''代替普通引號(hào)
- 使用三個(gè)"""xxxxxxxx"""
- 在每行最后加上\將換行符轉(zhuǎn)義稳摄。
原始字符串:如果在字符串前加上r稚字,即輸出引號(hào)中原始字符串 print r'let's go!',不能在原始字符串尾部輸入\厦酬,除非對(duì)其進(jìn)行轉(zhuǎn)義
字符串的索引:a[0],字符串偏移量從0開(kāi)始胆描,最后一位從-1開(kāi)始。字符串的值不可原地改變仗阅。
+為字符串的拼接昌讲,*為字符串的重復(fù)
查看字符串具有的方法:help(str),dir(str)
count(self, sub, start=None, end=None):用于統(tǒng)計(jì)字符串里某個(gè)字符出現(xiàn)的次數(shù),可選參數(shù)為在字符串搜索的開(kāi)始與結(jié)束位置。sub –> 搜索的子字符串减噪,start –> 字符串開(kāi)始搜索的位置短绸。默認(rèn)為第一個(gè)字符,第一個(gè)字符索引值為0车吹。end –> 字符串中結(jié)束搜索的位置。字符中第一個(gè)字符的索引為 0醋闭。默認(rèn)為字符串的最后一個(gè)位置。
decode(self, encoding=None, errors=None):解碼证逻,對(duì)于len在處理漢字的時(shí)候因?yàn)榉祷氐氖亲止?jié)數(shù)目導(dǎo)致結(jié)果不符乐埠,可以使用decode轉(zhuǎn)碼,或者len(u"哈哈")
encode(self, encoding=None, errors=None):編碼囚企,針對(duì)unicode
find(self, sub, start=None, end=None):檢測(cè)字符串中是否包含子字符串str丈咐,如果指定beg(開(kāi)始)和end(結(jié)束)范圍,則檢查是否包含在指定范圍內(nèi)龙宏,如果包含子字符串返回開(kāi)始的索引值棵逊,否則返回-1。
isalnum(self):法檢測(cè)字符串是否由字母和數(shù)字組成烦衣,如果string至少有一個(gè)字符并且所有字符都是字母或數(shù)字則返回True,否則返回False
isalpha(self):
split: S.split([sep [,maxsplit]]) -> list of strings返回一個(gè)list
join:
replace:
translate:
示例:打印出字符串中的字符及其位置
a = 'shsh'
for i in range(len(a)):
print '(%d)' % i,a[i]
也可以使用enumerate()函數(shù):
a = 'shsh'
for i,ch in enumerate(a):
print '(%d)' % i,ch
示例:取出字符串中的數(shù)字
a = "aAsmr3idd4bgs7Dlsf9eAF"
print ''.join([x for x in a if x.isdigit()])
示例:字符串的拼接
1.c = a + b
2.c = "{a}歹河" .format(a=a,b=b)
3.c = "%s%s" % (a,b)
4.c="".join([a,b])
str和repr
str函數(shù)用于將值轉(zhuǎn)化為適用于人閱讀的形式,相當(dāng)于to string
repr函數(shù)轉(zhuǎn)化為供解釋器讀取的形式花吟,創(chuàng)建一個(gè)合法的字符串表示值秸歧,repr(x)等同x
print '1+2='+1+2
字符串格式化format
在Python中,采用的格式化方式和C語(yǔ)言是一致的衅澈,用%實(shí)現(xiàn)键菱;
有幾個(gè)%?今布,后面就跟幾個(gè)變量经备,順序需要一致(只有一個(gè)變量的時(shí)候,括號(hào)可以省略)部默;如果不太確認(rèn)用什么侵蒙,可以直接使用%s將任何數(shù)據(jù)類型轉(zhuǎn)換為字符串;
字符串里含%可用%%進(jìn)行轉(zhuǎn)義傅蹂,來(lái)表示一個(gè)%纷闺;
可以在"%"和字母之間插進(jìn)數(shù)字表示最大場(chǎng)寬。 例如: %3d 表示輸出3位整型數(shù), 不夠3位右對(duì)齊份蝴。 %9.2f 表示輸出場(chǎng)寬為9的浮點(diǎn)數(shù), 其中小數(shù)位為2, 整數(shù)位為6, 小數(shù)點(diǎn)占一位, 不夠9位右對(duì)齊犁功。
%d 整數(shù) :print "1+1 = %d " % int(1+1)
%f 浮點(diǎn)數(shù)
%s 字符串 : print "my name is %s lilei" % "hanmeimei's"
%x 十六進(jìn)制整數(shù)
'%s is a %s' % ('he','boy')
字典形式的字符串的格式化更加靈活,注意花括號(hào)的位置
'%(who)s is a %(gender)s' %{'who':'he','gender':'boy'}
"this is {whose} {fruit}" .format (fruit = "apple" , whose = "my")
list 列表
方括號(hào)中婚夫,逗號(hào)分隔浸卦,索引下標(biāo)從0開(kāi)始。類型可變案糙,元素的類型可以不同限嫌,可以包含任意類型的python對(duì)象靴庆。支持嵌套,list里也可以包含一個(gè)list萤皂∪銮睿可原地修改內(nèi)容。
創(chuàng)建一個(gè)空列表:
names = []
names = list()
有序集合
classmate = ['Micherl','Bob','Marry']
len(classmate)裆熙,max(classmate),min(classmate)
classmate[0] classmate[-1] #取值
classmate[1]='Kack' #賦值端礼,不能賦值超過(guò)列表長(zhǎng)度,可以先進(jìn)行初始化入录,再進(jìn)行賦值
del classmate[1] #刪除元素蛤奥,后面元素前移
'Marry' in classmate #in or not in判斷元素是否在列表中
classmate.index('Micherl')
使用+運(yùn)算符可以連接列表
列表的方法
classmate.append('Adam') #追加,返回值并不是新的list,而是none
classmate.count('Bob') #某元素出現(xiàn)次數(shù)
classmate1.extend(classmate2) #將b擴(kuò)展到a后面僚稿,a的列表刷新了
classmate.index('Bob') #值追索引
classmate.insert(1,'Jack') #1至后面的元素集體后移凡桥,插隊(duì)
classmate.pop(1) #退出最后一個(gè)元素,與append類似棧蚀同,后進(jìn)先出
classmate.remove('Bob') #刪除第一個(gè)匹配元素
classmate.reverse #元素反向
sort方法:
x=[1,3,2,6,4]
y=x[:] #不能簡(jiǎn)單的y=x.sort()因?yàn)閟ort方法無(wú)返回值缅刽,也可以使用sorted(x),可以返回排序后的列表
y.sort()
print x
print y
分片
classmate[1:2] 第一個(gè)索引包含在分片內(nèi)蠢络,第二個(gè)索引不包含在分片內(nèi)衰猛,一般第三個(gè)參數(shù)默認(rèn)為1,步長(zhǎng)如果為負(fù)數(shù)刹孔,則從右到左提取元素啡省。
分片賦值 classmate[2:]='a' 相當(dāng)于替換元素
分片刪除 del classmate[2:]
列表可以進(jìn)行相加 print [1,2,3]+[3,4],相同類型才能進(jìn)行相加,如列表和字符串不能進(jìn)行加減
乘法:序列乘以數(shù)值髓霞,則序列會(huì)被重復(fù)數(shù)值次數(shù)卦睹,
空值 None 如果要初始化一個(gè)長(zhǎng)度為10的空序列 seq=[None]*10
檢查一個(gè)值是否在序列中 'Micherl' in classmate 返回布爾值
列表、元組和字典字面量可以在不使用續(xù)行符()的情況下分步多行方库,另外最后一項(xiàng)允許跟一個(gè)逗號(hào)
a = [1,
3,4,
"hello",
]
列表深復(fù)制和淺復(fù)制
淺復(fù)制:
a=[1,2,[3,4]]
b=a
b is a #b和a指向同一個(gè)對(duì)象
del b
print a #刪除b后结序,既刪除b的指向,a無(wú)變化
print b
b=list(a) #創(chuàng)建一個(gè)a的淺復(fù)制
b is a #False
b.append(100) #給b追加一個(gè)元素
print a #a無(wú)變化
print b #b增加了一個(gè)元素
b[2][0]=-100
print a
print b #注意a的變化
c=a
del c[:]
print a
print c
深復(fù)制將創(chuàng)建一個(gè)新的對(duì)象纵潦,并且遞歸復(fù)制它所包含的所有對(duì)象
import copy
a = [1,2,[3,4]]
b = copy.deepcopy(a)
b[2][0] = -100
print a
print b
列表推導(dǎo)式
[expr for iter_var in iterable] :首先迭代iterable里所有的內(nèi)容笼痹,每一次迭代都把iterable中的內(nèi)容放到iter_var中,再在表達(dá)式中應(yīng)用該iter_var的內(nèi)容酪穿,最后用表達(dá)式計(jì)算值生成一個(gè)列表。
[x+1 for x in range(1:11)]
可以這樣理解這個(gè)推導(dǎo)式
new_list=[]
for x in range(1:11)
new_list.append(x+1)
print new_list
[expr for iter_var in iterable if cond_expr] :加入了判斷語(yǔ)句晴裹,只有滿足cond_expr條件的才把iterable丟到iter_var被济,最后用表達(dá)式生成列表
[x+1 for x in range(1:11) if x % 2 == 1]
生成字符串:['the %s' % d for d in xrange(10)]
生成元組:[(x,y) for x in range(2) for y in range(2)]
生成字典:dict([(x,y) for x in range(3) for y in range(3)])
g = {i:j.upper() for i,j in zip(range(1,6),'abcde')}
zip函數(shù)
zip(s,t)函數(shù)將列表s和列表t組成一個(gè)元組列表(s[0],t[0])、(s[1].t[1])等涧团,如果s和t長(zhǎng)度不等只磷,則以短的長(zhǎng)度為止经磅。
zip函數(shù)在python2中會(huì)完全創(chuàng)建一個(gè)元組列表库糠,函數(shù)itertools.izip一次只生成一個(gè)元組眷蜈,性能較好
xrange and range
range:直接生成一個(gè)列表對(duì)象
xrange:生成一個(gè)xrange對(duì)象。當(dāng)需要生成比較大的數(shù)據(jù)攻谁,內(nèi)存比較緊張元媚,xrange比較省內(nèi)存轧叽。xrange一般用在循環(huán)里面,比如只需要操作部分?jǐn)?shù)據(jù)刊棕,而不是返回全部元素來(lái)完成操作的情況
for m in range(1000): #一次性生成1000個(gè)數(shù)字
if m == 10:
print "ss"
break
for m in xrange(1000): #只生成10個(gè)數(shù)字
if m == 10:
print "ss"
break
在python3種xrange()函數(shù)已經(jīng)更名為range()炭晒,并且已經(jīng)刪除了老式range()函數(shù)的功能。
tuple 元組
一旦初始化就不能修改甥角,括號(hào)网严,逗號(hào)分隔。不能原地修改嗤无,不能排序震束。
classmates = ('Michael', 'Bob', 'Tracy')
tuple的陷阱:當(dāng)你定義一個(gè)tuple時(shí),在定義的時(shí)候当犯,tuple的元素就必須被確定下來(lái)垢村,
只有1個(gè)元素的tuple定義時(shí)必須加一個(gè)逗號(hào),防止歧義(以下兩種方式都可以)
t = (1,)
t = 1, #即使沒(méi)有圓括號(hào),python也可以識(shí)別出元組
以下示例看起來(lái)元組被改變了灶壶,查看id發(fā)現(xiàn)元組對(duì)象已經(jīng)被改變了
a = (1,2)
b = list(a)
type(b)
b[0] = 5
a = tuple(b)
print a
type(a)
dict 字典
花括號(hào)肝断,逗號(hào)分隔,key和value使用冒號(hào)分隔驰凛,key唯一胸懈,value不一定唯一.無(wú)序,不能通過(guò)偏移取值恰响∪で可變類型,可嵌套胚宦。
創(chuàng)建一個(gè)空字典
d = {}
d = dict()
組成字典的鍵必須是不可變的數(shù)據(jù)類型首有,比如數(shù)字、字符串枢劝、元組等井联,列表等可變類型不可作為鍵
d = {'Michael': 95,'Bob': 75, 'Tracy': 85} #創(chuàng)建字典
d['Michael']
d['Adam'] = 67 #增加數(shù)據(jù)或者更新數(shù)據(jù)
del d['Michael'] #刪除字典元素
'Thomas' in d #判斷是否存在KEY d.has_key('Thomas')
字典的方法
d.clear() #清空
d.get('Thomas')
d.get('Thomas', -1) #如果不存在Thomas則返回-1
d.pop('Bob') #刪除一個(gè)Key,對(duì)應(yīng)的value也刪除
d.update({'Michael': 99})
d.keys() #返回鍵的列表 等同于list(d)
d.values() #返回值的列表
d.items() #生成一個(gè)字典的容器 [()]
dict函數(shù)
items=[('name','grb'),('age',42)]
d=dict(items) #或者通過(guò)關(guān)鍵字創(chuàng)建 d=dict(name='grb',age=42)
print d
set 集合
set和dict類似您旁,也是一組key的集合烙常,但不存儲(chǔ)value。由于key不能重復(fù)鹤盒,所以蚕脏,在set中侦副,沒(méi)有重復(fù)的key。沒(méi)有順序的概念驼鞭,所以不能切片和索引操作秦驯。
t = set("hello") #創(chuàng)建一個(gè)唯一字符的集合
t
s = set([1, 2, 3])
s
s.add(4) #添加一項(xiàng)
s.update([7,8,9,10]) #添加多項(xiàng)
s.remove(4) #刪除一項(xiàng)
成員操作關(guān)系 in 、not in
交集( & )挣棕、并集( | )译隘、差集( - )、對(duì)稱差集(^)
a = t | s
b = t & s
c = t - s
d = t ^ s #t和s中穴张,但不同是在t和s中
判斷集合是否相等與順序無(wú)關(guān) print set('abc') == set('bac')
列表的去重:
a = [1,2,3,3,4,4,5]
b=list(set(a))
frozenset()不可變集合