摘要:先不講數據結構了,這次來說說中一些不被注意的功能。直接交換第二個功能。對的長度使用生成一個序列,然后遍歷或者這樣第三個功能。其實還接受第二個參數,它的作用是在迭代的過程中如果碰到第二個參數則停止。
先不講數據結構了,這次來說說python中一些不被注意的功能。
在python的設計哲學中,有這么一條內容:“Simple is better than complex”,簡單的代碼比復雜的要好,這也是為什么python被推薦為初學者必學的語言。很多人初學python,往往會受到其他語言的影響,比如之前學過java的,把python代碼寫的像java一樣。舉個例子,在java中設計一個類時,我們常常會為內部變量定義get和set方法,這是保證封裝性的重要手段,但是在python中卻不建議這樣做,python中的內部變量使用單下劃線表示(比如self.__name),不過這樣定義了還是可以訪問到私有變量。怎么說?python中使用約定,我不會強制說這個變量你不能訪問,但是你最好不要這樣做。如果需要對變量進行其他操作,使用@parameter裝飾器進行get和set封裝,這樣直接訪問內部變量會出錯。講偏了,關于類和對象這方面的內容以后再說。
你如果打開python交互環境,輸入import this可以看到以下內容:
The Zen of Python, by Tim Peters
Beautiful is better than ugly. 優美勝于丑陋
Explicit is better than implicit. 明了勝于晦澀
Simple is better than complex. 簡單勝過復雜
Complex is better than complicated. 復雜勝過凌亂
Flat is better than nested. 扁平勝于嵌套
Sparse is better than dense. 間隔勝于緊湊
......
這些是python的設計哲學,后面還有一些沒列出來,在寫python代碼時最好遵從這些設計哲學。
第一個功能。
如果讓你寫一段代碼表示a大于2且小于10,大多數人都會用a > 2 && a < 10對吧,在python中你可以直接使用2 < a < 10。
a = 5 # 可以這樣 print(2 < a < 10) # 也可以這樣 print(10 > a <= 9)
True True
還有一個很多人可能都知道的技巧,就地交換值,而不需要中間變量。
a = 2 b = 3 print(a, b) # 直接交換 a, b = b, a print(a, b)
2 3 3 2
第二個功能。
我們常常會需要用for循環來遍歷序列中的值,然后進行某些操作。在其他語言中你可能這么寫:
a = ["a", "b", "c", "d", "e"] for(int i = 0; i < len(a); i++): print(a[i])
在python中很多人會這么寫,對a的長度使用range生成一個序列,然后遍歷。
a = ["a", "b", "c", "d", "e"] # 對a的長度使用range生成一個序列,然后遍歷 for i in range(len(a)): print(a[i])
a b c d e
其實你可以這樣寫,直接使用enumerate方法,它會返回序列的下標和值。
a = ["a", "b", "c", "d", "e"] # 對a的長度使用range生成一個序列,然后遍歷 for i in enumerate(a): print(i) # 或者這樣 for index, value in enumerate(a): print(index, value)
(0, "a") (1, "b") (2, "c") (3, "d") (4, "e") 0 a 1 b 2 c 3 d 4 e
第三個功能。
一般情況下,循環語句和條件判斷語句是互不相干的,if后面就是else,for之后是in。其實循環語句后面也可以跟著else。for之后跟著else的意思是,運行這個循環,然后執行else中的語句。
for i in foo: if i == 0: break else: print("i was never 0")
除了for循環后面可以跟著else,while和try/except之后也可以跟著else。
第四個功能。
用過字典的都知道,如果我們需要字典中某個鍵的值,可以使用d["key"]來獲取,如果key不存在的話會拋出異常,這樣肯定不好了,如果使用d.get("key"),在key值不存在時會默認返回None,這樣就不用關心是否會有異常發生。其實還可以這樣,d.get("key", 0),第二個參數指定key不存在時用來代替的值。
第五個功能。
正則表達式是個很讓人頭疼的東西,如果能加上注釋該多好,這樣我就知道自己寫的是什么了。在Python中你可以這樣。
# 對每一個規則使用引號括起來 pattern = ( "^" # beginning of string "M{0,4}" # thousands - 0 to 4 M"s "(CM|CD|D?C{0,3})" # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C"s), # or 500-800 (D, followed by 0 to 3 C"s) "(XC|XL|L?X{0,3})" # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X"s), # or 50-80 (L, followed by 0 to 3 X"s) "(IX|IV|V?I{0,3})" # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I"s), # or 5-8 (V, followed by 0 to 3 I"s) "$" # end of string ) print(pattern) # 然后bapattern放入對應的re匹配方法中。
^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$
第六個功能。
在上一篇迭代器和生成器中說過,iter()函數可以生成一個迭代器,之后你就能使用循環或者next方法來產出值。其實iter還接受第二個參數,它的作用是在迭代的過程中如果碰到第二個參數則停止。看個例子:
def seek_next_line(f): for c in iter(lambda: f.read(1)," "): pass
上面的代碼中,從f中循環讀入,如果碰到 則結束讀取。
其他的技巧像使用生成器表達式,利用拆包方法等等,之前都有說過,這里不再贅述。
本人才疏學淺,上文中難免有些錯誤,還請各位品評指正。如果覺得寫的還行,歡迎關注我的公眾號MLGroup,帶你走進機器學習的世界。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41036.html
摘要:可見裝飾器改變了函數的功能。裝飾器除了改變函數功能之外還有一個特性是,函數裝飾器在導入模塊時立即執行,而被裝飾的函數只在明確調用時運行。 什么是裝飾器 裝飾器是什么,簡單來說,裝飾器可以改變一個函數的行為,比如原本有一個函數用來計算菲波那切數列,我們給這個函數加個計算執行時間的裝飾器,這樣原來的函數不僅能夠計算菲波那切數列,而且還可以輸出計算花費了多少時間。 在Python中,有幾個很...
摘要:來說說迭代器和生成器,還有可迭代對象和生成器表達式。有點繞是不是,其實,一般只要知道可迭代對象以及它是如何實現的就行了,中常常用生成器來代替迭代器,可以說,生成器就是迭代器。 來說說迭代器和生成器,還有可迭代對象和生成器表達式。 之前簡單的提到過,一個對象是可迭代的可以理解為能夠使用for循環。這樣說其實不太準確,某個對象可迭代是因為它內部實現了$__iter__$這個特殊方法。比如在...
摘要:找出列表中小于的數據除了列表推導式,還有字典推導式,集合推導式,用法都一樣。如果你的數據量很大的話,考慮使用生成器表達式。切片不僅對列表有用,同樣適用于元組和字符串。切片命名使用方法,內部參數與切片一樣。對剩余的的數據,使用星號代替即可。 上次我們講了幾個不常見的數據類型,每個都有自己特殊的用途,雖然不經常用到,了解一下也好。比如我們提到的數組類型,如果在數據量很大的時候同時要效率,就...
摘要:字典和集合都是基于散列表實現的,散列表也就是表,了解過數據結構的應該知道。而使用另一種辦法,任何鍵在找不到的情況下都會用中的值數據類型比如替換。在設計時就可以使用創建你的數據接口。 這次主要說說字典和集合這兩種數據類型。 字典和集合都是基于散列表實現的,散列表也就是hash表,了解過數據結構的應該知道。與散列表相關的一個概念叫做可散列,什么是可散列?在python官方定義中是這樣說的:...
摘要:擠掉了堆中實現了堆排序。你可以用堆排序來查找一個序列中最大的或者最小的幾個元素。除了使用堆排序,中還有排序和,這兩個排序最終生成以列表表示的排序結果,堆排序也是。 這次我們來說說python中的數據結構。當然了,不會講很基礎的內容。 用過python的都知道,python有著與其他語言很不一樣的數據類型,像什么列表、元組、集合、字典之類。這些數據類型造就了python簡單易用同時又很強...
閱讀 921·2021-10-13 09:48
閱讀 3907·2021-09-22 10:53
閱讀 3114·2021-08-30 09:41
閱讀 1942·2019-08-30 15:55
閱讀 2920·2019-08-30 15:55
閱讀 1838·2019-08-30 14:11
閱讀 2204·2019-08-29 13:44
閱讀 763·2019-08-26 12:23