資料型別、字元編碼、檔案處理
阿新 • • 發佈:2019-01-15
一 引子
1 什麼是資料?
x=10,10是我們要儲存的資料
2 為何資料要分不同的型別
資料是用來表示狀態的,不同的狀態就應該用不同的型別的資料去表示
3 資料型別
數字(整形,長整形,浮點型,複數)
字串
位元組串:在介紹字元編碼時介紹位元組bytes型別
列表
元組
字典
集合
4 按照以下幾個點展開資料型別的學習
#======================================基本使用====================================== #1、用途 #2、定義方式 #3、常用操作+內建的方法#======================================該型別總結==================================== #存一個值or存多個值 #有序or無序 #可變or不可變(1、可變:值變,id不變。可變==不可hash 2、不可變:值變,id就變。不可變==可hash)
二 數字
整型與浮點型
#整型int 作用:年紀,等級,身份證號,qq號等整型數字相關 定義: age=10 #本質age=int(10) #浮點型float 作用:薪資,身高,體重,體質引數等浮點數相關 salary=3000.3 #本質salary=float(3000.3) #二進位制,十進位制,八進位制,十六進位制
其他數字型別(瞭解)
#長整形(瞭解) 在python2中(python3中沒有長整形的概念): >>> num=2L >>> type(num) <type 'long'> #複數(瞭解) >>> x=1-2j >>> x.real 1.0 >>> x.imag -2.0
三 字串
#作用:名字,性別,國籍,地址等描述資訊 #定義:在單引號\雙引號\三引號內,由一串字元組成 name='egon' #優先掌握的操作: #1、按索引取值(正向取+反向取) :只能取 #2、切片(顧頭不顧尾,步長) #3、長度len #4、成員運算in和not in #5、移除空白strip #6、切分split #7、迴圈
需要掌握的操作
#1、strip,lstrip,rstrip #2、lower,upper #3、startswith,endswith #4、format的三種玩法 #5、split,rsplit #6、join #7、replace #8、isdigit
#strip name='*egon**' print(name.strip('*')) print(name.lstrip('*')) print(name.rstrip('*')) #lower,upper name='egon' print(name.lower()) print(name.upper()) #startswith,endswith name='alex_SB' print(name.endswith('SB')) print(name.startswith('alex')) #format的三種玩法 res='{} {} {}'.format('egon',18,'male') res='{1} {0} {1}'.format('egon',18,'male') res='{name} {age} {sex}'.format(sex='male',name='egon',age=18) #split name='root:x:0:0::/root:/bin/bash' print(name.split(':')) #預設分隔符為空格 name='C:/a/b/c/d.txt' #只想拿到頂級目錄 print(name.split('/',1)) name='a|b|c' print(name.rsplit('|',1)) #從右開始切分 #join tag=' ' print(tag.join(['egon','say','hello','world'])) #可迭代物件必須都是字串 #replace name='alex say :i have one tesla,my name is alex' print(name.replace('alex','SB',1)) #isdigit:可以判斷bytes和unicode型別,是最常用的用於於判斷字元是否為"數字"的方法 age=input('>>: ') print(age.isdigit())示例
其他操作(瞭解即可)
#1、find,rfind,index,rindex,count #2、center,ljust,rjust,zfill #3、expandtabs #4、captalize,swapcase,title #5、is數字系列 #6、is其他
#find,rfind,index,rindex,count name='egon say hello' print(name.find('o',1,3)) #顧頭不顧尾,找不到則返回-1不會報錯,找到了則顯示索引 # print(name.index('e',2,4)) #同上,但是找不到會報錯 print(name.count('e',1,3)) #顧頭不顧尾,如果不指定範圍則查詢所有 #center,ljust,rjust,zfill name='egon' print(name.center(30,'-')) print(name.ljust(30,'*')) print(name.rjust(30,'*')) print(name.zfill(50)) #用0填充 #expandtabs name='egon\thello' print(name) print(name.expandtabs(1)) #captalize,swapcase,title print(name.capitalize()) #首字母大寫 print(name.swapcase()) #大小寫翻轉 msg='egon say hi' print(msg.title()) #每個單詞的首字母大寫 #is數字系列 #在python3中 num1=b'4' #bytes num2=u'4' #unicode,python3中無需加u就是unicode num3='四' #中文數字 num4='Ⅳ' #羅馬數字 #isdigt:bytes,unicode print(num1.isdigit()) #True print(num2.isdigit()) #True print(num3.isdigit()) #False print(num4.isdigit()) #False #isdecimal:uncicode #bytes型別無isdecimal方法 print(num2.isdecimal()) #True print(num3.isdecimal()) #False print(num4.isdecimal()) #False #isnumberic:unicode,中文數字,羅馬數字 #bytes型別無isnumberic方法 print(num2.isnumeric()) #True print(num3.isnumeric()) #True print(num4.isnumeric()) #True #三者不能判斷浮點數 num5='4.3' print(num5.isdigit()) print(num5.isdecimal()) print(num5.isnumeric()) ''' 總結: 最常用的是isdigit,可以判斷bytes和unicode型別,這也是最常見的數字應用場景 如果要判斷中文數字或羅馬數字,則需要用到isnumeric ''' #is其他 print('===>') name='egon123' print(name.isalnum()) #字串由字母或數字組成 print(name.isalpha()) #字串只由字母組成 print(name.isidentifier()) print(name.islower()) print(name.isupper()) print(name.isspace()) print(name.istitle())示例
練習
# 寫程式碼,有如下變數,請按照要求實現每個功能 (共6分,每小題各0.5分) name = " aleX" # 1) 移除 name 變數對應的值兩邊的空格,並輸出處理結果 # 2) 判斷 name 變數對應的值是否以 "al" 開頭,並輸出結果 # 3) 判斷 name 變數對應的值是否以 "X" 結尾,並輸出結果 # 4) 將 name 變數對應的值中的 “l” 替換為 “p”,並輸出結果 # 5) 將 name 變數對應的值根據 “l” 分割,並輸出結果。 # 6) 將 name 變數對應的值變大寫,並輸出結果 # 7) 將 name 變數對應的值變小寫,並輸出結果 # 8) 請輸出 name 變數對應的值的第 2 個字元? # 9) 請輸出 name 變數對應的值的前 3 個字元? # 10) 請輸出 name 變數對應的值的後 2 個字元? # 11) 請輸出 name 變數對應的值中 “e” 所在索引位置? # 12) 獲取子序列,去掉最後一個字元。如: oldboy 則獲取 oldbo。
# 寫程式碼,有如下變數,請按照要求實現每個功能 (共6分,每小題各0.5分) name = " aleX" # 1) 移除 name 變數對應的值兩邊的空格,並輸出處理結果 name = ' aleX' a=name.strip() print(a) # 2) 判斷 name 變數對應的值是否以 "al" 開頭,並輸出結果 name=' aleX' if name.startswith(name): print(name) else: print('no') # 3) 判斷 name 變數對應的值是否以 "X" 結尾,並輸出結果 name=' aleX' if name.endswith(name): print(name) else: print('no') # 4) 將 name 變數對應的值中的 “l” 替換為 “p”,並輸出結果 name=' aleX' print(name.replace('l','p')) # 5) 將 name 變數對應的值根據 “l” 分割,並輸出結果。 name=' aleX' print(name.split('l')) # 6) 將 name 變數對應的值變大寫,並輸出結果 name=' aleX' print(name.upper()) # 7) 將 name 變數對應的值變小寫,並輸出結果 name=' aleX' print(name.lower()) # 8) 請輸出 name 變數對應的值的第 2 個字元? name=' aleX' print(name[1]) # 9) 請輸出 name 變數對應的值的前 3 個字元? name=' aleX' print(name[:3]) # 10) 請輸出 name 變數對應的值的後 2 個字元? name=' aleX' print(name[-2:]) # 11) 請輸出 name 變數對應的值中 “e” 所在索引位置? name=' aleX' print(name.index('e')) # 12) 獲取子序列,去掉最後一個字元。如: oldboy 則獲取 oldbo。 name=' aleX' a=name[:-1] print(a)View Code
四 列表
#作用:多個裝備,多個愛好,多門課程,多個女朋友等 #定義:[]內可以有多個任意型別的值,逗號分隔 my_girl_friends=['alex','wupeiqi','yuanhao',4,5] #本質my_girl_friends=list([...]) 或 l=list('abc') #優先掌握的操作: #1、按索引存取值(正向存取+反向存取):即可存也可以取 #2、切片(顧頭不顧尾,步長) #3、長度 #4、成員運算in和not in #5、追加 #6、刪除 #7、迴圈
#ps:反向步長 l=[1,2,3,4,5,6] #正向步長 l[0:3:1] #[1, 2, 3] #反向步長 l[2::-1] #[3, 2, 1] #列表翻轉 l[::-1] #[6, 5, 4, 3, 2, 1]
練習:
1. 有列表data=['alex',49,[1900,3,18]],分別取出列表中的名字,年齡,出生的年,月,日賦值給不同的變數 2. 用列表模擬佇列 3. 用列表模擬堆疊 4. 有如下列表,請按照年齡排序(涉及到匿名函式) l=[ {'name':'alex','age':84}, {'name':'oldboy','age':73}, {'name':'egon','age':18}, ] 答案: l.sort(key=lambda item:item['age']) print(l)
五 元組
#作用:存多個值,對比列表來說,元組不可變(是可以當做字典的key的),主要是用來讀 #定義:與列表型別比,只不過[]換成() age=(11,22,33,44,55)本質age=tuple((11,22,33,44,55)) #優先掌握的操作: #1、按索引取值(正向取+反向取):只能取 #2、切片(顧頭不顧尾,步長) #3、長度 #4、成員運算in和not in #5、迴圈
練習
#簡單購物車,要求如下: 實現列印商品詳細資訊,使用者輸入商品名和購買個數,則將商品名,價格,購買個數加入購物列表,如果輸入為空或其他非法輸入則要求使用者重新輸入 msg_dic={ 'apple':10, 'tesla':100000, 'mac':3000, 'lenovo':30000, 'chicken':10, }
msg_dic={ 'apple':10, 'tesla':100000, 'mac':3000, 'lenovo':30000, 'chicken':10, } goods_l=[] while True: for key,item in msg_dic.items(): print('name:{name} price:{price}'.format(price=item,name=key)) choice=input('商品>>: ').strip() if not choice or choice not in msg_dic:continue count=input('購買個數>>: ').strip() if not count.isdigit():continue goods_l.append((choice,msg_dic[choice],count)) print(goods_l)View Code
六 字典
#作用:存多個值,key-value存取,取值速度快 #定義:key必須是不可變型別,value可以是任意型別 info={'name':'egon','age':18,'sex':'male'} #本質info=dict({....}) 或 info=dict(name='egon',age=18,sex='male') 或 info=dict([['name','egon'],('age',18)]) 或 {}.fromkeys(('name','age','sex'),None) #優先掌握的操作: #1、按key存取值:可存可取 #2、長度len #3、成員運算in和not in #4、刪除 #5、鍵keys(),值values(),鍵值對items() #6、迴圈
練習
1 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],將所有大於 66 的值儲存至字典的第一個key中,將小於 66 的值儲存至第二個key的值中 即: {'k1': 大於66的所有值, 'k2': 小於66的所有值}
a={'k1':[],'k2':[]} c=[11,22,33,44,55,66,77,88,99,90] for i in c: if i>66: a['k1'].append(i) else: a['k2'].append(i) print(a)View Code
2 統計s='hello alex alex say hello sb sb'中每個單詞的個數 結果如:{'hello': 2, 'alex': 2, 'say': 1, 'sb': 2}
s='hello alex alex say hello sb sb' l=s.split() dic={} for item in l: if item in dic: dic[item]+=1 else: dic[item]=1 print(dic)View Code
s='hello alex alex say hello sb sb' dic={} words=s.split() print(words) for word in words: #word='alex' dic[word]=s.count(word) print(dic) #利用setdefault解決重複賦值 ''' setdefault的功能 1:key存在,則不賦值,key不存在則設定預設值 2:key存在,返回的是key對應的已有的值,key不存在,返回的則是要設定的預設值 d={} print(d.setdefault('a',1)) #返回1 d={'a':2222} print(d.setdefault('a',1)) #返回2222 ''' s='hello alex alex say hello sb sb' dic={} words=s.split() for word in words: #word='alex' dic.setdefault(word,s.count(word)) print(dic) #利用集合,去掉重複,減少迴圈次數 s='hello alex alex say hello sb sb' dic={} words=s.split() words_set=set(words) for word in words_set: dic[word]=s.count(word) print(dic)其他做法(重點看setdefault的用法)
七 集合
#作用:去重,關係運算, #定義: 知識點回顧 可變型別是不可hash型別 不可變型別是可hash型別 #定義集合: 集合:可以包含多個元素,用逗號分割, 集合的元素遵循三個原則: 1:每個元素必須是不可變型別(可hash,可作為字典的key) 2:沒有重複的元素 3:無序 注意集合的目的是將不同的值存放到一起,不同的集合間用來做關係運算,無需糾結於集合中單個值 #優先掌握的操作: #1、長度len #2、成員運算in和not in #3、|合集 #4、&交集 #5、-差集 #6、^對稱差集 #7、== #8、父集:>,>=
#9、子集:<,<=
練習
一.關係運算 有如下兩個集合,pythons是報名python課程的學員名字集合,linuxs是報名linux課程的學員名字集合 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} 1. 求出即報名python又報名linux課程的學員名字集合 2. 求出所有報名的學生名字集合 3. 求出只報名python課程的學員名字 4. 求出沒有同時這兩門課程的學員名字集合
# 有如下兩個集合,pythons是報名python課程的學員名字集合,linuxs是報名linux課程的學員名字集合 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} # 求出即報名python又報名linux課程的學員名字集合 print(pythons & linuxs) # 求出所有報名的學生名字集合 print(pythons | linuxs) # 求出只報名python課程的學員名字 print(pythons - linuxs) # 求出沒有同時這兩門課程的學員名字集合 print(pythons ^ linuxs)View Code
二.去重 1. 有列表l=['a','b',1,'a','a'],列表元素均為可hash型別,去重,得到新列表,且新列表無需保持列表原來的順序 2.在上題的基礎上,儲存列表原來的順序 3.去除檔案中重複的行,肯定要保持檔案內容的順序不變 4.有如下列表,列表元素為不可hash型別,去重,得到新列表,且新列表一定要保持列表原來的順序 l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ]
#去重,無需保持原來的順序 l=['a','b',1,'a','a'] print(set(l)) #去重,並保持原來的順序 #方法一: