Python學習之路基礎篇--07Python基礎+編碼、集合 和 深淺Copy

1 小數據池(節省內存)python

  只有數字和字符串中內存,儲存在同一個內存地址中app

  數字的範圍在-5~256中,字符串有如下兩個特色:不能含有特殊字符,還有就s*20 不是同一個地址,而要*21就不是了編碼

2 編碼spa

  ASCii 中    英文用 8 位 ,一個字節code

  unicode 中    英文用 32 位 ,四個字節  中文用 32 位 ,四個字節blog

  utf-8 中    英文用 8 位 ,一個字節  中文用 24 位 ,三個字節內存

  gbk 中    英文用 8 位 ,一個字節  中文用 16 位 ,二個字節utf-8

 

  特色:  各個編碼之間的二進制,是不能互相識別,會產生亂碼ci

       文件的儲存和傳輸,不能使用unicode(太大了),而使用utf-八、utf-1六、gbk2312和ascii等unicode

  在python3中,str在內存中是用unicode編碼的

  bytes 類型:

    對於英文str

      表現形式: s = 'eli'

      編碼方式:unicode

    對於英文bytes

      表現形式: s = b'eli'

      編碼方式:utf-8 或 gbk

    

    對於中文str

      表現形式: s = '中國'

      編碼方式:unicode

    對於中文bytes

      表現形式: s = b'x\e34\e34\e23\e23\e23\12'  (有6個字節,故轉成了utf-8的形式)

      編碼方式:utf-8 或 gbk

   用encode 編碼,將str 轉化成 bytes 類型   

s1 = 'eli'
s1 = s1.encode('utf-8')    #b'eli'

2 關於字典和列表的小知識

#刪除偶數位的數
# 1 切片
lis = [11, 22, 33, 44, 55, 66]
lis = lis[::2]print(lis)
# 2 先取一個新列表,而後替換下便可
l1 = []
for i in lis:
    if lis.index(i) % 2 == 0 :
        l1.append(i)
lis = l1
print(lis)

dic = dict.fromkeys([1,2,3],'春哥')print(dic)
dic = dict.fromkeys([1,2,3],[])
print(dic)  # {1: [], 2: [], 3: []}
dic[2].append('袁姐')  #由於沒有序號,因此添加, 就全部都添加的
print(dic)
dic[2].extend('二哥')  #迭代式添加print(dic)
# 重要的一點,在循環列表和字典的時候,不能刪除其元素,若是刪除就會報錯

  0、[]、{}、()、'' 和 set() 轉化成bool值 都是False

3 元組

 若是是單個元素在元組之中,以沒有逗號,本來什麼樣的數據類型,就是什麼樣的 

tu1 = (1)
tu2 = (1,)
print(tu1,type(tu1))
print(tu2,type(tu2))

4 集合

  是可變的數據類型,其中的元素是不可變的數據類型,無序且不重複(能夠用於去重)

#建立
 set1 = set({1,3,'barry'})
 set2 = {1,2 ,'barry'}
 print(set1)
 print(set2)

#
 set1 = {'tom', 'eli', 'sofile', 'jay'}
 set1.add('ALEX')
 set1.update('shuai') #迭代增長
 print(set1)

#
 set1 = {'tom', 'eli', 'sofile', 'jay'}
 set1.remove('jay')  #按元素刪除,沒有報錯
 set1.pop()  #隨機刪除
 set1.clear()    #清除集合
 del set1    #刪除集合
#print(set1)

# 交集(&  intersection)
set1 = {1, 2, 3, 4, }
set2 = {3, 4, 5, 6, }
print(set1 & set2)
print(set1.intersection(set2))

# 並集 (\ union)
print(set1 | set2)  # {1, 2, 3, 4, 5, 6}
print(set2.union(set1))  # {1, 2, 3, 4, 5, 6}

# 差集 (- difference)
print(set1 - set2)  # {1, 2,}
print(set1.difference(set2))  # {1, 2}

# 反交集(^  symmetric_difference)
print(set1 ^ set2)  # {1, 2, 6, 7}
print(set1.symmetric_difference(set2))  # {1, 2, 6, 7}

 # 子集和超集
print(set1 < set2)
print(set1.issubset(set2))  # 這兩個相同,都是說明set1是set2子集。

print(set2 > set1)
print(set2.issuperset(set1))  # 這兩個相同,都是說明set2是set1超集。

# frozenset 把集合變成不變類型
s = frozenset('barry')
print(s,type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>

5 深淺Copy

  賦值的過程,只是將一個的內存地址 賦給另一個,只是指向同一個內存地址,若改變其值,並不會使另外一個改變,由於其的內存地址併爲改變

a = 1
b = a
print(a, b )
b = 2
print(a, b)

  對於列表來講,賦值這行爲比做,使兩個東西同時指向同一個杯子, 而水是共享的,當你改變杯子裏面的水,兩個值都會發生變化 

  當你使用copy 方法時,把這個杯子給copy下來,有一樣的內存地址,當你改變其中的項時,改變的其時是那個項所指的內存地址,另外一個杯子,並無改變,相互獨立

al = [1,1,1,[22,33]]
bl = al.copy()
print(al,bl )
al[2] = 99
print(al,bl)
print(id(al[2]),id(bl[2]))

  然而出現嵌套的狀況,就是杯子中還有小杯子,小杯子裏的水,是共享的,因此一個改變,另外一個也跟着變化(淺copy)

  深copy 就是要 import copy 

  而後再進行copy ,,這樣就是全部都複製

相關文章
相關標籤/搜索