程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

讓python飛:形象理解python list常用函數、dic常用函數、set常用函數、閉包、裝飾器

編輯:Python


Day07塔吊建大樓
有一只塔吊,接受了一向艱巨的任務。他要造分別建造一塊大表,一個字典和一個大餅樣式的建築。
他先畫好一個大表的輪廓圖,然後在圖上一個石塊接一個石塊的開始建起來
(#append(obj):將obj存入到列表的最後一個位置)。建著建著發現建的太慢了就開始用一個小車裝好石塊,再把它們一次性全部加到建好的石塊後面(#extend(iterable):將iterable對象中的每個元素分別取出存入到列表的最後位置)。小車必須裝能分開的石塊,不能分開的裝不了(不屬於iterable,所以不能被extend()函數所使用)。建好後,塔吊想找出刻著他名字的幾個石塊在哪裡,於是他叫來了鼠標(index)幫他找(# index(obj):返回obj在列表中出現的索引位置;),鼠標只告訴它第一個石塊所處的位置(如果存在多個相同的obj元素,返回的是第一次出現的那個元素的索引)。塔吊數大吃一驚,就想知道這一共有多少個石塊刻著自己的名字,所以他就叫來了磚夾(#count(obj):返回obj在列表中出現的次數;如果一次都沒有出現,返回0)幫他查。磚夾幫塔吊查到一共有三個。塔吊想把第一個刻著他名字的石塊給去掉,計算器告訴他,小鼓(#pop([index]):如果是空參數的pop(),將列表的最後一個元素彈出(作為返回值給到程序);如果有參數,必須是索引值,將具體索引位置上的元素彈出)可以幫他實現。但你必須告訴小鼓石塊的位置,不然他就把你最後一塊石塊給彈到空中。塔吊覺得,小鼓只能把石塊彈到空中,不能去掉。想想還是算了,於是就去找鐵掀(#remove(element):刪除和element匹配的某個元素,沒有返回值;如果有多個匹配的,只刪除第一個),它能把你的目標從地下挖走,且不留痕跡,如果有好幾個目標的話,他就只挖第一個。塔吊覺得這個可以用。於是就去請鐵掀。結果,與鐵掀一同前來的還有掃帚(#clear():清空列表,保留容器)和簸箕(#reverse():反轉列表元素)。塔吊就問鐵掀他們是干嘛的?鐵掀告訴塔吊,這掃帚能把你的石塊全部掃走,而簸箕能讓你的石塊本末倒置。塔吊一聽,頓時冷汗直冒,趕緊讓他倆滾蛋。於是,鐵掀乖乖幫塔吊挖走了寫有他名字的第一個石塊。不過,鐵掀發現,塔吊造的表所用石塊高低排列不一,所以,就告訴塔吊,說簸箕有個兄弟,叫書夾,它能將你的石塊進行高低排列(#sort([reverse=True],[key=…]):默認以升序排列(reverse=False),如果想要降序排列,顯示定義)。如果是從低到高就不用問簸箕的意見(lt1.sort()),但是如果是從高到低,需要經過簸箕的同意才行(lt1.sort(reverse=True))。就這樣,塔吊順利建好了大表樓。
塔吊建好了大表樓,越看越好看。就像多建幾個一模一樣的。他想了四種方法,第一種是在本樓上方,做一個模型,用其他名字命名,但是兩者之間的石塊分別用大粗繩連接,這樣的話,本樓一改變,模型也改變(1).引用地址傳遞 代碼:lt1 = lt)。第二種是直接在本樓上空重造一座一模一樣的,石塊間不連繩子,但是有的石塊小組用一根細繩子連起來(list中的copy() lt2 = lt.copy())。第三種和二種結果一樣,但是啟動方式不同,它需要第三方(copy模塊中的copy()函數lt3 = copy.copy(lt))來建造。第四個和第三個不同的是,它連小繩子也沒有了。完完全全的新復制(深拷貝:copy模塊中的deepcopy()函數lt4 = copy.deepcopy(lt))。同樣,它也需要第三方(copy.deepcopy)來建造
拷貝完大樓後,塔吊開始了字典大樓的建設。塔吊建了兩個字典大樓,每個樓層都有一個主題,樓層裡主題內容。塔吊想著兩個樓不太好,所以就用扳手將第兩個大樓融合到第一個大樓裡(update(dict):例如:dic1.update(dic2)),兩樓重合的部分不加,樓一沒有就加上去(將dic2中每一個鍵值對和dic1中的進行比較,如果dic1中經過存在相同的鍵,那麼就保證鍵不變,值被覆蓋;如果dic1中沒有相應的鍵值對,那麼就將其加入進dic1中)。
這時,一只小飛豬過來,字典大樓一下子變成一層一層的分開,排列在牛肉丸串上。牛肉丸又落到了一支大表上(items():返回一個dict_items類型的對象,內部封裝了一個一個元祖充當其元素,元祖中包含鍵和值兩塊內容 dict_items([(‘name’, ‘張三豐’), (‘age’, 120), (‘height’, 168.0)]))。小豬飛走後,大樓恢復原樣。這時又過來一個大鑰匙,它一經過,樓上的牌子全部掉下來,落在鑰匙背上的一個大金表上,接住掉下來的牌子(keys():返回一個dict_keys類型的對象,內部封裝了鍵集dict_keys([‘name’, ‘age’, ‘height’]))。 還有個驗鈔機過來,剩下的樓層又全部一層一層的排列在驗鈔機背上的大表上(values():返回一個dict_values類型的對象,內部封裝了值集dict_values([‘張三豐’, 120, 168.0]))。一頓惡作劇折騰過後,字典大樓又恢復了原來的模樣。這時,大時小飛豬拿著一個小鼓過來了,只見最高一層樓立刻彈了起來,飛到半空中,下面還有個肉丸子(popitem():彈出最後一個鍵值對,以元祖的形式返回(‘girlFriend’, ‘滅絕師太’))。小豬笑了笑,飛走了。又來了一個拿著鑰匙的小鼓,小鼓問塔吊要飛那個?塔吊隨便告訴它一個牌子名,只見那個牌子立刻爛掉,對應的樓層飛到空中(pop(key):傳入key,彈出整個鍵值對,最終返回給程序value)。最後,小鼓也走了,大樓才恢復原樣

塔吊繼續蓋大餅大樓。攤好大餅後,它開始用一個大勺子向裡面加各種蔬果什錦(add(e):添加一個元素e(不可變的數據類型)到集合中)。加好後,就在旁邊敲鼓,敲一下蹦出來一個餅上的東西(pop(): 只能是空參的(集合沒有索引的概念),隨機從集合中彈出一個元素),然後美滋滋的吃掉!哈哈!突然,塔吊在樓頂上發現了一個苦瓜,塔吊不喜歡吃,就用鐵掀把它給挖掉了(remove(e):從集合中刪除和e匹配的元素)。把好吃的吃完後,就用掃帚把剩下的都給掃沒了(clear():清空集合,保留容器)。看到剩下的大餅光禿禿的,塔吊又用同樣的招式復制了一個大餅樓(copy(): 拷貝)。復刻完後塔吊又往兩個大餅樓頂添加了各種各樣的東西,折騰完了,剛造的大餅樓突然管之前的大餅樓叫爸爸。這給第一個大餅樓嚇一跳,趕緊讓塔吊看看是不是他孩子(issubset(s):判斷一個集合是另一個集合的子集嗎?
舉例:s1.issubset(s2) s1是s2的子集嗎? 結果為:False)。塔吊一瞧新的大餅樓上的東西,在老的大餅樓裡都包含,趕緊告訴老大餅樓,沒錯,就是您孩子。您趕緊認吧!老大餅樓說,憑什麼呀?他有我的血統嗎(issuperset(s):判斷一個集合是另一個集合的父集嗎?舉例:s1.issubset(s2) s1是s2的父集嗎? 結果為:True)?塔吊說對啊,您倆身上有相同的部分!老大餅樓,趕緊抱抱新大餅樓。(isdisjoint(s):判斷兩個集合之間是否存在交集,如果存在,返回False;反之,返回True)。
蓋好大樓後,塔吊請了舞獅來慶祝!舞獅子給裝在一個封閉的包子裡運過來的(.閉包:(思想)),打開包子一看,嚯,是一大一小倆小獅子(1).有外部函數和內部函數這樣的結構),小獅子嘴裡的球和大獅子嘴裡的球有一根繩連著(2).外部函數中定義的變量需要被內部函數所使用)。一看包子被打開後,大獅子立刻笑嘻嘻的把小獅子給舉起來,送給塔吊(3).內部函數的對象作為返回值被外部函數返回)!

4.閉包:(思想)
滿足以下三個條件:
1).有外部函數和內部函數這樣的結構
2).外部函數中定義的變量需要被內部函數所使用
3).內部函數的對象作為返回值被外部函數返回
演示閉包的定義和使用:
'''
def outer():
a = 10
def inner():
print(a + 20)
return inner
f = outer()
print(f,type(f))
f()
f()
強化閉包的概念和使用:
'''
#案例一:
def outer():
count = 0
def inner():
nonlocal count
count += 1
print('hello,老郭,呵呵哒,%d' %count)
return inner
# outer()()
# outer()()
# i = outer()
# j = outer()
# print(i,id(i))
# print(j,id(j))
k = outer()
k()
k()
k()
#案例二:
def outer():
a = 23
b = 44
c = 56
def inner(num):
d = a + num
e = b + num
f = c + num
return d,e,f
return inner
tp1 = outer()(100)
tp2 = outer()(200)
print(tp1,type(tp1))
print(tp2,type(tp2))
5.裝飾器:
裝飾器是閉包的一種使用場景(體現);
python中的裝飾器(函數)技術在定義格式上需要傳入一個函數對象,
在此函數執行前或者後都可以追加其它的操作;
這樣做的好處是:在不改變源碼(原本的業務邏輯)的同時,進行功能的擴展;
在後期的開發中一般使用在:性能測試、插入日志、事物管理、權限校驗...
它好比是一個切面(可插拔的)
也就是我們之後學習過程中遇到的面向切片
滿足開放封閉原則:
開放:
在不改變源代碼(不破壞原本的業務邏輯)的同時擴展新的功能
封閉:
不允許隨意改變源碼
import time
'''
說明裝飾器的好處:
部門A:維護和管理數據信息平台
信息平台:內部封裝了很多的api和接口
裝飾器:函數(fn):
部門B:
m1():
func1()
func2()
func3()
部門C:
m2()
func4()
func5()
func6()
...
'''
def outer(fn):
def inner():
print('功能開始前追加日志信息...')
# start = time.time() #123456789
fn()
print('功能結束後追加日志信息...')
# end = time.time() #123456811
# print(end - start)
return inner
@outer
def test():
print('我是test函數...')
# i = outer(test)
# i()
test()
裝飾器的定義格式:4種
'''
#格式一:無參無返回值的裝飾器
def outer(fn):
def inner():
print('功能開始前追加日志信息...')
# start = time.time() #123456789
fn()
print('功能結束後追加日志信息...')
# end = time.time() #123456811
# print(end - start)
return inner
@outer
def test():
print('我是test函數...')
test()
#格式二:無參有返回值的裝飾器
def make_bold(fn):
def wrapper():
return "<b>" + fn() + "</b>"
return wrapper
def make_italic(fn):
def wrapper():
return "<i>" + fn() + "</i>"
return wrapper
@make_italic
@make_bold
def test():
return "hello zsq"
print(test())
#格式三:有參有返回值的裝飾器
def zhuangshiqi(fn):
def wrapper(name,age,sex):
print(name,age)
fn(name,age,sex)
print(sex)
return "abcdefg"
return wrapper
@zhuangshiqi
def test(n,a,s):
print("我叫:%s,年齡為:%d,性別是:%s" %(n,a,s))
res = test(sex="男",name="老郭",age=30)
print(res)
#格式四:通用裝飾器
def zsq(fn):
def wrapper(*args,**kwargs):
print(args)
fn(**kwargs)
print(kwargs)
return "裝飾器不難學"
return wrapper
@zsq
def test(name,age,hobby):
print('我叫:%s,年齡為:%d,愛好是:%s' %(name,age,hobby))
print(test(30,0.01,name="杜老師",age=35,hobby={'游戲':'吃雞','男性':'小鮮肉','體育':'舉重'}))

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved