數據類型
數據類型由三部分組成身份(id)、類型(type)、值。
看對象有沒有改變使用id(object)查看對象的內存地址是否改變。
def compare(a,b):
if a is b: #a和b是同一個對象
statements
if a == b: #a和b具有相同的值
statements
if type(a) =type(b): #a和b具有相同的類型
statements
python能直接處理的數據類型有以下幾種(type)
數值number:整數int,長整型long,浮點數float #python3中l(wèi)ong不存在,int可以存儲64位整數
布爾值bool:True、False #注意大小寫,在與數值運算時,True的值為1,F(xiàn)alse的值為0
空值:None
字符串:str
線性容器:list,tuple #支持迭代,字符串也是一種線性容器
Hash容器:dict,set
如果對象的值是可以修改的,則稱為可變對象(mutable),否則成為不可變對象(immutable)。
可以進行對象類型和值的對比。其他比較操作符也支持>、<、>=、<=、!=、==,邏輯操作符and、or、not
數值
查看int對象所具有的方法:help(int),dir(int),int.doc
bit_length(Number of bits necessary to represent self in binary.返回表示該數字的時占用的最少位數)
a = 1
print a.bit_length()
二進制符號
位移 >> <<
x << y \ x >> y #左移(補0)和右移(切尾)是基于二進制的一種算法 >>、 <<,使用bin函數查看二進制
x << y == x * ( 2 ** y )
可用于計算硬盤容量,比如 1024 >> 10按位與 &
二進制靠右對齊,不足補0,比較位置都是1則返回1,其他位返回0
可用于奇偶數判斷,數值與1進行&運算,返回0則為偶數,返回1則為奇數:5 & 1 == 1按位或 |
二進制靠右對齊,不足補0,比較位置只要有1,則返回1按位異或 ^
比較位相異返回1,相同返回0-
按位取反 ~
?
字符串
python默認ascii碼。使用單引號和雙引號效果一樣。
跟C語言類似,可以使用\進行轉義:\n換行,\t制表符,\r回車符,\0空值(Null)
如果長字符串需要跨越多行,有如下三種方法:
- 使用'''xxxxxxxx'''代替普通引號
- 使用三個"""xxxxxxxx"""
- 在每行最后加上\將換行符轉義。
原始字符串:如果在字符串前加上r,即輸出引號中原始字符串 print r'let's go!',不能在原始字符串尾部輸入\,除非對其進行轉義
字符串的索引:a[0],字符串偏移量從0開始,最后一位從-1開始。字符串的值不可原地改變。
+為字符串的拼接,*為字符串的重復
查看字符串具有的方法:help(str),dir(str)
count(self, sub, start=None, end=None):用于統(tǒng)計字符串里某個字符出現(xiàn)的次數,可選參數為在字符串搜索的開始與結束位置。sub –> 搜索的子字符串,start –> 字符串開始搜索的位置。默認為第一個字符,第一個字符索引值為0。end –> 字符串中結束搜索的位置。字符中第一個字符的索引為 0。默認為字符串的最后一個位置。
decode(self, encoding=None, errors=None):解碼,對于len在處理漢字的時候因為返回的是字節(jié)數目導致結果不符,可以使用decode轉碼,或者len(u"哈哈")
encode(self, encoding=None, errors=None):編碼,針對unicode
find(self, sub, start=None, end=None):檢測字符串中是否包含子字符串str,如果指定beg(開始)和end(結束)范圍,則檢查是否包含在指定范圍內,如果包含子字符串返回開始的索引值,否則返回-1。
isalnum(self):法檢測字符串是否由字母和數字組成,如果string至少有一個字符并且所有字符都是字母或數字則返回True,否則返回False
isalpha(self):
split: S.split([sep [,maxsplit]]) -> list of strings返回一個list
join:
replace:
translate:
示例:打印出字符串中的字符及其位置
a = 'shsh'
for i in range(len(a)):
print '(%d)' % i,a[i]
也可以使用enumerate()函數:
a = 'shsh'
for i,ch in enumerate(a):
print '(%d)' % i,ch
示例:取出字符串中的數字
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函數用于將值轉化為適用于人閱讀的形式,相當于to string
repr函數轉化為供解釋器讀取的形式,創(chuàng)建一個合法的字符串表示值,repr(x)等同x
print '1+2='+1+2
字符串格式化format
在Python中,采用的格式化方式和C語言是一致的,用%實現(xiàn);
有幾個%?,后面就跟幾個變量,順序需要一致(只有一個變量的時候,括號可以省略);如果不太確認用什么,可以直接使用%s將任何數據類型轉換為字符串;
字符串里含%可用%%進行轉義,來表示一個%;
可以在"%"和字母之間插進數字表示最大場寬。 例如: %3d 表示輸出3位整型數, 不夠3位右對齊。 %9.2f 表示輸出場寬為9的浮點數, 其中小數位為2, 整數位為6, 小數點占一位, 不夠9位右對齊。
%d 整數 :print "1+1 = %d " % int(1+1)
%f 浮點數
%s 字符串 : print "my name is %s lilei" % "hanmeimei's"
%x 十六進制整數
'%s is a %s' % ('he','boy')
字典形式的字符串的格式化更加靈活,注意花括號的位置
'%(who)s is a %(gender)s' %{'who':'he','gender':'boy'}
"this is {whose} {fruit}" .format (fruit = "apple" , whose = "my")
list 列表
方括號中,逗號分隔,索引下標從0開始。類型可變,元素的類型可以不同,可以包含任意類型的python對象。支持嵌套,list里也可以包含一個list??稍匦薷膬热荨?/p>
創(chuàng)建一個空列表:
names = []
names = list()
有序集合
classmate = ['Micherl','Bob','Marry']
len(classmate),max(classmate),min(classmate)
classmate[0] classmate[-1] #取值
classmate[1]='Kack' #賦值,不能賦值超過列表長度,可以先進行初始化,再進行賦值
del classmate[1] #刪除元素,后面元素前移
'Marry' in classmate #in or not in判斷元素是否在列表中
classmate.index('Micherl')
使用+運算符可以連接列表
列表的方法
classmate.append('Adam') #追加,返回值并不是新的list,而是none
classmate.count('Bob') #某元素出現(xiàn)次數
classmate1.extend(classmate2) #將b擴展到a后面,a的列表刷新了
classmate.index('Bob') #值追索引
classmate.insert(1,'Jack') #1至后面的元素集體后移,插隊
classmate.pop(1) #退出最后一個元素,與append類似棧,后進先出
classmate.remove('Bob') #刪除第一個匹配元素
classmate.reverse #元素反向
sort方法:
x=[1,3,2,6,4]
y=x[:] #不能簡單的y=x.sort()因為sort方法無返回值,也可以使用sorted(x),可以返回排序后的列表
y.sort()
print x
print y
分片
classmate[1:2] 第一個索引包含在分片內,第二個索引不包含在分片內,一般第三個參數默認為1,步長如果為負數,則從右到左提取元素。
分片賦值 classmate[2:]='a' 相當于替換元素
分片刪除 del classmate[2:]
列表可以進行相加 print [1,2,3]+[3,4],相同類型才能進行相加,如列表和字符串不能進行加減
乘法:序列乘以數值,則序列會被重復數值次數,
空值 None 如果要初始化一個長度為10的空序列 seq=[None]*10
檢查一個值是否在序列中 'Micherl' in classmate 返回布爾值
列表、元組和字典字面量可以在不使用續(xù)行符()的情況下分步多行,另外最后一項允許跟一個逗號
a = [1,
3,4,
"hello",
]
列表深復制和淺復制
淺復制:
a=[1,2,[3,4]]
b=a
b is a #b和a指向同一個對象
del b
print a #刪除b后,既刪除b的指向,a無變化
print b
b=list(a) #創(chuàng)建一個a的淺復制
b is a #False
b.append(100) #給b追加一個元素
print a #a無變化
print b #b增加了一個元素
b[2][0]=-100
print a
print b #注意a的變化
c=a
del c[:]
print a
print c
深復制將創(chuàng)建一個新的對象,并且遞歸復制它所包含的所有對象
import copy
a = [1,2,[3,4]]
b = copy.deepcopy(a)
b[2][0] = -100
print a
print b
列表推導式
[expr for iter_var in iterable] :首先迭代iterable里所有的內容,每一次迭代都把iterable中的內容放到iter_var中,再在表達式中應用該iter_var的內容,最后用表達式計算值生成一個列表。
[x+1 for x in range(1:11)]
可以這樣理解這個推導式
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] :加入了判斷語句,只有滿足cond_expr條件的才把iterable丟到iter_var,最后用表達式生成列表
[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函數
zip(s,t)函數將列表s和列表t組成一個元組列表(s[0],t[0])、(s[1].t[1])等,如果s和t長度不等,則以短的長度為止。
zip函數在python2中會完全創(chuàng)建一個元組列表,函數itertools.izip一次只生成一個元組,性能較好
xrange and range
range:直接生成一個列表對象
xrange:生成一個xrange對象。當需要生成比較大的數據,內存比較緊張,xrange比較省內存。xrange一般用在循環(huán)里面,比如只需要操作部分數據,而不是返回全部元素來完成操作的情況
for m in range(1000): #一次性生成1000個數字
if m == 10:
print "ss"
break
for m in xrange(1000): #只生成10個數字
if m == 10:
print "ss"
break
在python3種xrange()函數已經更名為range(),并且已經刪除了老式range()函數的功能。
tuple 元組
一旦初始化就不能修改,括號,逗號分隔。不能原地修改,不能排序。
classmates = ('Michael', 'Bob', 'Tracy')
tuple的陷阱:當你定義一個tuple時,在定義的時候,tuple的元素就必須被確定下來,
只有1個元素的tuple定義時必須加一個逗號,防止歧義(以下兩種方式都可以)
t = (1,)
t = 1, #即使沒有圓括號,python也可以識別出元組
以下示例看起來元組被改變了,查看id發(fā)現(xiàn)元組對象已經被改變了
a = (1,2)
b = list(a)
type(b)
b[0] = 5
a = tuple(b)
print a
type(a)
dict 字典
花括號,逗號分隔,key和value使用冒號分隔,key唯一,value不一定唯一.無序,不能通過偏移取值??勺冾愋停汕短?。
創(chuàng)建一個空字典
d = {}
d = dict()
組成字典的鍵必須是不可變的數據類型,比如數字、字符串、元組等,列表等可變類型不可作為鍵
d = {'Michael': 95,'Bob': 75, 'Tracy': 85} #創(chuàng)建字典
d['Michael']
d['Adam'] = 67 #增加數據或者更新數據
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') #刪除一個Key,對應的value也刪除
d.update({'Michael': 99})
d.keys() #返回鍵的列表 等同于list(d)
d.values() #返回值的列表
d.items() #生成一個字典的容器 [()]
dict函數
items=[('name','grb'),('age',42)]
d=dict(items) #或者通過關鍵字創(chuàng)建 d=dict(name='grb',age=42)
print d
set 集合
set和dict類似,也是一組key的集合,但不存儲value。由于key不能重復,所以,在set中,沒有重復的key。沒有順序的概念,所以不能切片和索引操作。
t = set("hello") #創(chuàng)建一個唯一字符的集合
t
s = set([1, 2, 3])
s
s.add(4) #添加一項
s.update([7,8,9,10]) #添加多項
s.remove(4) #刪除一項
成員操作關系 in 、not in
交集( & )、并集( | )、差集( - )、對稱差集(^)
a = t | s
b = t & s
c = t - s
d = t ^ s #t和s中,但不同是在t和s中
判斷集合是否相等與順序無關 print set('abc') == set('bac')
列表的去重:
a = [1,2,3,3,4,4,5]
b=list(set(a))
frozenset()不可變集合