精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python語言中計數方法的演變

開發 后端
有時候,利用Python語言簡潔、優雅地解決問題的方法,會隨著時間變化。隨著Python不斷進化,統計列表元素數量的方法也在改變。

有時候,利用Python語言簡潔、優雅地解決問題的方法,會隨著時間變化。隨著Python不斷進化,統計列表元素數量的方法也在改變。

以計算元素在列表中出現的次數為例,我們可以編寫出許多不同的實現方法。在分析這些方法時,我們先不關注性能,只考慮代碼風格。

[[155873]]

要理解這些不同的實現方式,我們得先知道一些歷史背景。幸運的是,我們生活在"future"世界,擁有一臺時間機器。接下來,我們一起坐上時光機,回到1997年吧。

if 語句

1997年1月1日,我們使用的是Python 1.4。現在有一個不同顏色組成的列表,我們想知道列表里每種顏色出現的次數。我們用字典來計算吧!

colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = {} for c in colors: if color_counts.has_key(c): color_counts[c] = color_counts[c] + 1 else: color_counts[c] = 1

注意:我們沒有使用+=,因為增量賦值直到Python 2.0才出現;另外,我們也沒有使用c in color_counts這個慣用法(idiom),因為這也是Python 2.2中才發明的,

運行上述代碼之后,我們會發現color_counts字典里,現在包含了列表中每種顏色的出現次數。

>>> color_counts
{'brown': 3, 'yellow': 2, 'green': 1, 'black': 1, 'red': 1}

上面的實現很簡單。我們遍歷了每一種顏色,并判斷該顏色是否在字典中。如果不在,就在字典加入該顏色;如果在,就增加這種顏色的計數。

我們還可以把上面的代碼改寫為:

colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = {} for c in colors: if not color_counts.has_key(c): color_counts[c] = 0 color_counts[c] = color_counts[c] + 1

如果列表稀疏度高(即列表中不重復的顏色數量很多),這段代碼可能運行的會有點慢。因為我們現在要執行兩個語句,而不是一個。但是我們不關心性能問題,我們只關注編碼風格。經過思考,我們決定采用新版的代碼。

try代碼塊(Code Block)

1997年1月2日,我們使用的還是Python 1.4。今早醒來的時候,我們突然意識到:我們的代碼遵循的是“三思而后行”(Look Before You Leap,即事先檢查每一種可能出現的情況)原則,但實際上我們應該按照“獲得諒解比獲得許可容易”(Easier to Ask Forgiveness, Than Permission,即不檢查,出了問題由異常處理來處理)的原則進行編程,因為后者更加簡潔、優雅。我們用try-except代碼塊來重構下代碼吧:

colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = {} for c in colors: try: color_counts[c] = color_counts[c] + 1 except KeyError: color_counts[c] = 1

現在,我們的代碼嘗試增加每種顏色的計數。如果某顏色不在字典里,那么就會拋出KeyError,我們隨之將該顏色的計數設置為1。

get方法

1998年1月1日,我們已經升級到了Python 1.5。我們決定重構之前的代碼,使用字典中新增的get方法。

colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = {} for c in colors: color_counts[c] = color_counts.get(c, 0) + 1

現在,我們的代碼會遍歷每種顏色,從字典中獲取該顏色的當前計數值。如果沒有這個計數值,則該顏色的計數值默認為0,然后在數值的基礎上加1。***將字典中相應鍵的值設置為新的計數。

把主要代碼都寫在一行里,感覺很酷,但是我們不敢完全肯定這種做法更加簡潔、優雅。我們覺得可能有點太聰敏了,所以還是撤銷了這次的重構。

setdefault方法

2001年1月1日,我們現在使用的是Python 2.0。我們聽說字典類型現在有一個setdefault方法,決定利用它重構我們的代碼。我們還決定使用新增加的+=增量賦值運算符。

colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = {} for c in colors: color_counts.setdefault(c, 0) color_counts[c] += 1

無論是否需要,我們在每一次循環時都會調用setdefault方法。但這樣做,的確會讓代碼看上去可讀性更高。我們發現這種方法比之前的代碼更加簡潔、優雅,所以提交了此次修改。

fromkeys方法

2004年1月1日,我們使用的是Python 2.3。我們聽說字典新增了一個叫fromkeys的類方法(class method),可以利用列表中的元素作為鍵來構建字典。我們使用新方法重構了代碼:

colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = dict.fromkeys(colors, 0) for c in colors: color_counts[c] += 1

這段代碼將不同的顏色作為鍵,創建了一個新的字典,每個鍵的值被默認設置為0。這樣,我們增加每個鍵的值時,就不用擔心是否已經進行了設置。我們也不需要在代碼中進行檢查或異常處理了,這看上去是個改進。我們決定就這樣修改代碼。

推導式(Comprehension)與集合

2005年1月1日,我們現在用的是Python 2.4。我們發現可以利用集合(Python 2.3中發布,2.4版成為內置類型)與列表推導式(Python 2.0中發布)來解決計數問題。進一步思考之后,我想起來Python 2.4中還發布了生成器表達式(generator expressions),我們***決定不用列表推導式,而是采用生成器表達式。

colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = dict((c, colors.count(c)) for c in set(colors))

注意:我們這里使用的不是字典推導式,因為字典推導式直到Python 2.7才被發明。

運行成功了,而且只有一行代碼。但是這種代碼夠簡潔、優雅嗎 ?

我們想起了Python之禪(Zen of Python),這個Python編程指導原則起源于一個Python郵件列表,并悄悄地收進了Python 2.2.1版本中。我們在REPL(read-eval-print loop,交互式解釋器)界面中輸入import this

>>> 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. # 稀疏勝過密集
Readability counts. # 易讀亦有價
Special cases aren't special enough to break the rules. # 特例也不能特殊到打破規則
Although practicality beats purity. # 盡管實用會擊敗純潔
Errors should never pass silently. # 錯誤永遠不應默默地溜掉
Unless explicitly silenced. # 除非明確地使其沉默
In the face of ambiguity, refuse the temptation to guess.  # 面對著不確定,要拒絕猜測的誘惑
There should be one-- and preferably only one --obvious way to do it.  # 應該有一個–寧肯只有一個–明顯的實現方法
Although that way may not be obvious at first unless you're Dutch. # 也許這個方法開始不是很明顯,除非你是荷蘭人
Now is better than never. #現在做也要勝過不去做
Although never is often better than right now. # 盡管不做通常好過立刻做
If the implementation is hard to explain, it's a bad idea. # 如果實現很難解釋,那它就是一個壞想法
If the implementation is easy to explain, it may be a good idea. # 如果實現容易解釋,那它可能就是一個好想法
Namespaces are one honking great idea -- let's do more of those! # 命名空間是一個響亮的出色想法–就讓我們多用用它們

譯者注:Python之禪的翻譯版本很多,這里選用的譯文出自啄木鳥社區。

我們的代碼變得更復雜,時間復雜度從O(n)增加到了O(n2);還變的更丑,可讀性更差了。我們那樣改,是一次有趣的嘗試,但是一行代碼的實現形式,沒有我們之前的方法簡潔、優雅。我們***還是決定撤銷修改。

defaultdict方法

2007年1月1日,我們使用的是Python 2.5。我們剛發現,defaultdict已經被加入標準庫。這樣,我們就可以把字典的默認鍵值設置為0了。讓我們使用defaultdict重構代碼:

from collections import defaultdict
    colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = defaultdict(int) for c in colors: color_counts[c] += 1

那個for循環現在變得真簡單!這樣肯定是更加簡潔、優雅了。

我們發現,color_counts這個變量的行為現在有點不同,但是它的確繼承了字典的特性,支持所有相同的映射功能。

>>> color_counts
defaultdict(<type 'int'>, {'brown': 3, 'yellow': 2, 'green': 1, 'black': 1, 'red': 1})

我們在這里沒有把color_counts轉換成字典,而是假設其他的代碼也使用鴨子類型(duck typing, Python中動態類型的一種,這里的意思是:其他代碼會將color_counts視作字典類型),不再改動這個類似字典的對象。

Counter

2011年1月1日,我們使用的是Python 2.7。別人告訴我們,之前使用defaultdict編寫的代碼,不再是統計顏色出現次數最簡潔、優雅的方法了。Python 2.7中新引入了一個Counter類,可以完全解決我們的問題。

from collections import Counter
colors = ["brown", "red", "green", "yellow", "yellow", "brown", "brown", "black"] color_counts = Counter(colors)

還有比這更簡單的方法嗎?這個一定是最簡潔、優雅的實現了。

defaultdict一樣,Counter類返回的也是一個類似字典的對象(實際是字典的一個子類)。這對滿足我們的需求來說足夠了,所以我們就這么干了。

>>> color_counts
Counter({'brown': 3, 'yellow': 2, 'green': 1, 'black': 1, 'red': 1})

性能考慮

請注意,在編寫這些實現方式時,我們都沒有關注效率問題。大部分方法的時間復雜度相同(O(n)),但是不同的Python語言實現形式(如CPython, PyPy,或者Jython)下,運行時間會有差異。

盡管性能不是我們的主要關注點,我還是在CPython 3.5.0的實現下測試了運行時間。從中,你會發現一個有趣的現象:隨著列表中顏色元素的密度(即相同元素的數量)變化,每一種實現方法的相對效率也會不同。

結語

根據Python之禪,“ 應該有一個——寧肯只有一個明顯的實現方法”。這句話所說的狀態值得追求,但事實是,并不總是只有一種明顯的方法。這個“明顯”的方法會隨著時間、需求和專業水平,不斷地變化。

“簡潔、優雅”(即Pythonic)也是一個相對的概念。

責任編輯:王雪燕 來源: 編輯派
相關推薦

2009-06-12 14:18:20

構造方法Java語言Java教程

2010-02-23 14:08:04

Python語言

2010-04-01 16:17:37

Oracle復制

2021-07-26 09:47:38

Go語言C++

2010-03-26 17:34:29

Python歷史

2010-03-11 19:16:32

Python語言

2010-07-20 10:02:15

Perl類

2023-08-15 08:01:07

Go 語言排序

2024-04-07 11:33:02

Go逃逸分析

2021-07-15 23:18:48

Go語言并發

2009-07-08 12:43:59

Scala ServlScala語言

2023-12-21 07:09:32

Go語言任務

2021-06-07 23:19:44

Golang語言 Defer

2010-07-26 16:23:23

Perl語言

2023-11-30 08:09:02

Go語言

2021-06-08 07:45:44

Go語言優化

2023-07-29 15:03:29

2011-05-13 17:25:34

C

2021-04-28 09:02:48

Golang語言Context

2010-01-15 19:17:48

C++語言
點贊
收藏

51CTO技術棧公眾號

