[python]-day2

數據類型

數據類型由三部分組成身份(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()不可變集合

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 執(zhí)行過程 首先來說下python的執(zhí)行過程: python解釋器讀取源代碼到內存中 解釋器進行詞法語法檢測 解釋器...
    胖寶寶王閱讀 356評論 0 0
  • http://python.jobbole.com/85231/ 關于專業(yè)技能寫完項目接著寫寫一名3年工作經驗的J...
    燕京博士閱讀 7,792評論 1 118
  • 最近在寫個性化推薦的論文,經常用到Python來處理數據,被pandas和numpy中的數據選取和索引問題繞的比較...
    shuhanrainbow閱讀 4,700評論 6 19
  • Python 是一種相當高級的語言,通過 Python 解釋器把符合語法的程序代碼轉換成 CPU 能夠執(zhí)行的機器碼...
    Python程序媛閱讀 2,037評論 0 3
  • 第三本:《汪曾祺作品自選集》 少年男女之間懵懂的情愫,是這世間最美好的感情之一。漢語現(xiàn)代文學作品里,將這種美好呈現(xiàn)...
    蔡文兵閱讀 447評論 2 4

友情鏈接更多精彩內容