1. 程式人生 > >資料型別、字元編碼、檔案處理

資料型別、字元編碼、檔案處理

一 引子

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))

#去重,並保持原來的順序
#方法一: