




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1.函數式編程概述.什么是函數式編程?函數式編程使用系列的函數解決問題。函數僅接受輸入并產生輸出,不包含任何能影響產生 輸出的內部狀態。任何情況下,使用相同的參數調用函數始終能產生同樣的結果。在個函數式的程療;中,輸入的數據“流過系列的函數,每個函數根據它的輸入產生輸出。 函數式風格避免編寫有“邊界效應W(Side effects)的函數:修改內部狀態,或者是其他無法反應在 輸出上的變化。完全沒有邊界效應的函數彼稱為“純函數式的-(PUrelyfUnCtiOnal)O避免邊界效應 總味著不使用在程序運行時可變的數據結構,輸出只依賴于輸入。可以認為函數式編程剛好站在了聞向對象編程的對立面。對象通
2、常包含內部狀態(字段),和 許多能修改這些狀態的函數,程序則由不斷修改狀態構成:函數式編程則極力避免狀態改動, 并通過在函數間傳遞數據流進行匚作。但這并不是說無法同時使用函數式編程和而向對象編程, 事實上,復雜的系統般會釆用聞向對象技術建模,但混合使用函數式風格還能讓你額外享受 函數式風格的優點。12.為什么使用函數式編程?函數式的風格通常彼認為有如下優點:邏輯可證一一這是個學術上的優點:沒有邊界效應使得更容易從邏輯上證明程序是 正確的(而不是通過測試)。模塊化一一函數式編程推崇簡單原則,個函數只做件事情,將人的功能拆分成盡 可能小的模塊。小的函數更易于閱讀和檢査錯誤。組件化一一小的函數更容易
3、加以組合形成新的功能。易于調試一一細化的、定義淸晰的函數使得調試更加簡單。當程序不正常運行時,每 個函數都是檢查數據是否正確的接口,能更快速地排除沒有問題的代碼,定位到出 現問題的地方Cl易于測試一一不依賴于系統狀態的函數無須在測試前構造測試樁,使得編寫單元測試 更加容易。更高的生產率一一函數式編程產生的代碼比其他技術更少(往往是其他技術的半左 右),并且更容易閱讀和維護=1.3. 如何辨認函數式風格?支持函數式編程的語言通常具有如下特征,人量使用這些特征的代碼即可被認為是函數式的: 函數是 等公民函數能作材參數傳遞,或者是作為返回值返回。這個特性使得模板方法模式非常易于 編寫,這也促使了這個
4、模式彼更頻繁地使用。以 個簡單的集合排序為例,假設ISt是個數集,并擁有個排序方法Sort需要將如 何確定順療;作為參數。如果函數不能作為參數,那么ISt的Sort方法只能接受普通對彖作為參數。這樣來我 們需要首先定義個接口,然后定義個實現該接口的類,最后將該類的個實例傳 給SOrt方法,由SOrt調用這個實例的COmPare方法,就像這樣:#偽代碼interface COmParatOr COmPare(olZ o2)ISt = IiSt (range(5)ISt SOrt(COmParatOr()COmPare(OIZ o2)return o2 - ol /逆序)可見,我們定義了 個新的接
5、口.新的類型(這里是個匿名類),并new T 個新 的對象只為了調用個方法。如果這個方法可以直接作為參數傳遞會怎樣呢?看起來 應該像這樣:def COmPare(OIZ o2):ret;Urn o2 - ol #逆序ISt = IiSt(range (5)ISt SOrt(COmPare)請注總,前段代碼已經使用了匿名類技巧從而省下了不少代碼,但仍然不如直接傳 遞函數簡單.自然。匿名函數(Iambda)Iambda提供了快速編寫簡單函數的能力。對于偶爾為之的行為 Iambda讓你不再需要 在編碼時跳轉到其他位置去編寫函數。Iambda農達式定義個匿名的函數,如果這個函數僅在編碼的位置使用到,你
6、可以現 場定義.直接使用:ISt.sort(lambda OIZ o2: OloompareTo(o2)相信從這個小小的例了你也能感受到強大的生產效率:)封裝控制結構的內置模板函數為了避開邊界效應,函數式風格盡量避免使用變量,而僅僅為了控制流程而定義的循 環變量和流程中產生的臨時變量無疑是最需要避免的。假如我們需要對剛才的數集進行過濾得到所有的正數,使用指令式風格的代碼應該像 是這樣:lst2 = IiStOfor i in range (Ien (ISt):非模擬經典 for 循環if ISt i O:lst2 append (ISti)這段代碼把從創建新列農、循環、取出元素、判斷、添加至新
7、列衣的整個流程完整的 展示了出來,儼然把解釋器當成了需要手把手指導的傻瓜。然而,過濾這個動作是很 常見的,為什么解釋器不能堂握過濾的流程,而我們只需要告訴它過濾規則呢? 在PythOn里,過濾由個名為filter的內置函數實現。有了這個函數,解釋器就學會了 如何“過濾,而我們只需要把規則告訴它:lst2 = filter (Iambda n: n O, ISt)這個函數帶來的好處不僅僅是少寫了幾行代碼這么簡單。封裝控制結構后,代碼中就只需耍描述功能而不是做法,這樣的代碼更淸晰,更可讀。 因為避開了控制結構的干擾,第二段代碼顯然能讓你更容易了解它的恿圖。另外,因為避開索引,使得代碼中不A可能觸發
8、下標越界這種異常,除非你手動制 造一個。函數式編程語言通常封裝了數個類似“過濾這樣的常見動作作為模板函數。唯的缺點 是這些函數需要少量的學習成本,但這絕對不能掩蓋使用它們帶來的好處。閉包(ClOSUre)閉包是綁定了外部作用域的變量(但不是全局變量)的函數。人部分情況下外部作用 域指的是外部函數。閉包包含了自身函數體和所需外部函數中的變量名的引用”。引用變量名意味著綁定的 是變量名,而不是變量實際指向的對象:如果給變量重新賦值,閉包中能訪問到的將 是新的值。閉包使函數更加靈活和強人。即使程療:運行至離開外部函數,如果閉包仍然可見,則 被綁定的變量仍然有效:每次運行至外部函數,都會重新創建閉包,
9、綁定的變量是不 同的,不需要擔心在I日的閉包中綁宦的變量會彼新的值覆蓋。回到剛才過濾數集的例J假設過濾條件中的O這個邊界值不再是固定的,而是由用 戶控制。如果沒有閉包,那么代碼必須修改為:ClaSS greater_than_helper: def init(SeIfZ minval):Self minval = minval def is_greater_than (self, Val): return Val SeIf minvalCief InyefiIter (IStZ minval):helper = greater_than_heIper(minval) return filter
10、 (helper is_g工ISt)請注總我們現在已經為過濾功能編寫了 個函數myjilterc如你所見,我們需妥在別 的地方(此例中是類greater_than_helper)持有另個操作數minvac 如果支持閉包,因為閉包可碩直鹵吏用外部作用域的變量,我們就不再需要 greater-than_helper JZ:def Iny_filter (IStZ minval): return filter (Iambda n: n minval, ISt) 可見,閉包在不影響可讀性的同時也省下了不少代碼量。函數式編程語言都提供了對閉包的不同程度的支持。在Python 2x中,閉包無法修改綁 定變
11、量的值,所有修改綁定變量的行為都彼看成新建了 個同名的局部變量并將綁定 變量隱藏。PythOn 3.x中新加入了 個關鍵字nonlocal以支持修改綁定變量 key(y) else y, iterable_and_args)/ min(iterableZ args key) = reduce (Iambda XZ y: X if key (x) (3)z (2f 4)如果參數的長度不致,將在最短的療:列結束時結束:如果不提供參數,將返回空列除此之外,你還可以使用本文2.5節中提到的functools.Partia1()為這些內置函數創建常用的偏函 數。另外,pypi 有個名為functiona
12、l的模塊,除了這些內建函數外,還額外提供了更多的有總 思的函數。但由于使用的場合并不多,并且需要額外安裝,在本文中就不介紹了。但我仍然推 薦人家下載這個模塊的純PythOn實現的源代碼看看,開闊思維嘛。里Ifti的函數都非常短,源文 件總共只有 300 行不到,地址在這里:/pypi/functional3.迭代器31.迭代S(IteratOr)概述迭代器是訪問集合內元素的種方式。迭代器對象從集合的第個元素開始訪問,直到所有的 元素都彼訪問遍后結束。迭代器不能回退,只能往前進行迭代。這并不是什么很人的缺點,因為人們幾乎不需要在迭代 途中進行回退操作。迭
13、代器也不是線程安全的,在多線程環境中對可變集合使用迭代器是個危險的操作。但如果 小心謹慎,或者干脆貫徹函數式思想堅持使用不可變的集合,那這也不是什么人問題。對于原生支持隨機訪問的數據結構(如tuple. IiSt),迭代器和經典for循環的索引訪問相比并 無優勢,反而丟失了索引值(可以使用內建函數enumerated找回這個索引值,這是后話)。但 對于無法隨機訪問的數據結構(比如SWt)而言,迭代器是唯的訪問元素的方式。迭代器的另個優點就是它不要求你事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭 代至某個元素時才計算該元素,而在這之前或之后,元素可以不存在或者被銷毀。這個特點使 得它特別適
14、合用于遍歷些巨大的或是無限的集合,比如幾個G的文件,或是斐波那契數列等 等。這個特點彼稱為延遲計算或惰性求值(LaZy evaluation)o迭代器更人的功勞是提供了 個統的訪問集合的接口。只要是實現了_iter_()方法的對彖, 就可以使用迭代器進行訪問。3.2. 使用迭代器使用內建的工廠函數iter(iterable)I以獲取迭代器對象: 1st = range (2) it = iter (ISt) it使用迭代器的next()方法可以訪問下個元素: it next ()0如果是PythOn 2.6+,還有內建函數next(iterator)可以完成這功能: next(it)1如何判斷
15、迭代器還有更多的元素可以訪問呢? PythOn里的迭代器并沒有提供類似()這 樣的方法。那么在這個例了中,我們已經訪問到了最后個元素1,再使用next()方法會怎樣呢? itnext ()TraCebaCk (most recent Call IaSt):FiIe z Iine 1 r in StOPIterationPythOn遇到這樣的情況時將會拋出StOPIteratiOn異常。事實上,PythOn正是根據是否檢査到這 個異常來決定是否停止迭代的。這種做法與迭代前手動檢査是否越界相比各有優點。但Pythan的做法總有些利用異常進行流 程控制的嫌疑。了解了這些情況以后,我們就
16、能使用迭代器進行遍歷了。it = iter (ISt)(XZ y) for X in range (3) for y in range(x)While TrUe :VaI = it next ()Print VaIexcept StOPlteratiOn :PaSS實際上,因為迭代操作如此普遍,PythOn專門將關鍵字伽用作了迭代器的語法糖。在for循 環中,PythOn將戸動調用工廠函數iter()獲得迭代器,自動調用next()獲取元素,還完成了檢査 StOPIteratiOn異常的工作。上述代碼可以寫成如下的形式,你定非常熟悉:for VaI in ISt:Print VaI首先Pyth
17、On將對關鍵字in后的對象調用iter函數獲取迭代器,然后調用迭代器的next方法獲 取元素,直到拋StoPIteratiOn異常。對迭代器調用iter函數時將返回迭代器自身,所以迭代 器也可以用于for語句中,不需要特殊處理。常用的幾個內建數據結構tuple, list、set. diet都支持迭代器,字符串也可以使用迭代操作。 你也可以自己實現個迭代器,如上所述,只需要在類的_iter_方法中返回個對象,這個 對象擁有個next()方法,這個方法能在恰當的時候拋出StOPlteratiOn異常即可。但是需要自 己實現迭代器的時候不多,即使需要,使用生成器會更輕松。下篇我們將討論生成器的部分
18、。歩異常并不是非拋出不可的,不拋出該異常的迭代器將進行無限迭代,某些情況下這樣的迭代器 很有用。這種情況下,你需要自己判斷元素并中止,否則就死循環了!使用迭代器的循環可以避開索引,但有時候我們還是需要索引來進行些操作的。這時候內建 函數enumerate就派上用場咯,它能在iter函數的結果前加上索引,以元組返回,用起來就像 這樣:for idxz ele in enumerate (ISt):Print idxz ele3.3. 生成器農達式(GeneratOr expression)和列農解析(LiSt COmPrehenSiOn)絕大多數情況下,遍歷個集合都是為了對元素應用某個動作或是進
19、行篩選。如果看過本文的 第二部分,你應該還記得有內建函數map和filter 供了這些功能,但Python仍然為這些操作 提供了語言級的支持。(xl for X in ISt) #生成器表達式,返回迭代器。外部的括號可在用于 參數時省略xl for X in 1st非列表解析,返回IiSt如你所見,生成器農達式和列衣解析(注:這里的翻譯有很多種,比如列農展開.列農推導等 等,指的是同個恿思)的區別很小,所以人們提到這個特性時,簡單起見往往只描述成列衣 解析。然而由于返回迭代器時,并不是在開始就計算所有的元素,這樣能得到更參的靈活性 并且可以避開很多不必要的計算,所以除非你明確希望返回列衣,否則
20、應該始終使用生成器衣 達式。接下來的文字里我就不區分這兩種形式了:)你也可以為列衣解析提供if f句進行篩選:(+l for X in ISt ifx!=0)或者提供多條for(句進行嵌套循環,嵌套次序就是for 了句的順序: 列農解析就是鮮明的PythOniCO我常遇到兩個使用列衣解析的問題,本應歸屬于最佳實踐,但 這兩個問題非常典型,所以不妨在這里提下: 第個問題是,I大I為對元素應用的動作A復雜,不能用個衣達式寫出來,所以不使用列農解 析。這是典型的思想沒有轉變的例如果我們將動作封裝成函數,那不就是個衣達式了么? 第二個問題是,因為if /句里的條件需要計算,同時結果也需要進行同樣的計算
21、,不希望計算 兩遍,就像這樣:(kdoSomething () for X in ISt if XdOSOmething ()0)這樣寫確實很糟糕,但組合下列衣解析即可解決:(X for X in (ydOSOnIOthing () for y in ISt) if x0)內部的列農解析變量其實也可以用X,但為清晰起見我們改成了*或者更清楚的,可以寫成兩 個農達式:CmP = (xdOSOmE匕hing() for X in ISt)(X for X in tmp if x O)列衣解析可以替代絕人多數需要用到map和filter的場合,可能正因為此,著名的靜態檢查工 具PyIint將map和
22、filter的使用列為了警告。3.4. 相關的庫PythOn 內置了 個模塊 Itertools 包含了很多函數用于 Creating iterators for efficient IOOPing (創 建更有效率的循環迭代器),這說明很是霸氣,這小節就來瀏覽遍這些函數并留下印象吧, 需要這些功能的時候隱約記得這里而有就好。這小節的內容翻譯 Itertools模塊官方文檔。3.4丄無限迭代 COUnt (start, step)從Start開始,以后每個元素都加上StePO SteP默認值為1。COUnt(IO) 10 11 12 13 14 CyCIe(P)迭代至序列P的最后個元素后,從P
23、的第個元素重新開始。CyCIe(,ABCD1) 一一 ABCDABCD repeat(elem z n)將elem重復r次。如果不指定n,則無限重復。repeat(10, 3) 10 10 103.4.2. 在最短的序列參數終止時停止迭代 Chain(PZ q, )迭代至序列P的最后個元素后,從Q的第個元素開始,直到所有序列終止。Chain(,ABC,Z ,DEF,) - ABCDEF ComPreSS(data, SeleCtOrS)如果 bool (SeIeC torsn)為 TrUet 貝 IJ next ()返回 data n 否貝 腳匕過 datanoCOmPreSS(,ABCDEF
24、,Z lz O,IZOZIZ1) ACEF dropwhile (Predz Seq)當Pred對seq n的調用返回FalSe時才開始迭代。dropwhile (Iambda : x 6 4 1 takewhile (Predz Seq)dropwhile的相反版本。takewhile (Iambda : x 1 4 ifilter(PredZ Seq)內建函數filter的迭代器版本。ifilter(Iambda : x%2Z range (IO) - 1 3 5 7 9 ifilterfalse(PredZ Seq)ifilter的相反版本。ifilterfalse(Iambda X:
25、x%2, range (IO) -一 0 2 4 6 8 imap(funcz PZ qz )內建函數map的迭代器版本。imap(POWZ (2,3,10)Z (5z2z3) 32 9 1000 StarmaP(func, Seq)將Seq的每個元素以變長參數(*args)的形式調用funcoStarmaP(POWZ (2z5)Z (3z2)Z (IOZ 3) 32 9 1000 izip (Pz qz )內建函數NiP的迭代器版本。izip(ABCDZ ,y) A By izip_longest (p, qz , f Xllvalue=None)izip的取最長序列的版本,短序列將填入fi
26、llvalueoizip_IOngeSt(,ABCD,Z ,Xy,Z fillvalue=,) - AX By C- D- tee(it, n)返回n個迭代器it的復制迭代器。 group by (i3rablE, keyfunc)這個函數功能類似于SQL的分組 (OZ (0 0 0) (IZ (1 1 D) (2, (2 2 2)3.4.3. 組合迭代器 PrOdUCt(PZ qz 工EPEa匕=1) 笛卡爾積。PrOdUCt(,ABCD,Z repeat=2) 一一 AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD permutations (
27、PZ r)去除重復的元素。PermUtatiOnS(tABCD,Z 2) - AB AC AD BA BC BD CA CB CD DA DB DC COnIbinatiOnS (PZ r) 排序后去除重復的元素 AB AC AD BC BD CD COnIbina*tions_WitherePlaCeInent ()排序后,包含重套元素COmbinationSeWith_replacement (,ABCD, 2) - AA AB AC AD BB BC BD CC CD DD 4.生成器(generator)4.1.生成器簡介 首先請確信,生成器就是種迭代器。生成器擁有MXt方法并且行為與
28、迭代器完全相同,這意 味著生成器也可以用于PythOn的for循環中。另外,對于生成器的特殊語法支持使得編寫個 生成器比H定義個常規的迭代器要簡單不少,所以生成器也是最常用到的特性之O 從PythOn 2.5開始,PEP 342:通過增強生成器實現協同程序的實現為生成器加入更參的特 性,這總味著生成器還可以完成更多的工作。這部分我們會在稍后的部分介紹。42生成器函數4.2.1.使用生成器函數定義生成器如何獲取個生成器?首先來看-小段代碼: Cief get_0_l_2 ():yimld 0yimld 1yimld 2 get_0_l_2我們定義了 個函數get_0_l_2,并且可以查看到這確實
29、是函數類型。但與般的函數不同的 是,get_0JL_2的函數體1強甬了關鍵字yidd,這使得get_0JL_2成為了 個生成器函數。生 成器函性如下:1. 調用生成器函數將返回個生成器; generator = get_0_l_2() generator2. 第次調用生成器的next方法時,生成器才開始執行生成器函數(而不是構建生成器 時),直到遇到yield時暫停執行(掛起),并且yield的參數將作為此次next方法的 返回值: generator HeXt()03. 之后每次調用生成器的MXt方法,生成器將從上次暫停執行的位置恢復執行生成器函 數,直到再次遇到yield時暫停,并且同樣的
30、,yield的參數將作為next方法的返回值; generator next ()1 generator next ()24如果當調用next方法時生成器函數結束(遇到空的return語句或是到達函數體末尾), 則這次next方法的調用將拋出StOPIteratiOn異常(即for循環的終止條件): generator next ()TraCebaCk (InOSt recent Call IaSt):FiIe z Iine 1, in StOPIteratiOn5. 生成器函數在每次暫停執行時,函數體內的所有變量都將彼封存(freeze)在生成器中, 并將在恢復執行時還原,并且類似于閉包,即
31、使是同個生成器函數返回的生成器, 封存的變量也是互相獨立的。我們的小例/中并沒有用到變量,所以這里另外定義個生成器來展示這個特點: def f ibonacci (): a=b=l yimld a yimld b While TrUe :az b = bz a+byimld b for num in fibonacci (): if num 100: break Print numz 1 1 2 3 5 8 13 21 34 55 896. 看到WhileTrUe可別太吃驚,因為生成器可以掛起,所以是延遲計算的,無限循環并沒 有關系。這個例了中我們定義了一個生成器用于獲取斐波那契數列C4.2.
32、2.生成器函數的FAQ接下來我們來討論些關于生成器的有意思的話題。1. 你的例子里生成器函數都沒有參數,那么生成器函數可以帶參數嗎? 當然可以啊親,而且它支持函數的所有參數形式。要知道生成器函數也是函數的 種:) def COUnter (Start=O): While TrUe :yimld StartStart += 1這是個從指定數開始的計數器。2. 既然生成器函數也是函數,那么它可以使用return輸出返回值嗎?不行的親,是這樣的,生成器函數已經有默認的返回值一一生成器了,你不能再另外給 個返回值:對,即使是return NOne也不行。但是它可以使用空的return語句結束。如果你堅
33、持要為它指定返回值,那么PythOn將在定義的位置贈送個語法錯謀異常, 就像這樣: def i_v;anna_return (): yimld NOneretUrn NOne File r Iine 3 SyntaXErrOr:,return, v;ith argument inside generator3. 好吧,那人家需要確保釋放資源,需要在try.finally中yield,這會是神馬情況?(我 就是想玩你)我在finally中還Yield 了一次!PythOn會在真正離開try.finally時再執行finally中的代碼,而這里遺憾地告訴你,暫 停不算哦!所以結局你也能猜到吧! d
34、ef Play_u (): try:yim:LCilyield 2yimld 3 finally:yim:LClo for VaI in PIay_u () : Print ValZ 12 3 0*這與return的情況不同。return是真正的離開代碼塊,所以會在return時立刻執行 finally 句。*另夕卜,在帶有finally 了句的try塊中yield定義在PEP 342中這意味著只有PythOn 2.5以上版本才支持這個語法,在PythOn 2.4以下版本中會得到語法錯誤異常。4. 如果我需要在生成器的迭代過程中接入另一個生成器的迭代怎么辦?寫成下面這樣好 傻好天真。 def
35、SUbgenerator ():yimld 1yimld 2 for Val in COUnter (10) : yield VaI5. 這種情況的語法改進已經彼定義在PEP 380:委托至/生成器的語法中,據說會在 Python 3.3中實現屆時也可能回饋到2x中。實現后,就可以這么寫了: def SUbgenerator (): yimld 1 yimld 2yimld from COUnter (10)FiIe , Iine 4yield from COUnter (10)ASyntaXErrOr: invalid SyntaX看到語法錯謀木有?現在我們還是天真點吧4.3. 協同程序(C
36、OrOUtine)協同程序(協程)般來說是指這樣的函數:彼此間有不同的局部變量.指令指針,但仍共學全局變量;可以方便地掛起、恢復,并且有多個入口點和出口點:多個協同程序間衣現為協作運行,如A的運行過程中需要B的結果才能繼續執行。協程的特點決定了同時刻只能有個協同程序正在運行(忽略多線程的情況)。得益于此, 協程間可以直接傳遞對象而不需要考慮資源鎖.或是直接喚醒其他協程而不需妥主動休眠,就 像是內置了鎖的線程。在符合協程特點的應用場景,使用協程無疑比使用線程要更方便。從另方聞說,協程無法并發其實也將它的應用場景限制在了 個很狹窄的范圍,這個特點使 得協程更多的彼拿來與常規函數進行比較,而不是與線程。當然,線程比協程復雜許多,功能 也更強人,所以我建議人家牢牢地掌握線程即可:PythOn線程指南這節里我也就不列舉關于協程的例了了,以下介紹的方法了解即可。PythO
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025新進廠職工安全培訓考試試題帶答案解析
- 2025年各個班組安全培訓考試試題及參考答案(B卷)
- 【部編版】四年級語文下冊口語交際《朋友相處的秘訣》精美課件
- 2025機械設備購銷合同范本下載
- 2025租賃合同印花稅計算
- 2025勞動法律對勞動合同的新規定
- 【部編版】四年級語文下冊《語文園地二》精美課件
- 紋身模特合作協議書
- 藥店醫保協議續簽委托書
- 2025企業物業保安勞動合同模板
- 第18課《井岡翠竹》課件-2024-2025學年統編版語文七年級下冊
- 公立醫院成本核算指導手冊
- 第七章-生物醫學工程的倫理問題
- MOOC 中醫與辨證-暨南大學 中國大學慕課答案
- 年產10噸功能益生菌凍干粉的工廠設計改
- 中聯HIS系統掛號收費 操 作 說 明
- HIT(肝素誘導的血小板減少癥)課件
- Mayo肘關節功能評分
- 螺栓加工工序卡(共7頁)
- 《焦慮癥基礎知識》PPT課件.ppt
- 基于鉆石模型的南通紡織產業競爭力分析
評論
0/150
提交評論