編譯 | 王瑞平
最實(shí)用、最簡(jiǎn)單、最優(yōu)美...近些年,大家學(xué)習(xí)Python的熱潮從未消退;無(wú)論是數(shù)據(jù)分析還是科學(xué)計(jì)算都少不了Python的身影。
Python也沒(méi)有讓人失望,Java用100行代碼寫(xiě)出的程序,用Python十行就能搞定!
當(dāng)你要說(shuō)Hello World時(shí),C語(yǔ)言、Java、Python分別是這樣的:
一目了然,Python只需一行!
雖然Python非常容易學(xué)習(xí),但是許多實(shí)踐者只觸及到它的表面,而忽視了深入研究這門(mén)語(yǔ)言更高級(jí)、更強(qiáng)大的方面,而正是這些被忽視的方面使它如此獨(dú)特和強(qiáng)大。
——節(jié)選自《Fluent Python》
如果你的目標(biāo)是成為一名經(jīng)驗(yàn)豐富的Python程序員,你一定想了解的更多。因此,讓我們共同了解下你沒(méi)聽(tīng)過(guò)的Python核心功能,先從最簡(jiǎn)單的排列與組合開(kāi)始...
一、功能一:排列與組合
你可以組合不同的for循環(huán),輸出排列、組合和笛卡爾積等。
1.排列
舉個(gè)例子:當(dāng)你在排列函數(shù)中輸入{[1,2,3],2}時(shí),會(huì)輸出如下結(jié)果:
2.組合
當(dāng)你在組合函數(shù)中輸入(‘ABC’,2)時(shí),輸出的排列如下:
3.笛卡爾積
笛卡爾積是數(shù)學(xué)中的一種運(yùn)算,用于求兩個(gè)集合中所有可能的有序?qū)Α?/p>
當(dāng)我們用笛卡爾積計(jì)算Python時(shí),結(jié)果是這樣的:
二、功能二:可變的參數(shù)默認(rèn)值
現(xiàn)在,開(kāi)始增加難度...
當(dāng)你每次調(diào)用fib_memo函數(shù)卻不為memo參數(shù)賦值時(shí),它將自動(dòng)使用定義該函數(shù)時(shí)的原始值,公式和代碼如下:
圖片
由于在Python中,默認(rèn)參數(shù)是可變的,你也可以像在“for循環(huán)”中一樣在單個(gè)腳本中多次執(zhí)行函數(shù),每次執(zhí)行都能自動(dòng)增加要計(jì)算的斐波那契數(shù),而不會(huì)超過(guò)“最大遞歸深度”限制,因?yàn)閙emo可持續(xù)擴(kuò)展。
*重要提示:
請(qǐng)記住,盡管可變的默認(rèn)參數(shù)(如上所述)可以減少代碼,但它可能產(chǎn)生難以解決的bug。有些人將其判定為“陷阱”,而不是功能。因此,你仍需要堅(jiān)持Python中所透露出的禪意:顯式優(yōu)于隱式。
就像Hacker news中指出的那樣:if n not in memo比if not n in memo更容易讀取,但是二者輸出結(jié)果相同。
三、功能三:海象運(yùn)算符
下面,再來(lái)講講比較有趣的“海象運(yùn)算符”...
“海象運(yùn)算符”是在Python 3.8版本中引入的賦值表達(dá)式運(yùn)算符,用于在表達(dá)式中進(jìn)行賦值操作,其符號(hào)為“:=”。這個(gè)符號(hào)有點(diǎn)像海象的眼睛和獠牙(因此被稱(chēng)為「海象運(yùn)算符」)。
它可以被翻譯成英文“whale calculus”,是一種基于單詞語(yǔ)法規(guī)則的特殊運(yùn)算符,用于定義表達(dá)式和一系列操作步驟的語(yǔ)言建模方式。
顯然,用Python,賦值和檢查返回值是否包含真值變得更容易了:
四、功能四:?jiǎn)涡翘?hào)(*)和雙星號(hào)(**)
使用(*)可以在將參數(shù)或關(guān)鍵字參數(shù)傳遞給函數(shù)之前解壓縮,讓我們?cè)谌缦麓a中使用:
當(dāng)調(diào)用sum_numbers函數(shù)而不解包my_numbers時(shí),會(huì)引發(fā)"TypeError",因?yàn)樵摵瘮?shù)需要輸入兩個(gè)單獨(dú)的參數(shù)才能輸出結(jié)果。
但是,通過(guò)使用(*),我們可以解壓縮my_numbers函數(shù)中的值,并將它們作為單獨(dú)的參數(shù)進(jìn)行傳遞,從而產(chǎn)生正確的輸出。
這種解包技術(shù)不僅適用于元組和列表,也適用于字典。
當(dāng)關(guān)鍵字作為參數(shù)時(shí),我們可以使用雙星號(hào)(**),以如下代碼為例:
除解壓縮序列以將其作為參數(shù)傳遞給函數(shù)外,你還可以使用它來(lái)創(chuàng)建新序列,例如:
在此過(guò)程中,原始數(shù)字列表不受影響,并且你還將擁有一個(gè)new_list_numbers 變量,它包括相同列表的副本。
五、 功能五:any and any
any和all都是python中的內(nèi)置函數(shù),它們對(duì)可迭代對(duì)象(如,列表、元組或集合)進(jìn)行操作,并根據(jù)可迭代對(duì)象中的元素以Boolean運(yùn)算的形式返回,語(yǔ)句如下:
你可以將any和all函數(shù)與列表推導(dǎo)式結(jié)合使用,列表推導(dǎo)式返回一個(gè)可迭代對(duì)象并將其作為參數(shù)傳遞給all函數(shù):
或任意函數(shù):
下表列出可迭代對(duì)象中用any和all函數(shù)賦值的輸出差異:
六、功能六:交換變量
用Python,你可以將參數(shù)打包((=)號(hào)右邊)和解包((=)號(hào)左邊)結(jié)合起來(lái),并利用此功能交換變量:
七、功能七:str vs repr
在字符串處理方面,Python中的str()和repr()有所不同。str()將值轉(zhuǎn)化為前端樣式文本,repr()是后端底層代碼。
·str()函數(shù):將值轉(zhuǎn)化為適于人閱讀的形式,面向用戶,返回值具有可讀性、可理解性較強(qiáng)。
·repr()函數(shù):將對(duì)象轉(zhuǎn)化為供解釋器讀取的形式,面向開(kāi)發(fā)人員,返回值表示python解釋器內(nèi)部的含義。
下圖是一個(gè)很好的例子:
如你所見(jiàn),repr()簡(jiǎn)單將時(shí)間排列為字符串后輸出;如果你想確定當(dāng)前變量是否包含字符串或時(shí)間對(duì)象,無(wú)法借此識(shí)別。
str()提供了變量持有的實(shí)際對(duì)象信息,這些信息在調(diào)試過(guò)程中非常有價(jià)值。
八、功能八:擴(kuò)展的迭代解包
迭代解包可應(yīng)用到任何可迭代對(duì)象上,唯一的硬性要求是:被迭代對(duì)象中的元素?cái)?shù)量必須與接受這些元素的元組空檔數(shù)一致,也可以使用星號(hào) * 表示忽略多余的元素。
這種方式的優(yōu)點(diǎn)在于:更好賦值、更好獲取迭代對(duì)象中的某個(gè)值(一般的迭代對(duì)象分為:元組,列表,字典,字符串等)。
如果你想獲得序列的第一個(gè)和最后一個(gè)值,需要輸入如下代碼:
更換輸入和輸出語(yǔ)句后同樣可行...
其它組合也同樣適用...
九、功能九:多個(gè)上下文管理器
通常,我們習(xí)慣一次性使用一個(gè)上下文管理器,比如,當(dāng)你打開(kāi)一個(gè)程序文件,需要輸入如下代碼:
但是,在Python中,用一行語(yǔ)句就能打開(kāi)多個(gè)文件。如果你想將行寫(xiě)入其它文件,用Python語(yǔ)句就很容易實(shí)現(xiàn),例如:
十、功能十:調(diào)試程序
為達(dá)到調(diào)試目的,我們可以在文件中輸出大量變量或可以簡(jiǎn)單使用Python調(diào)試器(pdb),它可以幫我們?cè)O(shè)置斷點(diǎn):
程序?qū)⒃跀帱c(diǎn)處停止,你可以在該斷點(diǎn)處獲取任何變量以檢查其值或該特定斷點(diǎn)是否存在。當(dāng)程序遇到斷點(diǎn)時(shí),可使用如下幾個(gè)命令:
n或next:執(zhí)行下一行。
s或step:進(jìn)入功能調(diào)用。
c或continue:繼續(xù)執(zhí)行,直到下一個(gè)斷點(diǎn)。
l或list:顯示當(dāng)前代碼的上下文。
p 或pp :打印表達(dá)式的值。
b 或break :在指定的行上設(shè)置新斷點(diǎn)。
h或help:在使用pdb時(shí)提供幫助。
q或quit:退出調(diào)試器并終止程序。
十一、功能十一:collections模塊中的Counter
collections模塊中的Counter類(lèi)提供了一種便捷的方法,可以對(duì)可迭代對(duì)象中的元素進(jìn)行計(jì)數(shù):
圖片
十二、功能十二:使用下劃線的兩種情況
在Python中有兩種需要用到下劃線:多位數(shù)分隔或排除不需要的值。
1.排除不需要的值
下劃線 _ 可被用作排除不需要的值:
2.多位數(shù)分隔符
在處理多位數(shù)時(shí),可以使用下劃線 (_) 作為視覺(jué)分隔符,能增強(qiáng)可讀性。這個(gè)功能是在Python3.6中被引入的。
十三、用戶:簡(jiǎn)單、實(shí)用但范圍有限
在reddit上,我們找到了關(guān)于用戶關(guān)于本篇文章的181條評(píng)論:
正如文章開(kāi)頭所述,他們認(rèn)為:“用Python調(diào)試出的程序確實(shí)簡(jiǎn)單、實(shí)用。”
話雖如此,有些用戶也提出了質(zhì)疑:“Pythonic的過(guò)濾器和映射方式更具可讀性,但是范圍有限。”
但這一點(diǎn)也不影響用戶對(duì)Python的喜愛(ài)!
十四、寫(xiě)在最后:Python是你成為全棧工程師的必備武器
前端開(kāi)發(fā)、后端開(kāi)發(fā)、項(xiàng)目測(cè)試...如果你想成為一名合格的全棧工程師,Python是你不可或缺的“武器”。
在開(kāi)發(fā)領(lǐng)域如此內(nèi)卷的情況下,要完成一個(gè)現(xiàn)代化項(xiàng)目,需要一個(gè)人來(lái)掌控全局,他不需要是各種技術(shù)的資深專(zhuān)家,但需要熟悉各種技術(shù)。對(duì)于一個(gè)團(tuán)隊(duì)特別是互聯(lián)網(wǎng)企業(yè)來(lái)說(shuō),全局性思維的人真的不可多得。
文章內(nèi)容僅供閱讀,不構(gòu)成投資建議,請(qǐng)謹(jǐn)慎對(duì)待。投資者據(jù)此操作,風(fēng)險(xiǎn)自擔(dān)。
近日,德國(guó)柏林國(guó)際電子消費(fèi)品展覽會(huì)(IFA2024)隆重舉辦。憑借在核心技術(shù)、產(chǎn)品設(shè)計(jì)及應(yīng)用方面的創(chuàng)新變革,全球領(lǐng)先的智能終端企業(yè)TCL實(shí)業(yè)成功斬獲兩項(xiàng)“IFA全球產(chǎn)品設(shè)計(jì)創(chuàng)新大獎(jiǎng)”金獎(jiǎng),有力證明了其在全球市場(chǎng)的強(qiáng)大影響力。
近日,中國(guó)家電及消費(fèi)電子博覽會(huì)(AWE 2024)隆重開(kāi)幕。全球領(lǐng)先的智能終端企業(yè)TCL實(shí)業(yè)攜多款創(chuàng)新技術(shù)和新品亮相,以敢為精神勇闖技術(shù)無(wú)人區(qū),斬獲四項(xiàng)AWE 2024艾普蘭大獎(jiǎng)。
“以前都要去窗口辦,一套流程下來(lái)都要半個(gè)月了,現(xiàn)在方便多了!”打開(kāi)“重慶公積金”微信小程序,按照提示流程提交相關(guān)材料,僅幾秒鐘,重慶市民曾某的賬戶就打進(jìn)了21600元。
由世界人工智能大會(huì)組委會(huì)、上海市經(jīng)信委、徐匯區(qū)政府、臨港新片區(qū)管委會(huì)共同指導(dǎo),由上海市人工智能行業(yè)協(xié)會(huì)聯(lián)合上海人工智能實(shí)驗(yàn)室、上海臨港經(jīng)濟(jì)發(fā)展(集團(tuán))有限公司、開(kāi)放原子開(kāi)源基金會(huì)主辦的“2024全球開(kāi)發(fā)者先鋒大會(huì)”,將于2024年3月23日至24日舉辦。