巨蟒python全棧開發-第7天 基本數據類型補充&深淺拷貝

1.基本數據類型補充java

2.深淺拷貝git

 

DAY7-基本數據類型(基本數據類型補充&深淺拷貝)

本節主要內容:面試

1.補充基礎數據類型設計模式

 (1)join方法app

 (2)split方法學習

 (3)列表不能在循環時刪除,由於索引會發生改變spa

 (4)字典不能直接刪除,要把刪除的內容先記錄在列表中,循環列表,刪除字典中的數據設計

 (5)fromekeys()不會對原來的字典產生影響,面試常考題(巨坑)code

2.深淺拷貝部分對象

(1)=從上到下只有一個列表建立

(2)copy 等價於[:]切割

(3)引入一個模塊:import copy

(4)爲何要深淺拷貝?

1.(1)join()方法把列表,變成字符串
字符串是不可變的數據類型
lst=['alex','dsb','wusir','xsb']#大燒餅,小燒餅
s='_'.join(lst) #使用前面的字符串,對後面的列表進行拼接,拼接的結果是一個字符串
print(s)      #結果:alex_dsb_wusir_xsb
(2) split() 根據你給的參數進行切割,切割的結果是列表
s='alex_dbs_wusir_xsb'
lst=s.split("_")   #列表
print(lst)   #結果:['alex', 'dbs', 'wusir', 'xsb']
總結:
  須要把字符串轉化成列表:split()
  須要把列表轉化成字符串:join()

練習
print("*".join('周潤發')) #中間有個迭代器,用迭代的方式進行的拼接
結果:
  周*潤*發
(3)列表不能直接刪除,把要刪除的內容記錄在列表中.循環新列表,再刪除原列表
  列表不能在循環的時候刪除,由於索引會隨着循環發生改變.
lst=['籃球','足球','乒乓球','電子競技','檯球']
lst.remove()   #第一種方法
print(lst)
for el in lst: lst.remove(el) #第二種方法:錯誤寫法 print(lst) #刪不乾淨,緣由分析:刪除一個,元素的索引須要從新排序,for循環向後走一個,差一個 for i in range(len(lst)): #0 1 2 3 4 lst.pop(i) print(lst) #第三種方法:報錯(超過範圍):pop index out of range for i in range(len(lst)): #0 1 2 3 4 lst.pop() print(lst) #第四種方法:正確(依次刪除列表中最後一個) for i in range(len(lst)): #0 1 2 3 4 lst.pop(0) print(lst) #第五種方法:正確(依次刪除列表中索引時0的元素)
練習:
最合理的刪除方式
  1.把要刪除的內容寫在新列表中
  2.循環這個新列表,刪除老列表
  需求:刪除列表中帶球字的運動項目
new_lst=[]
  for el in lst:
       if '' in el:
         new_lst.append(el)   #new_lst記錄要刪除的內容
  #要刪除的列表
 print(new_lst)
 #循環新列表,刪除老列表
 for el in new_lst:      #['籃球','排球','足球','檯球']
      lst.remove(el)
  print(lst)
(4)字典不能直接刪除,把要刪除的內容記錄在列表中.循環新列表,再刪除字典中要刪除的信息
字典在被循環的時候是不能刪除的(Day6做業中有詳解)
dic={'張無忌':'乾坤大挪移','周芷若':'哭','趙敏':'鬧'}


s={'楊逍','範瑤','韋一笑','謝遜'} #set集合
for el in s:
s.remove(el) #報錯:Set changed size during iteration

小結:
集合和字典是一家人
字典:key的鍵必須是不可變的,可哈希的,不重複的
集合:元素必須是不可變的,可哈希的,不重複的
集合至關於只存了key的字典

dic={'韋一笑':'青翼蝠王','韋一笑':'張無忌'}#後面覆蓋前面的
dic['韋一笑']='殷天正' #修改
print(dic)

(5)fromkeys(),不會對原來的字典產生影響,產生新字典(坑:大坑,神坑)
面試項目經理,常考題目(面試題):
fromkeys() 幫助咱們建立字典用的
把第一個參數進行迭代,拿到每一項做爲key和後面的value組合成字典
dict={}
d=dict.fromkeys('張無忌','趙敏')#建立字典
print(dict)  #{}
print(d)     #{'張': '趙敏', '無': '趙敏', '忌': '趙敏'}

