兵貴神速!掌握這10個(gè)python技巧勾扭,讓你代碼工作如魚得水妙色!

1000個(gè)讀者心中有1000個(gè)哈姆雷特,要問1000個(gè)程序員“什么才是最好的語(yǔ)言”,Java慧耍、Python、PHP煌珊、C++ 也都有自己的位置泌豆。但要問編程語(yǔ)言流行指數(shù)之王非踪危,那真的非Python莫屬了。

據(jù)Stack Overflow數(shù)據(jù)顯示畴博,Python是使用量增長(zhǎng)最快的編程語(yǔ)言蓝仲。


福布斯最新發(fā)布的一篇報(bào)告指出袱结,python的使用量在去年增長(zhǎng)了456%。Netfix溢吻、IBM以及其它數(shù)以百計(jì)的公司都在使用python棚饵。包括Dropbox也是由python創(chuàng)建的噪漾。Dice的研究表明且蓬,python是世界上最熱門的技巧之一,根據(jù)編程語(yǔ)言的流行度指數(shù)來看诈胜,python同時(shí)也是最受歡迎的編程語(yǔ)言。

Python為何有如此大的魅力呢焦匈?

那是因?yàn)榛菏欤c其它編程語(yǔ)言相比,Python有以下5點(diǎn)優(yōu)勢(shì):

1垦写、和主流平臺(tái)彰触、操作系統(tǒng)兼容。

2分蓖、包含許多開源框架和工具咆疗。

3母债、編碼具有可讀性和可維護(hù)性

4、強(qiáng)大的標(biāo)準(zhǔn)庫(kù)

5迅皇、標(biāo)準(zhǔn)的測(cè)試驅(qū)動(dòng)開發(fā)

較低的學(xué)習(xí)門檻和廣闊的發(fā)展前景使得Python越來越受歡迎衙熔。今天,小芯就繼續(xù)給大家?guī)碛嘘P(guān)python非常有用的10個(gè)代碼小技巧框咙,幫助你完成日常工作喇嘱,請(qǐng)注意查收和學(xué)習(xí)喲~

1. 用ZIP處理列表

假設(shè)要合并相同長(zhǎng)度的列表并打印結(jié)果塞栅。同樣有一種更通用的方式,即用zip()函數(shù)獲得想要的結(jié)果作烟,代碼如下:

countries=?['France',?'Germany',?'Canada']

capitals?=?['Paris',?'Berlin',?'Ottawa']

for?country, capital?in?zip(countries,capitals):

????print(country, capital)?# FranceParis

??????????????????????????????GermanyBerlin

??????????????????????????????CanadaOttawa

2. 使用python collections

Python collections是容器數(shù)據(jù)類型拿撩,即列表、集合头滔、元組涎显、字典。Collections模塊提供了可以增強(qiáng)代碼的高性能數(shù)據(jù)類型早歇,使工作更加簡(jiǎn)潔容易箭跳。它還提供了許多功能潭千,以下使用Counter()?函數(shù)進(jìn)行演示。

Counter()?函數(shù)采用一個(gè)可迭代對(duì)象(如列表或元組)屉来,并返回一個(gè)Counter字典狈癞。字典的鍵是迭代器中唯一存在的元素蝶桶,每個(gè)鍵的值是該元素在迭代器中出現(xiàn)次數(shù)的計(jì)數(shù)。

為創(chuàng)建一個(gè)Counter對(duì)象脐雪,將一個(gè)迭代的(列表)傳遞給Counter()函數(shù)恢共,代碼如下。

fromcollections?import?Countercount?=?Counter(['a','b','c','d','b','c','d','b'])

print(count)?# Counter({'b': 3, 'c': 2, 'd': 2, 'a': 1})

3. 使用itertools

Python的itertools模塊是用于處理迭代器的工具集合获询。Itertools包含多種工具拐袜,用于生成輸入數(shù)據(jù)的可迭代結(jié)果。這里以itertools.combinations()為例尝哆。itertools.combinations()用于構(gòu)建組合甜攀。這些是輸入量的可能組合項(xiàng)。

舉一個(gè)現(xiàn)實(shí)中的例子來闡明以上觀點(diǎn):

假設(shè)一個(gè)錦標(biāo)賽中有4個(gè)隊(duì)伍恒序,在聯(lián)賽階段歧胁,每個(gè)隊(duì)伍都要與其他每個(gè)隊(duì)伍進(jìn)行比賽厉碟。任務(wù)是列出所有比賽隊(duì)伍的可能組合。

代碼如下:

importitertools

