python基礎學習day7

基礎數據類型的補充;編碼的進階

  • strpython

    • capitalize() 首字母(第一個單詞)大寫,其他變小寫api

      s1 = 'I LIVE YOU'
      print(s1.capitalize())
      >>>I live you
    • title() 每一個單詞的首字母大寫。(以特殊字符(非字母)隔開的即爲一個單詞)網絡

      s1 = 'I LIVE YOU'
      print(s1.title())
      >>>I Live You
    • swapcase() 大小寫反轉數據結構

      s1 = 'I love YOU'
      print(s1.swapcase())
      >>>i LOVE you
    • center() 居中,有1個必選參數:寬度,一個非必選參數:填充)app

      s1 = 'I'
      print(s1.center(10,'%'))
      >>>%%%%I%%%%%
    • find() 經過元素找索引,找到第一個就返回,找不到返回-1。編碼

      s1 = 'I love you'
      print(s1.find('o'))
      >>>3
    • index() 經過元素找索引,找到第一個就返回,找不到就報錯。code

  • tuple對象

    • 特殊性:元祖中只有一個元素,而且沒有’,‘,則它不是元祖,它與括號中的數據類型一致排序

      tu0 = (1,2)
      print(tu0,type(tu0))
      >>>(1, 2) <class 'tuple'>
      
      tu1 = (1)
      print(tu1,type(tu1))
      >>>1 <class 'int'>
      
      tu2 = ([1])
      print(tu2,type(tu2))
      >>>[1] <class 'list'>
      
      tu3 = (1,)
      print(tu3,type(tu3))
      >>>(1, ) <class 'tuple'>
    • count() 計數索引

      tu = (1,2,3,3,3,3)
      print(tu.count())
      >>>4
    • index() 找索引

      tu = ['a','b','a']
      print(tu.index('a'))
      >>>0
  • list

    • index() 經過元素找索引

      l1 = ['a','b','a']
      print(l1.index('a'))
      >>>0
    • sort() 默認從小到大排序,設置reverse參數則可從小到大

      l1 = [3,2,1,4]
      l1.sort()
      print(l1)
      >>>[1,2,3,4]
      
      l1.sort(reverse=True)
      print(l1)
      >>>[4,3,2,1]
    • reverse() 反轉

      l1 = [2,1,3,0]
      l1.reverse()
      print(l1)
      >>>[0,3,1,2]
    • 列表相加 (3.4以上版本)

      l1 = [1,2,3]
      l2 = [3,4,5]
      print(l1+l2)
      >>>[1, 2, 3, 3, 4, 5]
    • 列表與數字相乘 (3.4以上版本)

      l1 = [2,'a',[1,'b']]
      l2 = l1*3
      print(l2)
      >>>[2, 'a', [1, 'b'], 2, 'a', [1, 'b'], 2, 'a', [1, 'b']]
    • 列表的特殊性:正向循環一個列表時若是刪除某個元素,那麼這個元素後面的全部元素都會向前進一位,它們的索引相比以前也會前進一位,所以,在循環一個列表時的過程當中,若是要改變列表的大小(增長值或者刪除值),那麼結果極可能會出錯或者報錯。

      l1 = [1,2,3,4,5,6]  #刪除列表中索引位爲偶數的元素。
      for i in range(0,len(l1),2):
      	l1.pop(i)
      print(l1)
      >>>IndexError: pop index out of range
      • 解決此問題有三種方式

        1.直接刪除 (按照元素刪除,按照索引刪除,切片加步長

        #切片加步長
        l1 = [1,2,3,4,5,6]
        del l1[1::2]
        print(l1)

        2.倒敘刪除

        l1 = [1,2,3,4,5,6]
        for i in range(len(l1)-1,-1,-2): 
        	l1.pop(i)   
        print(l1)
        >>>[1,3,5]
        
        #不能用如下代碼;請自測
        l1 = [1,2,3,4,5,6]
        for i in range(1,len(l1),2):
            l1.pop(-i)

        3.思惟轉換

        l1 = [1,2,3,4,5,6]
        l2 = []
        for i in range(0,len(l1),2): 
        	l2.append(l1[i])
        l1 = l2
        print(l1)
  • dict

    • popitem 3.5版本以前,隨機刪除,3.6版本以後,刪除最後一個,有返回值。 請自測。

    • update

      dic0 = {1:'i'}
      dic0.update(2='love',hobby='python')  #增長鍵值對
      print(dic0)
      >>>{1: 'i', 2: 'love', 'hobby': 'python'}
      
      dic0.update(1 = '太陽') #改鍵值對
      print(dic0)
      >>>{1: '太陽', 2: 'love', 'hobby': 'python'}
      
      dic1 = {}
      dic1.update([(1,'a'),(2,'b'),(3,'c')])
      print(dic1)
      >>>{1: 'a', 2: 'b', 3: 'c'}
      
      dic0.update(dic1)
      print(dic0)   #有則覆蓋,無則增長
      >>>{1: 'a', 2: 'b', 'hobby': 'python', 3: 'c'}
      print(dic1)
      >>>{1: 'a', 2: 'b', 3: 'c'}
    • fromkeys() 第一個參數必須爲可迭代對象,可迭代的對象共用第二個參數(id相同)。

      dic = dict.fromkeys('abc',1)     
      print(dic)
      >>>{'a': 1, 'b': 1, 'c': 1}
      
      dic = dict.fromkeys([1,2,3],[])
      print(dic)
      >>>{1: [], 2: [], 3: []}
      dic[1].append('a')
      print(dic)
      >>>{1: ['a'], 2: ['a'], 3: ['a']}
    • 小題試作:(循環一個字典時,若果改變字典的大小則或報錯。)

      #將字典dic中的以‘k’開頭的鍵值對刪除
      dic = {'k1':'a','k2':'b','k3':'c','a':'d'}
      l1 = []
      for key in dic:
          if key.startswith('k'):
              l1.append(key)
      for i in l1:
          dic.pop(i)
      print(dic)
      >>>{'a':'d'}
      
      
      #改進
      for key in list(dic.keys()):   #將其轉換爲一個列表,若不加list則回報錯。
          if 'k' in key:
              dic.pop(key)
      print(dic)
      >>>{'a','d'}
  • 數據之間類型的轉換:

    • int bool str 三者轉換

    • str list 二者轉換

    • list set 二者轉換

    • str bytes 二者轉換

    • 全部數據均可以轉換成bool值:

      轉換成bool值爲False的數據類型有:

      '',0,(),{},[],set(),None
  • 基礎數據結構類型的總結

    • 按照儲存空間的佔用分(從低到高)
      • int
      • str
      • set : 無序
      • tuple: 有序,不可變
      • list: 有序,可變
      • dict: 有序(3.6版本以後),可變
  • 編碼的進階:

    • 不一樣的編碼方式之間不能相互識別

    • 數據在內存中所有是以Unicode編碼的,可是當數據用於網絡傳輸或者存儲到硬盤中,必須是以非Unicode編碼(utf-八、gbk等)

    • python中的數據從內存(Unicode編碼)存儲到硬盤或進行網絡傳輸時要經歷一個特殊的轉化過程,要轉化爲一個非Unicode編碼類型的特殊數據才能進行傳輸或儲存至硬盤,即bytes類型(內存中的編碼方式:非Unicode)

      • bytes與str的操做方式大部分都是同樣的
      • bytes can only contain ASCII literal characters,手動將中文字符串轉化爲bytes類型會報錯,要通過特殊的轉化
      #str轉bytes:
      a = b'iloveyou'
      print(a,type(a))
      >>>b'iloveyou' <class 'bytes'>
      
      #將中文轉化爲bytes類型:
      b = b'山就在那兒'
      print(b)
      >>>SyntaxError: bytes can only contain ASCII literal characters
      #正確方法爲:
      
      c = '山就在那兒'
      b = c.encode('utf-8')
      print(b)   #or print(c.encode('utf-8'))    #通常指定utf-8的編碼形式,   (encode:編碼)
      >>>b'\xe5\xb1\xb1\xe5\xb0\xb1\xe5\x9c\xa8\xe9\x82\xa3\xe5\x84\xbf'
      • bytes可轉化爲字符串類型(Unicode)(decode,解碼)。用什麼編碼類型轉換爲bytes數據類型的就用什麼解碼。

        b = b'\xe5\xb1\xb1\xe5\xb0\xb1\xe5\x9c\xa8\xe9\x82\xa3\xe5\x84\xbf'
        c = b.decode('utf-8')    or print(b.decode('utf-8'))
        print(c)
        >>>山就在那兒
        
        #用什麼編碼類型轉換爲bytes數據類型的就用什麼解碼。
        b = b'\xe5\xb1\xb1\xe5\xb0\xb1\xe5\x9c\xa8\xe9\x82\xa3\xe5\x84\xbf'
        c = b.decode('gbk')    
        print(c)
        >>>UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 14: incomplete multibyte sequence
  • 小題試作:gbk轉換爲utf-8

    #分析,全部的編碼都與Unicode有關(計算機內存中以Unicode編碼),所以可先將gbk轉換爲Unicode編碼,再轉換爲utf-8編碼。
    
    gbk = b'\xc9\xbd\xbe\xcd\xd4\xda\xc4\xc7\xb6\xf9'
    decode1 = gbk.decode('gbk')    #解碼爲Unicode編碼的字符串,可print(decode1)查看。
    print(decode1.encode('utf-8'))  #以utf-8編碼
    >>>b'\xe5\xb1\xb1\xe5\xb0\xb1\xe5\x9c\xa8\xe9\x82\xa3\xe5\x84\xbf'

相關文章
相關標籤/搜索