摘要:三國時代著名的兵器鑒別家呂虔根據兵器的特點對漢武帝欽定的十八般兵器重新排列為九長九短。明代五雜俎和清代堅集兩書所載十八般兵器為弓弩槍刀劍矛盾斧鉞戟黃锏撾殳棍叉耙頭錦繩套索白打拳術。后人稱其為小十八般。
在古典小說和傳統評話中,常說武藝高強的人是“十八般武藝樣樣精通”,這十八般武藝是指使用“十八般兵器”的功夫和技能。哪十八般呢?
十八般兵器在武術界中最普遍的說法是:刀、槍、劍、戟、斧、鉞、鉤、叉、鞭、锏、錘、抓、鏜、棍、槊、棒、拐、流星。
漢武于元封四年(公元前107),經過嚴格的挑選和整理,篩選出18種類型的兵器:矛、鏜、刀、戈、槊、鞭、锏、劍、錘、抓、戟、弓、鉞、斧、牌、棍、槍、叉。
三國時代,著名的兵器鑒別家呂虔,根據兵器的特點,對漢武帝欽定的“十八般兵器”重新排列為九長九短。九長:戈、矛、戟、槊、鏜、鉞、棍、槍、叉;九短:斧、戈、牌、箭、鞭、劍、锏、錘、抓。
明代《五雜俎》和清代《堅集》兩書所載,“十八般兵器”為弓、弩、槍、刀、劍、矛、盾、斧、鉞、戟、黃、锏、撾、殳(棍)、叉、耙頭、錦繩套索、白打(拳術)。后人稱其為“小十八般”。
也叫生成器,它最大的優勢就是延遲計算按需使用,節省內存空間、提高運行效率。
迭代工具庫 itertools 中共有18個函數,恰好似“迭代界”的十八般兵器,掌握了這些功夫和技能也可以說是“十八般武藝樣樣精通”!:
>>> import itertools>>> tools = [func for func in dir(itertools) if func[0]>='a']>>> len(tools)18>>> tools['accumulate', 'chain', 'combinations', 'combinations_with_replacement', 'compress', 'count', 'cycle', 'dropwhile', 'filterfalse', 'groupby', 'islice', 'permutations', 'product', 'repeat', 'starmap', 'takewhile', 'tee', 'zip_longest']
>>> import itertools as it>>> it.accumulate(range(11))>>> list(it.accumulate(range(11)))[0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]>>>
1乘2乘3...一直乘到n有階乘運算 n! ,但1加2加3...一直加到n,一般都沒有定義“累和”運算,還需循環來計算。現在有了這個函數可以代替用用的,比如1加到100:
>>> list(it.accumulate(range(1+100)))[-1]5050>>>
連接多個迭代器,或其它可迭代對象
>>> import itertools as it>>> it.chain(range(3),[3,4,5],{6,7},(i for i in range(8,11)))>>> list(it.chain(range(4),[4,5],{6,7},(i for i in range(8,11))))[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]>>>
from itertools import combinations as comb>>> comb1 = comb(range(4), 3)>>> list(comb1)[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]>>> comb2 = comb(range(1,6), 3)>>> list(comb2)[(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]>>> comb3 = comb(range(1,6), 4)>>> list(comb3)[(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)]>>>
>>> from itertools import combinations_with_replacement as Comb2>>> comb1 = Comb2(range(4), 3)>>> list(comb1)[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 2), (0, 2, 3), (0, 3, 3), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 2), (1, 2, 3), (1, 3, 3), (2, 2, 2), (2, 2, 3), (2, 3, 3), (3, 3, 3)]>>> comb2 = Comb2(range(1,6), 3)>>> list(comb2)[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 1, 5), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 3), (1, 3, 4), (1, 3, 5), (1, 4, 4), (1, 4, 5), (1, 5, 5), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 2, 5), (2, 3, 3), (2, 3, 4), (2, 3, 5), (2, 4, 4), (2, 4, 5), (2, 5, 5), (3, 3, 3), (3, 3, 4), (3, 3, 5), (3, 4, 4), (3, 4, 5), (3, 5, 5), (4, 4, 4), (4, 4, 5), (4, 5, 5), (5, 5, 5)]>>>
>>> import itertools as it>>> list(it.permutations([1,2,3]))[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]>>> # 數字1、2、3能組成哪些三位數?>>> [i[0]*100+i[1]*10+i[2] for i in it.permutations([1,2,3])][123, 132, 213, 231, 312, 321]>>>
按照真值表來精簡迭代器,篩選出部分值
>>> import itertools as it>>> i = it.compress(range(6), (1,1,0,0,1,0))>>> list(i)[0, 1, 4]>>>
>>> import itertools as it>>> islice = it.islice(range(100),0,9,2)>>> list(islice)[0, 2, 4, 6, 8]>>> iSlice = it.islice(range(1,100),0,9,2)>>> list(iSlice)[1, 3, 5, 7, 9]>>> # 可以不指定起始和步長,直接指定個數>>> list(it.islice(range(1,100),10))[1, 11, 21, 31, 41, 51, 61, 71, 81, 91]>>>
因為生成器只提供說法不是數據集,直接用 list(count1)會死循環的,可以用islice()指定一下個數。
>>> import itertools as it>>> count1 = it.count(start=0,step=3)>>> list(it.islice(count1,12))[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33]>>> count2 = it.count(start=100,step=-2)>>> list(it.islice(count2,10))[100, 98, 96, 94, 92, 90, 88, 86, 84, 82]>>>
>>> import itertools as it>>> list(it.islice(it.cycle('ABC'),10))['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']>>> list(it.islice(it.cycle([1,2,3,4]),10))[1, 2, 3, 4, 1, 2, 3, 4, 1, 2]>>>
>>> import itertools as it>>> list(it.repeat(5,10))[5, 5, 5, 5, 5, 5, 5, 5, 5, 5]>>> list(it.repeat([1,2],5))[[1, 2], [1, 2], [1, 2], [1, 2], [1, 2]]>>>
舍棄不滿足條件的元素,但當條件不滿足即停止篩選
>>> import itertools as it>>> lst = [1,3,5,2,4,6,10,11,7,8,12,15]>>> list(it.dropwhile(lambda i:i<9,lst))[10, 11, 7, 8, 12, 15]>>> list(it.dropwhile(lambda i:i%2,lst))[2, 4, 6, 10, 11, 7, 8, 12, 15]>>>
留下滿足條件的元素,但當條件不滿足即停止篩選
>>> import itertools as it>>> list(it.takewhile(lambda i:i<6, range(10)))[0, 1, 2, 3, 4, 5]>>> lst = [1,3,5,2,4,6,10,11,7,8,12,15]>>> list(it.takewhile(lambda i:i<11,lst))[1, 3, 5, 2, 4, 6, 10]>>> list(it.takewhile(lambda i:i%6,lst))[1, 3, 5, 2, 4]>>>
舍棄滿足條件的所有元素,留下所有不滿足條件的
>>> import itertools as it>>> lst = [1,3,5,2,4,6,10,11,7,8,12,15]>>> list(it.filterfalse(lambda i:i<9,lst))[10, 11, 12, 15]>>> list(it.filterfalse(lambda i:i%2,lst))[2, 4, 6, 10, 8, 12]>>>
>>> import itertools as it>>> group = it.groupby(range(20), lambda i:not 8>> for i,j in group: print(i,list(j))True [0, 1, 2, 3, 4, 5, 6, 7, 8]False [9, 10, 11, 12, 13, 14, 15]True [16, 17, 18, 19]>>>
>>> import itertools as it>>> list(it.product('ABC',(1,2)))[('A', 1), ('A', 2), ('B', 1), ('B', 2), ('C', 1), ('C', 2)]
>>> import itertools as it>>> list(it.starmap(str.isupper, 'AbCDefgH'))[True, False, True, True, False, False, False, True]>>> list(it.starmap(lambda a,b,c:a+b+c,([1,2,3],[4,5,6],[7,8,9])))[6, 15, 24]>>> list(it.starmap(lambda *a:sum(a),[range(5),range(10),range(101)]))[10, 45, 5050]>>>
返回多個迭代器的元組
>>> import itertools as it>>> [list(i) for i in it.tee([1,2,3],3)][[1, 2, 3], [1, 2, 3], [1, 2, 3]]>>> it.tee([1,2,3],3)(, , )>>>
與內置函數zip()類似,但元素個數以最長的迭代器為準
>>> import itertools as it>>> list(it.zip_longest('ABCDE',range(1,4)))[('A', 1), ('B', 2), ('C', 3), ('D', None), ('E', None)]>>> list(zip('ABCDE',range(1,4)))[('A', 1), ('B', 2), ('C', 3)]>>> list(it.zip_longest('ABCDE',range(1,4),[1,2,3,4]))[('A', 1, 1), ('B', 2, 2), ('C', 3, 3), ('D', None, 4), ('E', None, None)]>>>
名字我隨便起的,形像就好。看下來如何?十八兵器,樣樣精通了嗎?其實掌握個幾樣“稱手的”即可,何必面面俱到呢 ^_^
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119018.html
摘要:使用中的函數大多是返回各種迭代器對象,其中很多函數的作用我們平時要寫很多代碼才能達到,而在運行效率上反而更低,畢竟人家是系統庫。連接多個列表或者迭代器。 前言 最近事情不是很多,想寫一些技術文章分享給大家,同時也對自己一段時間來碎片化接受的知識進行一下梳理,所謂寫清楚才能說清楚,說清楚才能想清楚,就是這個道理了。 很多人都致力于把Python代碼寫得更Pythonic,一來更符合規范且...
摘要:做數據分析,,你值得擁有。的包管理器有和,本來是很方便的。另外,本身還提供了包管理器來安裝或升級相應的包。八斬刀是詠春中最厲害的兵器,是一條大蟒蛇,翻譯為水蟒。如果數據科學是武俠中的詠春,那么便是數據科學中的八斬刀。 摘要:武俠,是成人的童話。江湖,是門派的斗爭。數據科學已經開山立派,Python便是其中獨領風搔的兵器。如果數據科學是IT武俠中的詠春,那么Anaconda便是數據科學中...
摘要:為了保證各自的核心利益,避免盲目惡性競爭,最終三大公會達成了一個共識將軟件測試江湖里的神兵利器分為四大類功能自動化測試武器性能測試武器測試管理武器單元測試武器。 有人的地方就有江湖,有江湖的地方就有恩怨。 軟件測試也有自己的江湖,也有自己的紛爭。 軟件測試江湖一直存在于武林中,只是對外行事低調,從不惹是非,是以未受到武林中各路人士的關注,直到近年來互聯網這股勢力的崛起將軟件測試這一傳統...
閱讀 713·2023-04-25 19:43
閱讀 3910·2021-11-30 14:52
閱讀 3784·2021-11-30 14:52
閱讀 3852·2021-11-29 11:00
閱讀 3783·2021-11-29 11:00
閱讀 3869·2021-11-29 11:00
閱讀 3557·2021-11-29 11:00
閱讀 6105·2021-11-29 11:00