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~