python基礎之 數據類型的補充,小數據類型

1.id is詳解html

ID
  在Python中,id是什麼?id是內存地址,好比你利用id()內置函數去查詢一個數據的內存地址:     name
= 'nba'     print(id(name)) # 1585831283968
IS
  is 又是什麼那? == 是什麼意思是那?
  

   is(身份運算)指的兩邊的內存地址是否相等,也就是是不是同一個地址 ==指的兩邊的數值是否相等python

  因此:若是內存地址相等,那數值必定相等若是數值相等,內存地址不必定相等c#

2.代碼塊緩存

在python中一切都是對象
Python的程序是由代碼塊構形成的。塊是python程序的一個文本,他是一個能執行的一個單元
python中的代碼塊:一個函數,一個模塊,一個類,一個文件都是代碼塊,而在交互式方式輸入的每條語句都是一個代碼塊。

那代碼塊和小數據池有什麼關係那?

代碼塊的緩存機制:
 
 在python執行同一個代碼塊下的初始化對象命令時(能夠理解爲c#中的初始化字符串),會檢查該值是否存在(默認在一個字典那種去檢查),若是該變量和值存在默認要檢查的字典中,就從新使用該值
  若是不存在,就在字典中建立該變量與值相對的映射,存入到字典當中,方便之後繼續調用。
  因此同一個代碼塊中i1=1000,i2=1000,指向的時同一個1000,即:要使用同一代碼塊的緩存機制,因此i1和i2指向的內存地址相同,數值也相同

代碼塊緩存機機制的適用範圍:
  int(float):任何數字在同一代碼塊都複用
  bool:True和False在內存中都以1或0表示,複用
  str:幾乎全部的字符串都符合
    1.非乘法獲得的字符都知足代碼塊的緩存機制
    2.乘法獲得的爲兩種:
      1.乘數爲1的任何字符串都知足代碼塊的緩存機制
      2.乘數>=2時:僅含大小寫字母,數字,下劃線,總長度<=20,知足代碼塊的緩存機制
  trple():空元組
  None:
代碼塊緩存機制的優勢:
  1.節省內存空間
  2.提高python性能

============================================================================================================================
小數據池
  
也稱做小整數緩存機制,或稱爲駐留機制等等
  小數據池是針對不一樣代碼塊之間的緩存機制
小數據池緩存機制:
  
小數據池緩存機制使用的不一樣的代碼塊中,在內存中開闢兩個內存地址:
    一個空間:-5-256
    一個空間:必定規則的字符串(相乘不超過20,且乘數的是1)
小數據池適用範圍

  int(整數):python自動將-5-256之間的整數進行緩存(放在一個池中,多是字典,或其餘容器),當你把整數賦值給變量時,並不會直接建立對象,而是在內存中使用已經建立好的緩存對象
  bool:就是True,False,不管你建立多少個變量指向True,False,那麼他在內存中只存在一個1或0
  str:
    1.字符串的長度爲0或者1,默認都採用了駐留機制(小數據池)
    2.字符串的長度>1,且只含有大小寫字母,數字,下劃線時,纔會默認駐留

    3,用乘法獲得的字符串,分兩種狀況。
      1.乘數爲1時,僅含大小寫字母,數字,下劃線,默認駐留含其餘字符,長度<=1,默認駐留含其餘字符,長度>1,默認駐留。
      2.乘數>=2時,僅含大小寫字母,數字,下劃線,總長度<=20,默認駐留。
小數據池的優勢:
  1.節省內存空間
  2.提高python性能

重點: 
若是在同一代碼塊下,則採用同一代碼塊下的換緩存機制。 若是是不一樣代碼塊,則採用小數據池的駐留機制。

驗證1:

 驗證2:app

 

 3.基礎數據類型之間的轉換函數

1.int bool str三者之間能夠進行轉換
2.bool能夠與全部的數據類型進行轉換,全部爲空的數據類型轉換成bool都是false
3.字符串<--->列表
  str--->list li=str.spilt()
  list--->str str='.'.join(list) #其中list裏面的元素必須都是字符串類型

4.字符串<--->元組
  str--->tuple tu =str1.partition('b') #b是字符串中一個字符
  tuple--->str str='.'.join(tu)

5.列表<-->元組
  list<--->tuple
    tuple(list)或者list(tuple)
6.字典<--->列表
  dict--->list list(dict) #列表中的元素是字典裏面的鍵值

other:
  1.若是元組中只有單個元素,並期沒有','逗號的時候,那麼打印出來的類型爲元素自己
   tu = (123)
   print(tu,type(tu))
  
  2.字典的formkeys()方法:用於建立一個新字典,以序列 seq 中元素作字典的鍵,value 爲字典全部鍵對應的初始值。 dict.formkeys(seq,[,value]),鍵值必須爲可迭代類型
    坑: 若是你的值是一個可變的數據類型, 他在內存中是一個id相同的內存地址。
    dic = dict.fromkeys('abcd',[])
    dic['a'].append(666)
    dic['b'].append(111)
    dic['c'].append(222)
    print(dic)

4.set集合操做性能

set:是字典的閹割版,沒有值的鍵
rar文件
set的做用:
  1.列表去重
  2.關係測試

set是無序列,可是在數字1-21之間的數字,在集合中從小到大的排序

 

5.拓展測試

拓展一spa

# 將此列表索引爲奇數位對應的元素所有刪除.
l1 = [11, 22, 33, 44, 55]

#方法一:經過del函數的切片加步長的方式刪除
  del li[1::2]
  print(li)

#方法二:錯誤案例
  for item in range(len(li)):
    item % 2 ==1:
      ll.pop(item)
  print(li) ---> [11,33,44]
  此方法從思路上來說是正確的,range(len(li))根據"顧頭不顧腚"原則能生成從0-5(0,1,2,3,4)五個元素,而後判斷爲奇數的,而後根據pop(索引)的方法來刪除奇數索引。
  但其實裏面的一個坑在於:若是咱們從前向後刪除第一個爲奇數索引以後,這個索引就消失了了,還剩下0 2 3 4四個索引,可是根據列表的特性,中間不能出現斷裂的索引,也就是說,索引必須是連續的。
  因此索引2 3 4 會向前補充,因此就會漏掉一部分索引,從而致使刪除的結果不對。

#正確的刪除方式:
    1.在for循環裏面不要對列表的大小進行改變(刪除,增長元素等操做),可能會影響到後續最終結果
      li1=[]
      for item in range(len(li)):
        if item % 2 ==0:
          li1.append(li[item])
      li=li1
      print(li)
    2.根據題意來講,從後向前刪除列表,不會產生以上問題
      for item in range(len(li)-1,-1,-1):
        if item % 2 ==1:
          li.pop(item)
      print(li)

 

 拓展二code

#將字典中的key中含有k元素的全部鍵值對刪除.
dic = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3', 'name': 'alex'}

#錯誤案例
  for key in dic:
    if 'k' in key:
      dic.pop(key)
  print(dic)
  報錯信息: dictionary changed size during iteration

#正確案例
  l1 = []
  for key in dic:
    if 'k' in key:
      l1.append(key)
  for key in l1:
    dic.pop(key)
  print(dic)

  將符合條件的能夠添加到其餘對象那個之中,在進行修改

在for循環裏面不要對字典的大小進行改變(刪除,增長元素等操做),可能會影響到後續最終結果

 

 

 

 

返回系列

相關文章
相關標籤/搜索