d=dict.fromkeys('abc','趙敏')#建立字典
print(d)      #{'a': '趙敏', 'b': '趙敏', 'c': '趙敏'}

坑1:返回新字典,和原來的字典沒有關係 //dic表明原來的字典
dic={} 
d=dic.fromkeys('風扇哥','很困')
print(dic)    #{}
print(d)      #{'風': '很困', '扇': '很困', '哥': '很困'}
坑2:若是value是可變的數據類型
產生了三個鍵值對,是一個列表
d=dict.fromkeys('胡辣湯',[])
print(d)    #{'胡': [], '辣': [], '湯': []}

d[''].append('河南特點')  #不論動誰,三個鍵對應的值都會變
print(d)    #{'胡': ['河南特點'], '辣': ['河南特點'], '湯': ['河南特點']}
練習:
dic=dict.fromkeys(['alex','wusir'],['太白','姍姍'])
print(dic)   #{'alex': ['太白', '姍姍'], 'wusir': ['太白', '姍姍']}

dic['alex'].append('老村長')  #動一發而牽全身
print(dic)                #{'alex': ['太白', '姍姍', '老村長'], 'wusir': ['太白', '姍姍', '老村長']}
#上邊的例子說明,只要建立的鍵不一樣,可是用的值是同樣的內存地址,增刪都是一個操做

print(id(dic['alex']))      #2119427394952
print(id(dic['wusir']))     #2119427394952

2.深淺拷貝部分
lst=[1,3,[5,7],9]
lst1=lst
lst2=lst[:]
lst[-2].append(9)
lst.append(4)
print(lst) #[1, 3, [5, 7, 9], 9, 4]
print(lst1) #[1, 3, [5, 7, 9], 9, 4]
print(lst2) #[1, 3, [5, 7, 9], 9]

(1)從上到下只有一個列表被建立
lst1=['胡辣湯','灌湯包','油潑面','麻辣香鍋']
lst2=lst1
print(id(lst1))     #2833498846728
print(id(lst2))     #2833498846728

lst1.append('胡辣湯')
print(lst1)         #['胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', '胡辣湯']
print(lst2)         #['胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', '胡辣湯']
(2)copy  等價於[:]切割

lst1=['胡辣湯','灌湯包','油潑面','麻辣香鍋']
lst2=lst1.copy()        #拷貝,抄做業,能夠幫咱們建立新的對象

#copy以後,內存地址會不同
print(id(lst1))         #2459666429448
print(id(lst2))         #2459666429320

lst1.append('胡辣湯')
print(lst1)         #['胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', '胡辣湯']
print(lst2)         #['胡辣湯', '灌湯包', '油潑面', '麻辣香鍋']
lst1=[[1,2],'胡辣湯','灌湯包','油潑面','麻辣香鍋']
lst2=lst1.copy()        #拷貝,抄做業,能夠幫咱們建立新的對象,和原來長的如出一轍,淺拷貝

lst1.append('胡辣湯')  #在後邊追加,lst1會添加,lst2不會添加
lst1[0].append('1')   #在存在的,第一層是列表裏邊添加,lst1和lst2都會添加
print(lst1)         #[[1, 2, '1'], '胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', '胡辣湯']
print(lst2)         #[[1, 2, '1'], '胡辣湯', '灌湯包', '油潑面', '麻辣香鍋']

(3)#引入一個模塊

import copy
lst1=[[1,2],'胡辣湯','灌湯包','油潑面','麻辣香鍋',['長白山','白洋澱','黃鶴樓']]
lst2=copy.deepcopy(lst1)        #深拷貝,對象內部的全部內容都要複製一份,深度克隆(java中),原型模式(設計模式中)

print(id(lst1))             #1882059537224
print(id(lst2))             #1882059537160

lst1[5].append('葫蘆娃')
print(lst1)         #[[1, 2], '胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', ['長白山', '白洋澱', '黃鶴樓', '葫蘆娃']]
print(lst2)         #[[1, 2], '胡辣湯', '灌湯包', '油潑面', '麻辣香鍋', ['長白山', '白洋澱', '黃鶴樓']]

 


(4)爲何要有深淺拷貝?
提高建立對象的速度
計算機中最慢的,就是建立對象,須要分配內存
最快的方式就是二進制流的形式進行賦值,速度最快(沒有之一)

理解深淺copy案例:作做業? 抄做業

之後學習的各類設計模式,就是爲了提升速度
clone:克隆

做業:
1.判斷一個數是不是水仙花數, 水仙花數是一個三位數, 三位數的每一位的三次方的和還等於這個數. 
那這個數就是一個水仙花數, 例如: 153 = 1**3 + 5**3 + 3**3
sum=0
while 1:
    s = input('請輸入一個數字:')
    if s.isdigit():
        for i in s:
            sum += (int(i))**3
        if sum == int(s):
            print('這是一個水仙花數:')
            sum=0        #目的是爲了下次計算不受影響
            break
        else:
            print('這不是一個水仙花數:')
            sum=0        #目的是爲了下次計算不受影響
    else:
        print('輸入錯誤,請輸入數字')
2.給出一個純數字列表. 請對列表進行排序(升級題, 難度係數很高. 最後再作這個). 
思路:
(1)完成a和b的數據交換. 例如, a = 10, b = 24 交換以後, a = 24, b = 10
(2)循環列表. 判斷a[i]和a[i+1]之間的大小關係, 若是a[i]比a[i+1]大. 則進行互換.
循環結束的時候. 當前列表中最大的數據就會被移動到最右端.
(3)想想, 若是再次執行一次上面的操做. 最終第二大的數據就移動到了右端.
以此類推. 若是反覆的進行執行相應的操做. 那這個列表就變成了一個有序列表.

#方法一:
li=[10,9,8,7,6,5,4,3,2,1]
for k in range(1,len(li)):
    for i in range(0,len(li)-k):
        if li[i]>li[i+1]:
            li[i],li[i+1]=li[i+1],li[i]
print(li)
#方法二:最精簡的方法
li=[10,9,8,7,6,5,4,3,2,1]
for k in range(1,len(li)):
    for i in range(len(li)-k):
        if li[i]>li[i+1]:
            li[i],li[i+1]=li[i+1],li[i]
print(li)
#方法三:
li=[10,9,8,7,6,5,4,3,2,1]
for k in li:
    for i in range(len(li)-1):
        if li[i]>li[i+1]:
            li[i],li[i+1]=li[i+1],li[i]
print(li)
3. 稅務部門徵收所得稅. 規定以下: 
1). 收入在2000如下的. 免徵.
2). 收入在2000-4000的, 超過2000部分要徵收3%的稅. 
3). 收入在4000-6000的, 超過4000部分要徵收5%的稅.
4). 收入在6000-10000的, 超過6000部分要徵收8%的稅.  
5). 收入在10000以上的, 超過部分徵收20%的稅. 

注, 若是一我的的收入是8000, 那麼他要交2000到4000的稅加上4000到6000的稅加上6000到8000的稅.
收入= 8000-(4000-2000)*3%-(6000-4000)*4%-(8000-6000)*8%
讓用戶輸入它的工資, 計算最終用戶拿到手是多少錢.
#方法一:
while 1:
    salary=int(input('請輸入你的工資'))
    if salary<=2000:
        money=salary
    elif 2000<salary<=4000:
        money=2000+(salary-2000)*(1-0.03)
    elif 4000<salary<=6000:
        money=2000+(4000-2000)*(1-0.03)+(salary-4000)*(1-0.05)
    elif 6000<salary<=10000:
        money=2000+(4000-2000)*(1-0.03)+(6000-4000)*(1-0.05)+(salary-6000)*(1-0.08)
    else:
        money = 2000 + (4000 - 2000) * (1 - 0.03) + (6000 - 4000) * (1 - 0.05) + (10000 - 6000) * (1 - 0.08)+(salary-10000)*(1-0.2)
    print("到手的錢是:",money)
    break
#方法二:
bobo的思路:從最大的工資開始計算if

默寫:
簡述什麼是深淺拷貝.
刪除列表中姓周的人的信息

lst = ['周芷若', '周伯通', '王重陽','周葫蘆娃']
li=[]
for i in lst:
    if '' in i:
        li.append(i)
# print(li)
for i in li:
    lst.remove(i)
print(lst)
相關文章
相關標籤/搜索