91在线云播放| 国产综合网站| 欧美视频在线一区二区三区| 五月天色一区| 国产精品乱码久久久| 一区二区中文字| 亚洲精品福利视频| 五月婷婷狠狠操| 手机av在线播放| 久久这里只有精品视频网| 国产精品日韩在线播放| 精品一区二区三区四| 精品国产精品国产偷麻豆| 欧美一级日韩一级| 男人揉女人奶房视频60分| 激情在线小视频| 99久久国产综合精品色伊| 国产日韩欧美综合| 在线观看 中文字幕| 先锋资源久久| 国产亚洲欧美日韩一区二区| 日本少妇一级片| 69久成人做爰电影| 亚洲综合一区在线| 亚洲欧洲精品一区二区| 五月婷婷免费视频| 国产精品中文有码| 国产精品爽黄69| 欧美日韩综合一区二区三区| 欧美天天视频| 久久在线免费观看视频| 中文乱码人妻一区二区三区视频| 国产精品1区在线| 欧美性淫爽ww久久久久无| 国精产品一区一区三区视频| a级网站在线播放| 国产精品视频一区二区三区不卡| 999热视频| 国产精品久久欧美久久一区| 丝袜a∨在线一区二区三区不卡 | aa片在线观看视频在线播放| 精品一区91| 91麻豆精品国产无毒不卡在线观看| 男女曰b免费视频| 在线观看特色大片免费视频| 亚洲成av人片观看| 国产高清av在线播放| 在线黄色网页| 亚洲精品水蜜桃| 蜜臀av.com| 99视频免费在线观看| 综合色天天鬼久久鬼色| 一区二区三区四区视频在线观看| av在线资源站| 中文字幕不卡在线播放| 日韩欧美激情一区二区| 韩国免费在线视频| 国产日韩av一区二区| 热舞福利精品大尺度视频| 欧美一区二区少妇| 久久精品网站免费观看| 日本精品免费| 日本视频不卡| 一区二区三区在线免费观看| 国产91沈先生在线播放| www欧美xxxx| 欧美日韩精品中文字幕| 国内外免费激情视频| 欧美中文字幕精在线不卡| 日本韩国欧美三级| 国产免费999| 亚洲美女色播| 日韩欧美国产一区二区在线播放| 中文字幕无人区二| 欧美三级午夜理伦三级在线观看| 亚洲美女动态图120秒| 中文字幕免费视频| 先锋资源久久| 97人人做人人爱| 中文字幕免费观看| 久久99热国产| 国产精品jizz视频| 欧美视频免费一区二区三区| 亚洲国产精品二十页| 一区二区高清视频| h片精品在线观看| 色综合久久久久网| 亚洲18在线看污www麻豆 | 美女一区二区三区在线观看| 91精品久久久久久久久中文字幕| 亚洲第一天堂影院| 久久久精品综合| 91精品一区二区三区四区| a天堂资源在线| 欧美视频在线一区| 亚洲一区二区三区黄色| 欧美日韩激情| 欧美精品18videosex性欧美| 麻豆精品久久久久久久99蜜桃| 久久电影网站中文字幕| 激情视频一区二区| 暖暖日本在线观看| 黄色91在线观看| www.久久久久久久久久久| 另类尿喷潮videofree| 最近2019中文免费高清视频观看www99 | 亚洲尤物视频在线| 国语对白做受xxxxx在线中国| 91麻豆精品国产91久久久更新资源速度超快| 精品美女被调教视频大全网站| 国产视频三区四区| 91久久综合| 91深夜福利视频| 国产露出视频在线观看| 亚洲综合丁香婷婷六月香| 午夜宅男在线视频| 亚洲盗摄视频| 欧美激情xxxx| 国产麻豆免费视频| 亚洲国产精品激情在线观看| 波多野结衣家庭教师在线| 国产免费av国片精品草莓男男 | 免费在线看黄| 色诱亚洲精品久久久久久| 久久久久中文字幕亚洲精品 | www.久久东京| 久久久国产一区二区| 亚洲天堂一区在线| 成人不卡免费av| 激情图片qvod| 精品国产亚洲一区二区三区| 国产一区二区三区精品久久久| 日韩三级视频在线| 高清视频一区二区| dy888午夜| 日韩av黄色| 中文字幕亚洲自拍| 91在线视频免费播放| 91丨porny丨国产入口| 成人网站免费观看入口| 亚洲精品不卡在线观看| 久久综合88中文色鬼| 国产又粗又猛又黄又爽| 国产精品视频在线看| the porn av| 日韩av大片| 国产欧美va欧美va香蕉在线| 91福利在线视频| 欧美调教femdomvk| 美国精品一区二区| 日精品一区二区| 国产精品我不卡| 国产三线在线| 亚洲电影av在线| 日本道在线观看| 久久久九九九九| 999精彩视频| 午夜av一区| 99精品国产高清一区二区| 性欧美video高清bbw| 日韩午夜在线观看| 国产一卡二卡在线播放| 97久久超碰国产精品电影| 欧美亚洲一二三区| 女厕嘘嘘一区二区在线播放 | 日本韩国欧美精品大片卡二| 日韩欧美亚洲系列| 欧美又粗又大又爽| 久久国产波多野结衣| 国产成人在线视频免费播放| 免费不卡av在线| 国产99久久| 成人在线国产精品| 不卡av免费观看| 亚洲欧美一区二区三区久久| 亚洲性生活大片| 一区二区视频免费在线观看| 日韩精品视频一区二区| 性欧美videos另类喷潮| 亚洲国产日韩综合一区| 欧美经典影片视频网站| 777精品视频| 自拍视频在线免费观看| 日韩精品一区二| 极品国产91在线网站| 亚洲欧洲av在线| 大乳护士喂奶hd| 日韩av一级片| 精品视频在线观看一区二区| 一区二区三区四区在线看| 国产一区二区丝袜高跟鞋图片| 在线观看操人| 亚洲色图色老头| 国内老熟妇对白xxxxhd| 色综合天天综合网天天看片| 天天看天天摸天天操| 99久久国产免费看| 欧美激情第四页| 久久精品电影| 台湾无码一区二区| 欧美日韩中文字幕一区二区三区| 97自拍视频| 看片一区二区| 欧美一级片一区| av在线官网| 国产一区二区黄| 综合网中文字幕| 国产精品99精品| 国产精品乱码妇女bbbb| 成年人的黄色片| 国产在线日韩欧美| 国产精品欧美激情在线观看| 在线观看日韩| 亚洲成色www久久网站| 伦理一区二区三区| 亚洲一区二区久久久久久 | 日本欧美精品在线| 天堂va在线| 久久天天躁狠狠躁夜夜爽蜜月| 午夜福利一区二区三区| 日韩精品中文字幕一区| 在线观看黄色国产| 在线欧美日韩国产| 五月婷婷亚洲综合| 亚洲一区二区三区四区五区黄| 亚洲欧美另类日本| 国产欧美一二三区| 国产熟妇搡bbbb搡bbbb| 成人美女视频在线观看| aaaaaaaa毛片| 国产精品中文有码| 日韩欧美中文视频| 久99久精品视频免费观看| 欧美黑人又粗又大又爽免费| 一本色道精品久久一区二区三区| 天堂8在线天堂资源bt| 欧美精品二区| 日韩国产精品毛片| 91精品91| 青青视频免费在线| 在线看片不卡| 日韩专区第三页| 欧美日本不卡高清| 人妻无码一区二区三区四区| 一区二区三区在线电影| 欧美性受黑人性爽| 欧美91福利在线观看| 香蕉视频免费版| 黄页网站一区| 成人在线观看你懂的| 在线亚洲免费| 国产偷人视频免费| 日韩国产高清影视| 亚洲国产高清av| 精品亚洲国产成人av制服丝袜 | 久草热在线观看| 欧美性生活影院| 影音先锋黄色网址| 666欧美在线视频| av网站在线观看免费| 日韩三级中文字幕| 少妇高潮久久久| 亚洲天堂日韩电影| 888av在线| 欧美精品在线免费观看| 国产网红在线观看| 日本欧美精品在线| 祥仔av免费一区二区三区四区| 91久久国产婷婷一区二区| 51亚洲精品| 欧美日本亚洲| 91精品国产福利在线观看麻豆| 久久久久福利视频| 国产精品视频| 国产三级三级看三级| 国产一区二区三区在线观看免费| 6080国产精品| 99精品久久只有精品| 日本一区二区视频在线播放| 亚洲丝袜精品丝袜在线| 国产午夜视频在线播放| 欧洲激情一区二区| 精品国自产拍在线观看| 亚洲精品在线看| 日本最黄一级片免费在线| 欧美激情a在线| 超碰这里只有精品| aaa级精品久久久国产片| 亚洲成人一品| 91精品国产吴梦梦| 天堂资源在线中文精品| 亚洲综合123| 久久综合久久99| 国产suv一区二区三区| 欧美视频免费在线观看| 99久久精品日本一区二区免费| 亚洲黄色片网站| 欧美激情二区| 欧美在线免费视频| 蜜桃精品视频| 无码免费一区二区三区免费播放| 午夜天堂精品久久久久| 不要播放器的av网站| 国产成人免费在线观看| 一级片久久久久| 天天综合色天天| 99国产在线播放| 国产亚洲一区精品| 不卡视频观看| 97人人模人人爽人人少妇| 成人av动漫在线观看| 久久久久久久中文| 国产福利视频一区二区三区| 久久午夜精品视频| 欧美性猛交丰臀xxxxx网站| 国产成人麻豆精品午夜在线| 国产亚洲欧美aaaa| 国产免费不卡| 国产在线精品一区| 欧美日本一区二区视频在线观看 | 成人免费在线观看视频| 久久国产一区| 亚洲成人中文| 亚洲成人精品在线播放| 国产精品的网站| www.av88| 国产亚洲在线播放| 美女日韩欧美| 欧美二区在线看| 99av国产精品欲麻豆| 国产乱淫av片| 亚洲激情综合网| 国产色综合视频| www.亚洲男人天堂| 久久91视频| 亚洲成人网上| 久久91精品久久久久久秒播| 受虐m奴xxx在线观看| 欧美日韩精品在线| 日本成人一区| 国产91在线播放精品91| 在线观看欧美理论a影院| 国产91xxx| 91在线国产观看| 少妇一级淫片免费放中国| 亚洲精品动漫100p| 女厕盗摄一区二区三区| 噜噜噜噜噜久久久久久91| 西西人体一区二区| 91精品人妻一区二区三区蜜桃欧美| 欧美日韩中文字幕在线视频| 五月婷婷综合久久| 秋霞午夜一区二区| 欧美日韩久久精品| 国产精品区在线| 专区另类欧美日韩| 国产黄色免费大片| 欧美—级a级欧美特级ar全黄| 成人爽a毛片| 浮妇高潮喷白浆视频| 久久精品视频在线看| 精人妻无码一区二区三区| 综合久久五月天| 免费观看性欧美大片无片| a天堂资源在线观看| 成人av中文字幕| 无码aⅴ精品一区二区三区| 在线日韩中文字幕| 国产一区精品二区| 亚洲精品无码国产| 久久蜜桃香蕉精品一区二区三区| 国产美女www爽爽爽| 久久不射热爱视频精品| 盗摄牛牛av影视一区二区| 国产aaa一级片| 国产精品福利一区二区三区| www.亚洲天堂.com| 4k岛国日韩精品**专区| 亚洲婷婷丁香| 九九热精品国产| 疯狂做受xxxx高潮欧美日本 | 日韩av三区| 亚洲色图久久久| 一区二区免费在线播放| 日av在线播放| 亚洲999一在线观看www| 国产亚洲高清视频| 亚洲熟女毛茸茸| 日韩av影视在线| 色婷婷成人网| 久在线观看视频| 综合欧美亚洲日本| 水中色av综合| 亚洲在线免费观看| 毛片一区二区| 欧美日韩人妻精品一区二区三区| 精品亚洲永久免费精品| 国产区一区二| 日日摸天天爽天天爽视频| 亚洲黄色录像片|