摘要:模塊的模塊是處理迭代器的工具集合。迭代器是一種可以在循環語句包括列表元組和字典中使用的數據類型。使用模塊中的函數讓你可以執行很多迭代器操作,這些操作通常需要多行函數和復雜的列表理解。
Python 多好用不用多說,大家看看自己用的語言就知道了。但是 Python 隱藏的高級功能你都 get 了嗎?本文中,列舉了 Python 中五種略高級的特征以及它們的使用方法,快來一探究竟吧!
Python 是一種美麗的語言,它簡單易用卻非常強大。但你真的會用 Python 的所有功能嗎?
任何編程語言的高級特征通常都是通過大量的使用經驗才發現的。比如你在編寫一個復雜的項目,并在 stackoverflow 上尋找某個問題的答案。然后你突然發現了一個非常優雅的解決方案,它使用了你從不知道的 Python 功能!
這種學習方式太有趣了:通過探索,偶然發現什么。這里推薦一下我們的Python學習扣qun:784,758,214,這里是python學習者聚集地
下面是 Python 的 5 種高級特征,以及它們的用法。
Lambda 函數
Lambda 函數是一種比較小的匿名函數——匿名是指它實際上沒有函數名。
Python 函數通常使用 def a_function_name() 樣式來定義,但對于 lambda 函數,我們根本沒為它命名。這是因為 lambda 函數的功能是執行某種簡單的表達式或運算,而無需完全定義函數。
lambda 函數可以使用任意數量的參數,但表達式只能有一個。
1. x?=?lambda?a,?b?:?a?*?b? 2. print(x(5,?6))?#?prints?"30"? 4. x?=?lambda?a?:?a*3?+?3? 5. print(x(3))?#?prints?"12"?
看它多么簡單!我們執行了一些簡單的數學運算,而無需定義整個函數。這是 Python 的眾多特征之一,這些特征使它成為一種干凈、簡單的編程語言。
Map 函數
Map() 是一種內置的 Python 函數,它可以將函數應用于各種數據結構中的元素,如列表或字典。對于這種運算來說,這是一種非常干凈而且可讀的執行方式。
1. def?square_it_func(a):? 2. return?a?*?a? 4. x?=?map(square_it_func,?[1,?4,?7])? 5. print(x)?#?prints?"[1,?16,?47]"? 7. def?multiplier_func(a,?b):? 8. return?a?*?b? 10. x?=?map(multiplier_func,?[1,?4,?7],?[2,?5,?8])? 11. print(x)?#?prints?"[2,?20,?56]"看看上面的示例!我們可以將函數應用于單個或多個列表。實際上,你可以使用任何?Python?函數作為?map?函數的輸入,只要它與你正在操作的序列元素是兼容的。? 這里推薦一下我們的Python學習扣qun:784758214,這里是python學習者聚集地
Filter 函數
filter 內置函數與 map 函數非常相似,它也將函數應用于序列結構(列表、元組、字典)。二者的關鍵區別在于 filter() 將只返回應用函數返回 True 的元素。
詳情請看如下示例:
1. #?Our?numbers? 2. numbers?=?[1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12,?13,?14,?15]? 4. #?Function?that?filters?out?all?numbers?which?are?odd? 5. def?filter_odd_numbers(num):? 7. if?num?%?2?==?0:? 8. return?True? 9. else:? 10. return?False? 12. filtered_numbers?=?filter(filter_odd_numbers,?numbers)? 14. print(filtered_numbers)? 15. #?filtered_numbers?=?[2,?4,?6,?8,?10,?12,?14]?
我們不僅評估了每個列表元素的 True 或 False,filter() 函數還確保只返回匹配為 True 的元素。非常便于處理檢查表達式和構建返回列表這兩步。
Itertools 模塊
Python 的 Itertools 模塊是處理迭代器的工具集合。迭代器是一種可以在 for 循環語句(包括列表、元組和字典)中使用的數據類型。
使用 Itertools 模塊中的函數讓你可以執行很多迭代器操作,這些操作通常需要多行函數和復雜的列表理解。關于 Itertools 的神奇之處,請看以下示例:
1. from?itertools?import?*? 3. #?Easy?joining?of?two?lists?into?a?list?of?tuples? 4. for?i?in?izip([1,?2,?3],?["a",?"b",?"c"]):? 5. print?i? 6. #?("a",?1)? 7. #?("b",?2)? 8. #?("c",?3)? 10. #?The?count()?function?returns?an?interator?that?? 11. #?produces?consecutive?integers,?forever.?This?? 12. #?one?is?great?for?adding?indices?next?to?your?list?? 13. #?elements?for?readability?and?convenience? 14. for?i?in?izip(count(1),?["Bob",?"Emily",?"Joe"]):? 15. print?i? 16. #?(1,?"Bob")? 17. #?(2,?"Emily")? 18. #?(3,?"Joe")????? 20. #?The?dropwhile()?function?returns?an?iterator?that?returns?? 21. #?all?the?elements?of?the?input?which?come?after?a?certain?? 22. #?condition?becomes?false?for?the?first?time.?? 23. def?check_for_drop(x):? 24. print?"Checking:?",?x? 25. return?(x?>?5)? 27. for?i?in?dropwhile(should_drop,?[2,?4,?6,?8,?10,?12]):? 28. print?"Result:?",?i? 30. #?Checking:?2? 31. #?Checking:?4? 32. #?Result:?6? 33. #?Result:?8? 34. #?Result:?10? 35. #?Result:?12? 38. #?The?groupby()?function?is?great?for?retrieving?bunches? 39. #?of?iterator?elements?which?are?the?same?or?have?similar?? 40. #?properties? 42. a?=?sorted([1,?2,?1,?3,?2,?1,?2,?3,?4,?5])? 43. for?key,?value?in?groupby(a):? 44. print(key,?value),?end="?")? 46. #?(1,?[1,?1,?1])? 47. #?(2,?[2,?2,?2])?? 48. #?(3,?[3,?3])?? 49. #?(4,?[4])?? 50. #?(5,?[5])??
Generator 函數
Generator 函數是一個類似迭代器的函數,即它也可以用在 for 循環語句中。這大大簡化了你的代碼,而且相比簡單的 for 循環,它節省了很多內存。
比如,我們想把 1 到 1000 的所有數字相加,以下代碼塊的第一部分向你展示了如何使用 for 循環來進行這一計算。
如果列表很小,比如 1000 行,計算所需的內存還行。但如果列表巨長,比如十億浮點數,這樣做就會出現問題了。使用這種 for 循環,內存中將出現大量列表,但不是每個人都有無限的 RAM 來存儲這么多東西的。Python 中的 range() 函數也是這么干的,它在內存中構建列表。
代碼中第二部分展示了使用 Python generator 函數對數字列表求和。generator 函數創建元素,并只在必要時將其存儲在內存中,即一次一個。這意味著,如果你要創建十億浮點數,你只能一次一個地把它們存儲在內存中!Python 2.x 中的 xrange() 函數就是使用 generator 來構建列表。
上述例子說明:如果你想為一個很大的范圍生成列表,那么就需要使用 generator 函數。如果你的內存有限,比如使用移動設備或邊緣計算,使用這一方法尤其重要。
也就是說,如果你想對列表進行多次迭代,并且它足夠小,可以放進內存,那最好使用 for 循環或 Python 2.x 中的 range 函數。因為 generator 函數和 xrange 函數將會在你每次訪問它們時生成新的列表值,而 Python 2.x range 函數是靜態的列表,而且整數已經置于內存中,以便快速訪問。
1. #?(1)?Using?a?for?loopv? 2. numbers?=?list()? 4. for?i?in?range(1000):? 5. numbers.append(i+1)? 7. total?=?sum(numbers)? 9. #?(2)?Using?a?generator? 10. def?generate_numbers(n):? 11. num,?numbers?=?1,?[]? 12. while?num?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43923.html
摘要:正所謂萬事開頭難,只要邁出了第一步,你就已經成功了一半,古人說的好不積跬步,無以至千里。等到完成之后再回顧這一段路程的時候,你肯定會感慨良多。 同行,沒有不焦慮3...
摘要:通常,這意味著社區的貢獻者會為該語言添加一些有趣和特別的彩蛋以及隱藏的特性當然前提是不會增加在生產環境中使用的風險。據傳這是中的八榮八恥,每個有追求的程序員都應該謹記于心。可讀性應當被重視。面對不明確的定義,拒絕猜測的誘惑。 閱讀文本大概需要 6.6 分鐘。 當一門編程語言是開源的時候,往往會有產生一些搞笑和有趣的東西。通常,這意味著社區的貢獻者會為該語言添加一些有趣和特別的彩蛋以及隱...
摘要:比如把上面畫正方形的例子稍做變化重復執行次畫正方形開始畫正方形結束右轉度執行后,可以看到,畫出一個非常規整漂亮的組合圖案。 turtle圖形庫源于1966年誕生的Logo語言,是入門Python的有趣工具。因其簡單便捷的圖形化方法、和立即反饋式的繪畫效果,成為眾多編程入門者的首選。相對于大多數入門教材中枯燥的語法學習,和函數、方法的演練來說,turtle的趣味性顯得別具一格、極富效...
摘要:英偉達作為的開發合作者,計劃對的深度學習應用推出一系列博客文章。可使用的英偉達深度學習庫和來實現高性能多加速訓練和推理。最近的訓練基準使用了塊的英偉達和神經網絡架構。 昨天,Facebook 推出了 Caffe2,一個兼具表現力、速度和模塊性的開源深度學習框架。它沿襲了大量的 Caffe 設計,可解決多年來在 Caffe 的使用和部署之中發現的瓶頸問題。最終,Caffe2 打開了算法實驗和新...
摘要:一個就像一個樂高玩具。問題是不是你小時候玩兒的那個有趣,它們不是充滿想象力的打氣筒,也不是一種樂高玩具。這是對的并不是給開發者使用的,它們是給庫作者使用的。不會超過這兩種情況。第二個是根據第一個處理函數如何運行來自動變成狀態成功或者失敗。 原文地址:http://blog.getify.com/promis... 在 Part4:擴展問題 中,我討論了如何擴展和抽象Promise是多么...
閱讀 1181·2023-04-26 02:42
閱讀 1633·2021-11-12 10:36
閱讀 1780·2021-10-25 09:47
閱讀 1262·2021-08-18 10:22
閱讀 1801·2019-08-30 15:52
閱讀 1213·2019-08-30 10:54
閱讀 2635·2019-08-29 18:46
閱讀 3496·2019-08-26 18:27