Day17水晶龍舟和減少獅大戰海盜
有一只運送藏寶圖的龍舟在海上自由自在的徜徉(高階函數之map:map(fn,lsd1,[lsd2]):)
,這時突然有只長長的小船來到船尾,目測來著不善(第二個參數:lsd1 --> 序列對象(字符串、range、列表...))
。龍頭念咒急急如律令,這時天降雄獅到船尾(第一個參數:fn --> 函數對象)
,龍舟立刻變成水晶狀,龍嘴漸漸張開。海盜一個接一個被雄獅吸入口中,排洩到龍舟上時也變成透明狀,按先後順序坐在龍舟上。由於龍嘴張開,水晶海盜可以一個一個的從龍嘴爬出。(功能:將fn函數作用於lsd1中的每一個元素上,將每次執行的結果都存入到一個map對象中返回給程序;【注意】:得到的這個map對象屬於一個迭代器對象,屬於惰性序列的范疇print(list(map(int,lt))))
。這時又同時來了兩條船,他們並排著來到龍舟尾部,雄獅從每只船上抓一個,左右手各拿一只同時放入口中。不一會功夫,來自兩個不同船上的海盜就融合成一個水晶人(res_map = map(lambda x,y:x + y,lt1_map,lt2))
。這時又連著開來好幾只海盜船,龍舟一看情況不妙,趕緊打信號彈,從放棵兔子馬戲團(reduce函數屬於functools模塊中的函數,所以需要先導入functools模塊,再使用代碼如下:from functools import reduce)
召集來減少獅(高階函數之reduce)
,它有兩顆球,1號,2號。它能先把一個船上的海盜裝在1號,2號球裡,然後進行發功,2號球裡的海盜就到1號球裡去融合,然後船上的下一個海盜就到了2號球裡,然後獅子再發功,再進入一號球中融合。最後,所有的海盜融合完畢,最後就融合成一個海盜了(功能:先將lsd中的第一和第二個元素分別取出給到fn中參與運算,將運算以後的值和lsd中的第三個元素再次傳入給到fn參與運算,以此類推...)(print(reduce(lambda x,y: x * 10 + y,map(int,str1))))
。這樣好多船上的海盜就被消滅了。這時水晶龍舟有個海盜說,其實有很多海盜都是被逼的,他們都是平民被抓取做海盜的,希望龍舟能解救他們一把。原來如此,水晶龍舟立刻又發信號彈,不一會一條水晶龍舟開過來,舟位站著一個拿著大篩子的雄獅(高階函數之filter)
,雄獅肩頭站著一個女警察,她說可以了,那麼這個海盜就可以通過濾網坐到水晶龍舟上(filter函數:過濾數據,最終返回給程序一個filter對象(惰性、迭代器對象))
,同時該海盜將變成透明海盜,而且這條龍舟的龍頭也是張開嘴的(將lsd中的每一個元素都給到fn函數;如果fn函數的執行返回True,那麼就保留此元素到filter對象中,如果fn函數的執行返回False,那麼就捨棄此元素,不保留到filter對象中,最終filter函數執行完畢了,返回給程序一個filter類型對象(迭代器對象)。)(print(list(filter(lambda x: len(x) > 5,lt1))))
地圖龍舟上拉滿了水晶海盜,但他們高低不一,看起來不美觀。所以想用給表鏈排列的書夾給他們排列好。但是過濾龍舟不同意了。他說那個書夾只能給大表鏈排列高低,而且是在原大表鏈上操作的,萬一不滿意的話就改不了了(對於list中的sort函數而言:其執行完畢之後會影響到原本的這個list中的內部結構(內部的元素位置發生變化了))
。所以我建議還是用雙蛇洞裡的萬能書夾吧。它能給列表和字典排序,而且還能返回一個副本
(對於sorted函數而言:其執行完畢之後會返回給程序一個新的list對象(記錄排序之後的數據結構),原本的容器對象不會發生變化)(lt4 = sorted(lt3,key=len,reverse=True)
lt6 = sorted(lt5,reverse=True,key=lambda x:x['age']))
。地圖龍舟表示同意。
滅神獅子完事後就回到了放棵兔子馬戲團,回來後,馬戲團團主檢查他有沒有損害,所以就把它安排到了一個房間裡面(#導入需要被測試的函數from method import mySum)
。然後將穿著藍色工作服的調試工師傅叫來(#導入測試模塊 import unittest)
。然後整了一個大玻璃箱(步驟一:需要先導入測試模塊unittest,然後自定義類繼承unittest中的TestCase類,)
,箱子上有“測試箱”三個字。箱子裡面最上方有個提醒器
( 對於setUp()函數而言:在執行主模塊的時候由系統自動調用(時機:在被測試的函數執行之前被調用執行
def setUp(self):
print('對函數開始單元測試...')))
,你可以隨意設置提醒的內容。在箱子裡面最下方也有個結束提醒器
( 對於tearDown()函數而言:
在執行主模塊的時候由系統自動調用(時機:在被測試的函數執行之後被調用執行)( def tearDown(self):
print('單元測試結束了...')))
。將要被測試的小獅子頭上貼一個”test_”標志,放入玻璃箱中,會有個聽診器聽小獅子肚子,看是不是和正常的聲音一樣。警報器上有小獅子提供的肚子聲音記錄和正常的聲音
(
通過self調用assertEqual(,,)
參數1:需要被測試的函數 【注意】此函數調用必須有小括號以及實參
參數2:斷言的結果
參數3:如果斷言失敗了,錯誤提示信息)
。如果不一樣,聽診器會自動發出警報,警報的內容也可以自己設置。最後,在確定本房間名(當前模塊名)是和本房間運行的機器名一致時,開始測試。結果獅子沒問題!
if __name__ == '__main__':
#需要通過測試模塊unittest調用其main()
unittest.main())
if __name__ == '__main__':的運行原理
每個python模塊(python文件,也就是此處的 test.py 和 import_test.py)都包含內置的變量 __name__,當該模塊被直接執行的時候,__name__ 等於文件名(包含後綴 .py );如果該模塊 import 到其他模塊中,則該模塊的 __name__ 等於模塊名稱(不包含後綴.py)。
而“__main__” 始終指當前執行模塊的名稱(包含後綴.py)。進而當模塊被直接執行時,__name__ == 'main' 結果為真。