friends?=?['Team 1',?'Team 2',?'Team 3',?'Team 4']

list(itertools.combinations(friends, r=2))?# [('Team 1', 'Team 2'),????? ('Team 1', 'Team 3'),? ('Team 1', 'Team 4'),? ('Team 2', 'Team 3'),? ('Team 2', 'Team 4'),? ('Team 3', 'Team 4')]

需要注意的是崭参,值的順序不重要何暮。因?yàn)?'Team 1', 'Team 2')和('Team 2', 'Team 1')代表同一對(duì)铐殃,所以輸出列表只需包含其中一個(gè)。相似的贰军,可以使用itertools.permutations()以及來自該模塊的其他函數(shù)蟹肘。如需更完整的參考資料,請(qǐng)查閱此教程贰盗。

4. 從函數(shù)中返回多個(gè)值

Python可從函數(shù)調(diào)用中返回多個(gè)值舵盈,這是許多其他流行編程語(yǔ)言所不具備的功能。在這種情況下秽晚,返回值應(yīng)為逗號(hào)分隔的值列表,然后python構(gòu)造一個(gè)元組并返回給調(diào)用方菩浙。代碼示例如下:

defmultiplication_division(num1, num2):

????return?num1*num2, num1/num2product,division?=?multiplication_division(15,?3)

print("Product=", product,?"Quotient =", division)?#Product= 45 Quotient = 5.0

5. 使用列表推導(dǎo)式

列表推導(dǎo)式用于從其他可迭代對(duì)象中創(chuàng)建新列表劲蜻。列表推導(dǎo)式返回列表時(shí)考余,由包含表達(dá)式的方括號(hào)組成,該表達(dá)式對(duì)于每個(gè)元素以及用于循環(huán)遍歷每個(gè)元素的for循環(huán)執(zhí)行疫蔓。由于對(duì)python解釋器進(jìn)行了優(yōu)化钾军,可以在循環(huán)期間發(fā)現(xiàn)可預(yù)測(cè)的模式吏恭,因此列表推導(dǎo)速度更快。

如下哀九,使用列表推導(dǎo)式計(jì)算前五個(gè)整數(shù)的平方:

m?=?[x**?2?for?x?in?range(5)]

print(m)?# [0, 1, 4, 9, 16]

再如搅幅,使用列表推導(dǎo)式查找兩個(gè)列表中的公共數(shù)字

list_a?=[1,?2,?3,?4]

list_b?=?[2,?3,?4,?5]

common_num?=?[a?for?a?in?list_a?for?b?in?list_b?if?a?==?b]

print(common_num)?# [2, 3, 4]

  6. 將兩個(gè)列表轉(zhuǎn)換為一個(gè)字典

假設(shè)有兩個(gè)列表,一個(gè)列表內(nèi)容為學(xué)生姓名息裸,另一個(gè)內(nèi)容為學(xué)生分?jǐn)?shù)呼盆。使用zip函數(shù)蚁廓,將這兩個(gè)列表轉(zhuǎn)換為一個(gè)字典,代碼如下:

students=?["Peter",?"Julia",?"Alex"]

marks?=?[84,?65,?77]

dictionary?=?dict(zip(students, marks))

print(dictionary)?# {'Peter': 84, 'Julia': 65, 'Alex': 77}

7. 字符串拼接

拼接字符串時(shí)可用for循環(huán)來逐個(gè)添加元素腿时,但這非常低效(特別是當(dāng)列表很長(zhǎng)時(shí))。在python中批糟,字符串是不可變的,因此拼接字符串時(shí)笆搓,必須將左纬傲、右字符串復(fù)制到新的字符串中肤频。

更好的方法是使用join()?函數(shù),如下所示:

characters=?['p',?'y',?'t',?'h',?'o',?'n']

word?=?"".join(characters)

print(word)?# python

8. 使用sorted()函數(shù)

在python中使用內(nèi)置函數(shù)sorted()可以輕而易舉地對(duì)任何序列進(jìn)行排序汁雷,它能完成很多艱難的工作报咳。sorted()可對(duì)任何序列(列表、元組)進(jìn)行排序厢漩,并返回已排序的元素列表岩臣。如下對(duì)數(shù)字進(jìn)行升序排列:

1sorted([3,5,2,1,4])# [1, 2, 3, 4, 5]

如下對(duì)字符串進(jìn)行降序排列:

1sorted(['france','germany',?'canada',?'india',?'china'], reverse=True)?# ['india', 'germany','france', 'china', 'canada']

9. 用enumerate()迭代

Enumerate()方法向可迭代對(duì)象添加一個(gè)計(jì)數(shù)器,并以枚舉對(duì)象的形式返回炸宵。

以下是一個(gè)經(jīng)典的編碼方面的面試問題(通常被稱為Fizz Buzz問題)土全。

編寫一個(gè)程序來打印列表中的數(shù)字。若數(shù)字是3的倍數(shù)裹匙,輸出“fizz”在塔;是5的倍數(shù)蛔溃,輸出“buzz”篱蝇;既是3又是5的倍數(shù)徽曲,輸出“fizzbuzz”。

numbers=?[30,?42,?28,?50,?15]

for?i, num?in?enumerate(numbers):

????if?num?%?3?==?0?and?num?%?5?==?0:

???????numbers[i]?=?'fizzbuzz'

????elif?num?%?3?==?0:

???????numbers[i]?=?'fizz'

????elif?num?%?5?==?0:

???????numbers[i]?=?'buzz'

print(numbers)?# ['fizzbuzz', 'fizz', 28, 'buzz', 'fizzbuzz']

10. 使用python generators(生成器)

generator函數(shù)允許創(chuàng)建類似迭代器的函數(shù)涧衙。他們?cè)试S程序員以一種簡(jiǎn)單快速的方式創(chuàng)建迭代器弧哎。下面通過一個(gè)例子來解釋這個(gè)概念稚虎。

假設(shè)要對(duì)從1開始的前100000000個(gè)完全平方數(shù)求和。

看起來很容易對(duì)吧序攘。使用列表推導(dǎo)式可以很輕松的做到這一點(diǎn)寻拂,但是它的輸入量過大祭钉。下面為一示例:


t1?=time.clock()

sum([i?*?i?for?i?in?range(1,?100000000)])

t2?=?time.clock()

time_diff?=?t2?-?t1

print(f"It took {time_diff} Secs to execute this method")?# Ittook 13.197494000000006 Secs to execute this method

  在增加求和的完全平方數(shù)時(shí),由于需要大量計(jì)算時(shí)間朴皆,這種方法并不夠靈活遂铡。這時(shí)python生成器就派上用場(chǎng)了。將方括號(hào)替換為圓括號(hào)后伪货,列表推導(dǎo)式更改為生成器表達(dá)式〖卣現(xiàn)在計(jì)算花費(fèi)的時(shí)間:

t1?=?time.clock()

sum((i?*?i?for?i?in?range(1,?100000000)))

t2?=?time.clock()

time_diff?=?t2?-?t1

print(f"It took {time_diff} Secs to execute this method")?# Ittook 9.53867000000001 Secs to execute this method

隨著人工智能的逐漸升溫,Python作為人工智能領(lǐng)域開發(fā)的首選語(yǔ)言愚臀,其地位也將越來越重要矾利。以前的“學(xué)好數(shù)理化,走遍天下都不怕”舶斧,如今可能要改口了——“學(xué)好python,走遍天下都不怕”茴厉。


所以矾缓,還在等什么,趕緊學(xué)會(huì)這10種實(shí)用的python小技巧胰坟,相信你的日常工作會(huì)更加666~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泞辐,一起剝皮案震驚了整個(gè)濱河市竞滓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锯茄,老刑警劉巖茶没,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抓半,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡廊移,警方通過查閱死者的電腦和手機(jī)探入,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門苗膝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辱揭,你說我怎么就攤上這事『罘保” “怎么了泡躯?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵较剃,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我惰拱,道長(zhǎng)啊送,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮篷朵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘声旺。我一直安慰自己腮猖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布幔妨。 她就那樣靜靜地躺著误堡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雏吭。 梳的紋絲不亂的頭發(fā)上锁施,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼悉抵。 笑死肩狂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姥饰。 我是一名探鬼主播傻谁,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼列粪!你這毒婦竟也來了审磁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤岂座,失蹤者是張志新(化名)和其女友劉穎态蒂,沒想到半個(gè)月后钾恢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡募舟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年琢锋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钉嘹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跋涣。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖沛贪,靈堂內(nèi)的尸體忽然破棺而出利赋,到底是詐尸還是另有隱情中燥,我是刑警寧澤褪那,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站偏窝,受9級(jí)特大地震影響祭往,放射性物質(zhì)發(fā)生泄漏硼补。R本人自食惡果不足惜已骇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鲤竹。 院中可真熱鬧,春花似錦互订、人聲如沸岩榆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祥款。三九已至刃跛,卻和暖如春桨昙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桂塞。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欲芹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蛹磺,于是被迫代替她去往敵國(guó)和親萤捆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子市怎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容