真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python在函數(shù) python在函數(shù)外部定義的變量稱作

在Python中定義Main函數(shù)

目錄

山城網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

許多編程語(yǔ)言都有一個(gè)特殊的函數(shù),當(dāng)操作系統(tǒng)開(kāi)始運(yùn)行程序時(shí)會(huì)自動(dòng)執(zhí)行該函數(shù)。這個(gè)函數(shù)通常被命名為main(),并且依據(jù)語(yǔ)言標(biāo)準(zhǔn)具有特定的返回類(lèi)型和參數(shù)。另一方面,Python解釋器從文件頂部開(kāi)始執(zhí)行腳本,并且沒(méi)有自動(dòng)執(zhí)行的特殊函數(shù)。

盡管如此,為程序的執(zhí)行定義一個(gè)起始點(diǎn)有助于理解程序是如何運(yùn)行的。Python程序員提出了幾種方式對(duì)此進(jìn)行實(shí)現(xiàn)。

本文結(jié)束時(shí),您將了解以下內(nèi)容:

Python中的基本main()函數(shù)

一些Python腳本中,包含一個(gè)函數(shù)定義和一個(gè)條件語(yǔ)句,如下所示:

此代碼中,包含一個(gè)main()函數(shù),在程序執(zhí)行時(shí)打印Hello World!。此外,還包含一個(gè)條件(或if)語(yǔ)句,用于檢查_(kāi)_name__的值并將其與字符串"__main__"進(jìn)行比較。當(dāng)if語(yǔ)句為T(mén)rue時(shí),Python解釋器將執(zhí)行main()函數(shù)。更多關(guān)于Python條件語(yǔ)句的信息可以由此獲得。

這種代碼模式在Python文件中非常常見(jiàn),它將作為腳本執(zhí)行并導(dǎo)入另一個(gè)模塊。為了幫助理解這段代碼的執(zhí)行方式,首先需要了解Python解釋器如何根據(jù)代碼的執(zhí)行方式設(shè)置__name__。

Python中的執(zhí)行模式

Python解釋器執(zhí)行代碼有兩種方式:

更多內(nèi)容可參考如何運(yùn)行Python腳本。無(wú)論采用哪種方式,Python都會(huì)定義一個(gè)名為_(kāi)_name__的特殊變量,該變量包含一個(gè)字符串,其值取決于代碼的使用方式。

本文將如下示例文件保存為execution_methods.py,以 探索 代碼如何根據(jù)上下文改變行為:

在此文件中,定義了三個(gè)對(duì)print()函數(shù)的調(diào)用。前兩個(gè)打印一些介紹性短語(yǔ)。第三個(gè)print()會(huì)先打印短語(yǔ)The value __name__ is,之后將使用Python內(nèi)置的repr()函數(shù)打印出__name__變量。

在Python中,repr()函數(shù)將對(duì)象轉(zhuǎn)化為供解釋器讀取的形式。上述示例通過(guò)使用repr()函數(shù)來(lái)強(qiáng)調(diào)__name__的值為字符串。更多關(guān)于repr()的內(nèi)容可參考Python文檔。

在本文中,您將隨處可見(jiàn)文件(file),模塊(module)和腳本(script)這三個(gè)字眼。實(shí)際上,三者之間并無(wú)太大的差別。不過(guò),在強(qiáng)調(diào)代碼目的時(shí),還是存在細(xì)微的差異:

“如何運(yùn)行Python腳本”一文也討論了三者的差別。

基于命令行執(zhí)行

在這類(lèi)方法中,Python腳本將通過(guò)命令行來(lái)執(zhí)行。

執(zhí)行腳本時(shí),無(wú)法與Python解釋器正在執(zhí)行的代碼交互。關(guān)于如何通過(guò)命令行執(zhí)行代碼的詳細(xì)信息對(duì)本文而言并不重要,但您可以通過(guò)展開(kāi)下框閱讀更多有關(guān)Windows,Linux和macOS之間命令行差異的內(nèi)容。

命令行環(huán)境

不同的操作系統(tǒng)在使用命令行執(zhí)行代碼時(shí)存在細(xì)微的差異。

在Linux和macOS中,通常使用如下命令:

美元符號(hào)($)之前的內(nèi)容可能有所不同,具體取決于您的用戶名和計(jì)算機(jī)名稱。您鍵入的命令位于$之后。在Linux或macOS上,Python3的可執(zhí)行文件名為python3,因此可以通過(guò)輸入python3 script_name.py來(lái)運(yùn)行python腳本。

在Windows上,命令提示符通常如下所示:

根據(jù)您的用戶名,之前的內(nèi)容可能會(huì)有所不同,您輸入的命令位于之后。在Windows上,Python3的可執(zhí)行文件通常為python。因此可以通過(guò)輸入python script_name.py來(lái)運(yùn)行python腳本。

無(wú)論哪種操作系統(tǒng),本文的Python腳本的輸出結(jié)果都是相同的。因此本文以Linux和macOS為例。

使用命令行執(zhí)行execution_methods.py,如下所示:

在這個(gè)示例中,__name__具有值'__main__',其中引號(hào)(')表明該值為字符串類(lèi)型。

請(qǐng)記住,在Python中,使用單引號(hào)(')和雙引號(hào)(")定義的字符串沒(méi)有區(qū)別。更多關(guān)于字符串的內(nèi)容請(qǐng)參考Python的基本數(shù)據(jù)類(lèi)型。

如果在腳本中包含"shebang行"并直接執(zhí)行它(./execution_methods.py),或者使用IPython或Jupyter Notebook的%run,將會(huì)獲取相同的結(jié)果。

您還可以通過(guò)向命令行添加-m參數(shù)的方法實(shí)現(xiàn)以模塊的方式執(zhí)行。通常情況下,推薦如下方式pip: python3 -m pip install package_name。

添加-m參數(shù)將會(huì)運(yùn)行包中__main__.py的代碼。更多關(guān)于__main__.py文件的內(nèi)容可參考如何將開(kāi)源Python包發(fā)布到PyPI中。

在三種情況中,__name__都具有相同的值:字符串'__main__'。

技術(shù)細(xì)節(jié):Python文檔中具體定義了__name__何時(shí)取值為'__main__'。

當(dāng)通過(guò)標(biāo)準(zhǔn)輸入,腳本或者交互提示中讀取數(shù)據(jù)時(shí),模塊的__name__將取值為'__main__'。(來(lái)源)

__name__與__doc__,__package__和其他屬性一起存儲(chǔ)在模塊的全局命名空間。更多關(guān)于屬性的信息可參考Python數(shù)據(jù)模型文檔,特別是關(guān)于模塊和包的信息,請(qǐng)參閱Python Import文檔。

導(dǎo)入模塊或解釋器

接下來(lái)是Python解釋器執(zhí)行代碼的第二種方式:導(dǎo)入。在開(kāi)發(fā)模塊或腳本時(shí),可以使用import關(guān)鍵字導(dǎo)入他人已經(jīng)構(gòu)建的模塊。

在導(dǎo)入過(guò)程中,Python執(zhí)行指定模塊中定義的語(yǔ)句(但僅在第一次導(dǎo)入模塊時(shí))。要演示導(dǎo)入execution_methods.py文件的結(jié)果,需要啟動(dòng)Python解釋器,然后導(dǎo)入execution_methods.py文件:

在此代碼輸出中,Python解釋器執(zhí)行了三次print()函數(shù)調(diào)用。前兩行由于沒(méi)有變量,在輸出方面與在命令行上作為腳本執(zhí)行時(shí)完全相同。但是第三個(gè)輸出存在差異。

當(dāng)Python解釋器導(dǎo)入代碼時(shí),__name__的值與要導(dǎo)入的模塊的名稱相同。您可以通過(guò)第三行的輸出了解這一點(diǎn)。__name__的值為'execution_methods',是Python導(dǎo)入的.py文件。

注意如果您在沒(méi)有退出Python時(shí)再次導(dǎo)入模塊,將不會(huì)有輸出。

注意:更多關(guān)于導(dǎo)入在Python中如何工作的內(nèi)容請(qǐng)參考官方文檔和Python中的絕對(duì)和相對(duì)導(dǎo)入。

Main函數(shù)的最佳實(shí)踐

既然您已經(jīng)了解兩種執(zhí)行方式上的差異,那么掌握一些最佳實(shí)踐方案還是很有用的。它們將適用于編寫(xiě)作為腳本運(yùn)行的代碼或者在另一個(gè)模塊導(dǎo)入的代碼。

如下是四種實(shí)踐方式:

將大部分代碼放入函數(shù)或類(lèi)中

請(qǐng)記住,Python解釋器在導(dǎo)入模塊時(shí)會(huì)執(zhí)行模塊中的所有代碼。有時(shí)如果想要實(shí)現(xiàn)用戶可控的代碼,會(huì)導(dǎo)致一些副作用,例如:

在這種情況下,想要實(shí)現(xiàn)用戶控制觸發(fā)此代碼的執(zhí)行,而不是讓Python解釋器在導(dǎo)入模塊時(shí)執(zhí)行代碼。

因此,最佳方法是將大部分代碼包含在函數(shù)或類(lèi)中。這是因?yàn)楫?dāng)Python解釋器遇到def或class關(guān)鍵字時(shí),它只存儲(chǔ)這些定義供以后使用,并且在用戶通知之前不會(huì)實(shí)際執(zhí)行。

將如下代碼保存在best_practices.py以證明這個(gè)想法:

在此代碼中,首先從time模塊中導(dǎo)入sleep()。

在這個(gè)示例中,參數(shù)以秒的形式傳入sleep()函數(shù)中,解釋器將暫停一段時(shí)間再運(yùn)行。隨后,使用print()函數(shù)打印關(guān)于代碼描述的語(yǔ)句。

之后,定義一個(gè)process_data()函數(shù),執(zhí)行如下五項(xiàng)操作:

在命令行中執(zhí)行

當(dāng)你將此文件作為腳本用命令行執(zhí)行時(shí)會(huì)發(fā)生什么呢?

Python解釋器將執(zhí)行函數(shù)定義之外的from time import sleep和print(),之后將創(chuàng)建函數(shù)process_data()。然后,腳本將退出而不做任何進(jìn)一步的操作,因?yàn)槟_本沒(méi)有任何執(zhí)行process_data()的代碼。

如下是這段腳本的執(zhí)行結(jié)果:

我們?cè)谶@里看到的輸出是第一個(gè)print()的結(jié)果。注意,從time導(dǎo)入和定義process_data()函數(shù)不產(chǎn)生結(jié)果。具體來(lái)說(shuō),調(diào)用定義在process_data()內(nèi)部的print()不會(huì)打印結(jié)果。

導(dǎo)入模塊或解釋器執(zhí)行

在會(huì)話(或其他模塊)中導(dǎo)入此文件時(shí),Python解釋器將執(zhí)行相同的步驟。

Python解釋器導(dǎo)入文件后,您可以使用已導(dǎo)入模塊中定義的任何變量,類(lèi)或函數(shù)。為了證明這一點(diǎn),我們將使用可交互的Python解釋器。啟動(dòng)解釋器,然后鍵入import best_practices:

導(dǎo)入best_practices.py后唯一的輸出來(lái)自process_data()函數(shù)外定義的print()。導(dǎo)入模塊或解釋器執(zhí)行與基于命令行執(zhí)行類(lèi)似。

使用__name__控制代碼的執(zhí)行

如何實(shí)現(xiàn)基于命令行而不使用Python解釋器導(dǎo)入文件來(lái)執(zhí)行呢?

您可以使用__name__來(lái)決定執(zhí)行上下文,并且當(dāng)__name__等于"__main__"時(shí)才執(zhí)行process_data()。在best_practices.py文件中添加如下代碼:

這段代碼添加了一個(gè)條件語(yǔ)句來(lái)檢驗(yàn)__name__的值。當(dāng)值為"__main__"時(shí),條件為T(mén)rue。記住當(dāng)__name__變量的特殊值為"__main__"時(shí)意味著Python解釋器會(huì)執(zhí)行腳本而不是將其導(dǎo)入。

條件語(yǔ)塊內(nèi)添加了四行代碼(第12,13,14和15行):

現(xiàn)在,在命令行中運(yùn)行best_practices.py,并觀察輸出的變化:

首先,輸出顯示了process_data()函數(shù)外的print()的調(diào)用結(jié)果。

之后,data的值被打印。因?yàn)楫?dāng)Python解釋器將文件作為腳本執(zhí)行時(shí),變量__name__具有值"__main__",因此條件語(yǔ)句被計(jì)算為T(mén)rue。

接下來(lái),腳本將調(diào)用process_data()并傳入data進(jìn)行修改。當(dāng)process_data執(zhí)行時(shí),將輸出一些狀態(tài)信息。最終,將輸出modified_data的值。

現(xiàn)在您可以驗(yàn)證從解釋器(或其他模塊)導(dǎo)入best_practices.py后發(fā)生的事情了。如下示例演示了這種情況:

注意,當(dāng)前結(jié)果與將條件語(yǔ)句添加到文件末尾之前相同。因?yàn)榇藭r(shí)__name__變量的值為"best_practices",因此條件語(yǔ)句結(jié)果為False,Python將不執(zhí)行process_data()。

創(chuàng)建名為main()的函數(shù)來(lái)包含要運(yùn)行的代碼

現(xiàn)在,您可以編寫(xiě)作為腳本由從命令行執(zhí)行并導(dǎo)入且沒(méi)有副作用的Python代碼。接下來(lái),您將學(xué)習(xí)如何編寫(xiě)代碼并使其他程序員能輕松地理解其含義。

許多語(yǔ)言,如C,C++,Java以及其他的一些語(yǔ)言,都會(huì)定義一個(gè)叫做main()的函數(shù),當(dāng)編譯程序時(shí),操作系統(tǒng)會(huì)自動(dòng)調(diào)用該函數(shù)。此函數(shù)通常被稱為入口點(diǎn)(entry point),因?yàn)樗浅绦蜻M(jìn)入執(zhí)行的起始位置。

相比之下,Python沒(méi)有一個(gè)特殊的函數(shù)作為腳本的入口點(diǎn)。實(shí)際上在Python中可以將入口點(diǎn)定義成任何名稱。

盡管Python不要求將函數(shù)命名為main(),但是最佳的做法是將入口點(diǎn)函數(shù)命名為main()。這樣方便其他程序員定位程序的起點(diǎn)。

此外,main()函數(shù)應(yīng)該包含Python解釋器執(zhí)行文件時(shí)要運(yùn)行的任何代碼。這比將代碼放入條件語(yǔ)塊中更好,因?yàn)橛脩艨梢栽趯?dǎo)入模塊時(shí)重復(fù)使用main()函數(shù)。

修改best_practices.py文件如下所示:

在這個(gè)示例中,定義了一個(gè)main()函數(shù),它包含了上面的條件語(yǔ)句塊。之后修改條件語(yǔ)塊執(zhí)行main()。如果您將此代碼作為腳本運(yùn)行或?qū)?,將獲得與上一節(jié)相同的輸出。

在main()中調(diào)用其他函數(shù)

另一種常見(jiàn)的實(shí)現(xiàn)方式是在main()中調(diào)用其他函數(shù),而不是直接將代碼寫(xiě)入main()。這樣做的好處在于可以實(shí)現(xiàn)將幾個(gè)獨(dú)立運(yùn)行的子任務(wù)整合。

例如,某個(gè)腳本有如下功能:

如果在單獨(dú)的函數(shù)中各自實(shí)現(xiàn)這些子任務(wù),您(或其他用戶)可以很容易地實(shí)現(xiàn)代碼重用。之后您可以在main()函數(shù)中創(chuàng)建默認(rèn)的工作流。

您可以根據(jù)自己的情況選擇是否使用此方案。將任務(wù)拆分為多個(gè)函數(shù)會(huì)使重用更容易,但會(huì)增加他人理解代碼的難度。

修改best_practices.py文件如下所示:

在此示例代碼中,文件的前10行具有與之前相同的內(nèi)容。第12行的第二個(gè)函數(shù)創(chuàng)建并返回一些示例數(shù)據(jù),第17行的第三個(gè)函數(shù)模擬將修改后的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)。

第21行定義了main()函數(shù)。在此示例中,對(duì)main()做出修改,它將調(diào)用數(shù)據(jù)讀取,數(shù)據(jù)處理以及數(shù)據(jù)寫(xiě)入等功能。

首先,從read_data_from_web()中創(chuàng)建data。將data作為參數(shù)傳入process_data(),之后將返回modified_data。最后,將modified_data傳入write_data_to_database()。

腳本的最后兩行是條件語(yǔ)塊用于驗(yàn)證__name__,并且如果if語(yǔ)句為T(mén)rue,則執(zhí)行main()。

在命令行中運(yùn)行如下所示:

根據(jù)執(zhí)行結(jié)果,Python解釋器在執(zhí)行main()函數(shù)時(shí),將依次執(zhí)行read_data_from_web(),process_data()以及write_data_to_database()。當(dāng)然,您也可以導(dǎo)入best_practices.py文件并重用process_data()作為不同的數(shù)據(jù)輸入源,如下所示:

在此示例中,導(dǎo)入了best_practices并且將其簡(jiǎn)寫(xiě)為bp。

導(dǎo)入過(guò)程會(huì)導(dǎo)致Python解釋器執(zhí)行best_practices.py的全部代碼,因此輸出顯示解釋文件用途的信息。

然后,從文件中存儲(chǔ)數(shù)據(jù)而不是從Web中讀取數(shù)據(jù)。之后,可以重用best_practices.py文件中的process_data()和write_data_to_database()函數(shù)。在此情況下,可以利用代碼重寫(xiě)來(lái)取代在main()函數(shù)中實(shí)現(xiàn)全部的代碼邏輯。

實(shí)踐總結(jié)

以下是Python中main()函數(shù)的四個(gè)關(guān)鍵最佳實(shí)踐:

結(jié)論

恭喜!您現(xiàn)在已經(jīng)了解如何創(chuàng)建Python main()函數(shù)了。

本文介紹了如下內(nèi)容:

現(xiàn)在,您可以開(kāi)始編寫(xiě)一些非常棒的關(guān)于Python main()函數(shù)代碼啦!

python中range()函數(shù)用法

Python range()函數(shù)可創(chuàng)建一個(gè)整數(shù)列表,一般用在for循環(huán)中。

注意:Python3 range()返回的是一個(gè)可迭代對(duì)象,類(lèi)型是對(duì)象,而不是列表類(lèi)型,所以打印的時(shí)候不會(huì)打印列表。

函數(shù)語(yǔ)法:

range(start,stop[,step])

參數(shù)說(shuō)明:

start:計(jì)數(shù)從start開(kāi)始。默認(rèn)是從0開(kāi)始。例如range(5)等價(jià)于range(0,5);

stop:計(jì)數(shù)到stop結(jié)束,但不包括stop。例如:range(0,5)是[0,1,2,3,4]沒(méi)有5;

step:步長(zhǎng),默認(rèn)為1。例如:range(0,5)等價(jià)于range(0,5,1)。

實(shí)例:

range(10) # 從 0 開(kāi)始到 9

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

range(1, 11) # 從 1 開(kāi)始到 10

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

range(0, 30, 5) # 步長(zhǎng)為 5

[0, 5, 10, 15, 20, 25]

range(0, 10, 3) # 步長(zhǎng)為 3

[0, 3, 6, 9]

range(0, -10, -1) # 負(fù)數(shù)

[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

range(0)

[]

range(1, 0)

[]

以下是range在for中的使用,循環(huán)出runoob的每個(gè)字母:

x = 'runoob'

for i in range(len(x)) :

... print(x[i])

...

r

u

n

o

o

b

Python函數(shù)的參數(shù)類(lèi)型

Python函數(shù)的參數(shù)類(lèi)型主要包括必選參數(shù)、可選參數(shù)、可變參數(shù)、位置參數(shù)和關(guān)鍵字參數(shù),本文介紹一下他們的定義以及可變數(shù)據(jù)類(lèi)型參數(shù)傳遞需要注意的地方。

必選參數(shù)(Required arguments)是必須輸入的參數(shù),比如下面的代碼,必須輸入2個(gè)參數(shù),否則就會(huì)報(bào)錯(cuò):

其實(shí)上面例子中的參數(shù) num1和num2也屬于關(guān)鍵字參數(shù),比如可以通過(guò)如下方式調(diào)用:

執(zhí)行結(jié)果:

可選參數(shù)(Optional arguments)可以不用傳入函數(shù),有一個(gè)默認(rèn)值,如果沒(méi)有傳入會(huì)使用默認(rèn)值,不會(huì)報(bào)錯(cuò)。

位置參數(shù)(positional arguments)根據(jù)其在函數(shù)定義中的位置調(diào)用,下面是pow()函數(shù)的幫助信息:

x,y,z三個(gè)參數(shù)的的順序是固定的,并且不能使用關(guān)鍵字:

輸出:

在上面的pow()函數(shù)幫助信息中可以看到位置參數(shù)后面加了一個(gè)反斜杠 / ,這是python內(nèi)置函數(shù)的語(yǔ)法定義,Python開(kāi)發(fā)人員不能在python3.8版本之前的代碼中使用此語(yǔ)法。但python3.0到3.7版本可以使用如下方式定義位置參數(shù):

星號(hào)前面的參數(shù)為位置參數(shù)或者關(guān)鍵字參數(shù),星號(hào)后面是強(qiáng)制關(guān)鍵字參數(shù),具體介紹見(jiàn)強(qiáng)制關(guān)鍵字參數(shù)。

python3.8版本引入了強(qiáng)制位置參數(shù)(Positional-Only Parameters),也就是我們可以使用反斜杠 / 語(yǔ)法來(lái)定義位置參數(shù)了,可以寫(xiě)成如下形式:

來(lái)看下面的例子:

python3.8運(yùn)行:

不能使用關(guān)鍵字參數(shù)形式賦值了。

可變參數(shù) (varargs argument) 就是傳入的參數(shù)個(gè)數(shù)是可變的,可以是0-n個(gè),使用星號(hào)( * )將輸入?yún)?shù)自動(dòng)組裝為一個(gè)元組(tuple):

執(zhí)行結(jié)果:

關(guān)鍵字參數(shù)(keyword argument)允許將任意個(gè)含參數(shù)名的參數(shù)導(dǎo)入到python函數(shù)中,使用雙星號(hào)( ** ),在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)字典。

執(zhí)行結(jié)果:

上面介紹的參數(shù)可以混合使用:

結(jié)果:

注意:由于傳入的參數(shù)個(gè)數(shù)不定,所以當(dāng)與普通參數(shù)一同使用時(shí),必須把帶星號(hào)的參數(shù)放在最后。

強(qiáng)制關(guān)鍵字參數(shù)(Keyword-Only Arguments)是python3引入的特性,可參考:。 使用一個(gè)星號(hào)隔開(kāi):

在位置參數(shù)一節(jié)介紹過(guò)星號(hào)前面的參數(shù)可以是位置參數(shù)和關(guān)鍵字參數(shù)。星號(hào)后面的參數(shù)都是強(qiáng)制關(guān)鍵字參數(shù),必須以指定參數(shù)名的方式傳參,如果強(qiáng)制關(guān)鍵字參數(shù)沒(méi)有設(shè)置默認(rèn)參數(shù),調(diào)用函數(shù)時(shí)必須傳參。

執(zhí)行結(jié)果:

也可以在可變參數(shù)后面命名關(guān)鍵字參數(shù),這樣就不需要星號(hào)分隔符了:

執(zhí)行結(jié)果:

在Python對(duì)象及內(nèi)存管理機(jī)制中介紹了python中的參數(shù)傳遞屬于對(duì)象的 引用傳遞 (pass by object reference),在編寫(xiě)函數(shù)的時(shí)候需要特別注意。

先來(lái)看個(gè)例子:

執(zhí)行結(jié)果:

l1 和 l2指向相同的地址,由于列表可變,l1改變時(shí),l2也跟著變了。

接著看下面的例子:

結(jié)果:

l1沒(méi)有變化!為什么不是[1, 2, 3, 4]呢?

l = l + [4]表示創(chuàng)建一個(gè)“末尾加入元素 4“的新列表,并讓 l 指向這個(gè)新的對(duì)象,l1沒(méi)有進(jìn)行任何操作,因此 l1 的值不變。如果要改變l1的值,需要加一個(gè)返回值:

結(jié)果:

下面的代碼執(zhí)行結(jié)果又是什么呢?

執(zhí)行結(jié)果:

和第一個(gè)例子一樣,l1 和 l2指向相同的地址,所以會(huì)一起改變。這個(gè)問(wèn)題怎么解決呢?

可以使用下面的方式:

也可以使用淺拷貝或者深度拷貝,具體使用方法可參考Python對(duì)象及內(nèi)存管理機(jī)制。這個(gè)問(wèn)題在Python編程時(shí)需要特別注意。

本文主要介紹了python函數(shù)的幾種參數(shù)類(lèi)型:必選參數(shù)、可選參數(shù)、可變參數(shù)、位置參數(shù)、強(qiáng)制位置參數(shù)、關(guān)鍵字參數(shù)、強(qiáng)制關(guān)鍵字參數(shù),注意他們不是完全獨(dú)立的,比如必選參數(shù)、可選參數(shù)也可以是關(guān)鍵字參數(shù),位置參數(shù)可以是必選參數(shù)或者可選參數(shù)。

另外,python中的參數(shù)傳遞屬于對(duì)象的 引用傳遞 ,在對(duì)可變數(shù)據(jù)類(lèi)型進(jìn)行參數(shù)傳遞時(shí)需要特別注意,如有必要,使用python的拷貝方法。

參考文檔:

--THE END--

Python中冷門(mén)但非常好用的內(nèi)置函數(shù)

Python中有許多內(nèi)置函數(shù),不像print、len那么廣為人知,但它們的功能卻異常強(qiáng)大,用好了可以大大提高代碼效率,同時(shí)提升代碼的簡(jiǎn)潔度,增強(qiáng)可閱讀性

Counter

collections在python官方文檔中的解釋是High-performance container datatypes,直接的中文翻譯解釋高性能容量數(shù)據(jù)類(lèi)型。這個(gè)模塊實(shí)現(xiàn)了特定目標(biāo)的容器,以提供Python標(biāo)準(zhǔn)內(nèi)建容器 dict , list , set , 和 tuple 的替代選擇。在python3.10.1中它總共包含以下幾種數(shù)據(jù)類(lèi)型:

容器名簡(jiǎn)介

namedtuple() 創(chuàng)建命名元組子類(lèi)的工廠函數(shù)

deque 類(lèi)似列表(list)的容器,實(shí)現(xiàn)了在兩端快速添加(append)和彈出(pop)

ChainMap 類(lèi)似字典(dict)的容器類(lèi),將多個(gè)映射集合到一個(gè)視圖里面

Counter 字典的子類(lèi),提供了可哈希對(duì)象的計(jì)數(shù)功能

OrderedDict 字典的子類(lèi),保存了他們被添加的順序

defaultdict 字典的子類(lèi),提供了一個(gè)工廠函數(shù),為字典查詢提供一個(gè)默認(rèn)值

UserDict 封裝了字典對(duì)象,簡(jiǎn)化了字典子類(lèi)化

UserList 封裝了列表對(duì)象,簡(jiǎn)化了列表子類(lèi)化

UserString 封裝了字符串對(duì)象,簡(jiǎn)化了字符串子類(lèi)化

其中Counter中文意思是計(jì)數(shù)器,也就是我們常用于統(tǒng)計(jì)的一種數(shù)據(jù)類(lèi)型,在使用Counter之后可以讓我們的代碼更加簡(jiǎn)單易讀。Counter類(lèi)繼承dict類(lèi),所以它能使用dict類(lèi)里面的方法

舉例

#統(tǒng)計(jì)詞頻

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

result = {}

for fruit in fruits:

if not result.get(fruit):

result[fruit] = 1

else:

result[fruit] += 1

print(result)

#{'apple': 2, 'peach': 3, 'lemon': 1}下面我們看用Counter怎么實(shí)現(xiàn):

from collections import Counter

fruits = ['apple', 'peach', 'apple', 'lemon', 'peach', 'peach']

c = Counter(fruits)

print(dict(c))

#{'apple': 2, 'peach': 3, 'lemon': 1}顯然代碼更加簡(jiǎn)單了,也更容易閱讀和維護(hù)了。

elements()

返回一個(gè)迭代器,其中每個(gè)元素將重復(fù)出現(xiàn)計(jì)數(shù)值所指定次。元素會(huì)按首次出現(xiàn)的順序返回。如果一個(gè)元素的計(jì)數(shù)值小于1,elements()將會(huì)忽略它。

c = Counter(a=4, b=2, c=0, d=-2)

sorted(c.elements())

['a', 'a', 'a', 'a', 'b', 'b']most_common([n])

返回一個(gè)列表,其中包含n個(gè)最常見(jiàn)的元素及出現(xiàn)次數(shù),按常見(jiàn)程度由高到低排序。如果n被省略或?yàn)镹one,most_common()將返回計(jì)數(shù)器中的所有元素。計(jì)數(shù)值相等的元素按首次出現(xiàn)的順序排序:

Counter('abracadabra').most_common(3)

[('a', 5), ('b', 2), ('r', 2)]這兩個(gè)方法是Counter中最常用的方法,其他方法可以參考 python3.10.1官方文檔

實(shí)戰(zhàn)

Leetcode 1002.查找共用字符

給你一個(gè)字符串?dāng)?shù)組words,請(qǐng)你找出所有在words的每個(gè)字符串中都出現(xiàn)的共用字符(包括重復(fù)字符),并以數(shù)組形式返回。你可以按任意順序返回答案。

輸入:words = ["bella", "label", "roller"]

輸出:["e", "l", "l"]

輸入:words = ["cool", "lock", "cook"]

輸出:["c", "o"]看到統(tǒng)計(jì)字符,典型的可以用Counter完美解決。這道題是找出字符串列表里面每個(gè)元素都包含的字符,首先可以用Counter計(jì)算出每個(gè)元素每個(gè)字符出現(xiàn)的次數(shù),依次取交集最后得出所有元素共同存在的字符,然后利用elements輸出共用字符出現(xiàn)的次數(shù)

class Solution:

def commonChars(self, words: List[str]) - List[str]:

from collections import Counter

ans = Counter(words[0])

for i in words[1:]:

ans = Counter(i)

return list(ans.elements())提交一下,發(fā)現(xiàn)83個(gè)測(cè)試用例耗時(shí)48ms,速度還是不錯(cuò)的

sorted

在處理數(shù)據(jù)過(guò)程中,我們經(jīng)常會(huì)用到排序操作,比如將列表、字典、元組里面的元素正/倒排序。這時(shí)候就需要用到sorted(),它可以對(duì)任何可迭代對(duì)象進(jìn)行排序,并返回列表

對(duì)列表升序操作:

a = sorted([2, 4, 3, 7, 1, 9])

print(a)

# 輸出:[1, 2, 3, 4, 7, 9]對(duì)元組倒序操作:

sorted((4,1,9,6),reverse=True)

print(a)

# 輸出:[9, 6, 4, 1]使用參數(shù):key,根據(jù)自定義規(guī)則,按字符串長(zhǎng)度來(lái)排序:

fruits = ['apple', 'watermelon', 'pear', 'banana']

a = sorted(fruits, key = lambda x : len(x))

print(a)

# 輸出:['pear', 'apple', 'banana', 'watermelon']all

all() 函數(shù)用于判斷給定的可迭代參數(shù)iterable中的所有元素是否都為 TRUE,如果是返回 True,否則返回 False。元素除了是 0、空、None、False外都算True。注意:空元組、空列表返回值為T(mén)rue。

all(['a', 'b', 'c', 'd']) # 列表list,元素都不為空或0

True

all(['a', 'b', '', 'd']) # 列表list,存在一個(gè)為空的元素

False

all([0, 1,2, 3]) # 列表list,存在一個(gè)為0的元素

False

all(('a', 'b', 'c', 'd')) # 元組tuple,元素都不為空或0

True

all(('a', 'b', '', 'd')) # 元組tuple,存在一個(gè)為空的元素

False

all((0, 1, 2, 3)) # 元組tuple,存在一個(gè)為0的元素

False

all([]) # 空列表

True

all(()) # 空元組

Trueany函數(shù)正好和all函數(shù)相反:判斷一個(gè)tuple或者list是否全為空,0,F(xiàn)alse。如果全為空,0,F(xiàn)alse,則返回False;如果不全為空,則返回True。

F-strings

在python3.6.2版本中,PEP 498提出一種新型字符串格式化機(jī)制,被稱為 “字符串插值” 或者更常見(jiàn)的一種稱呼是F-strings,F(xiàn)-strings提供了一種明確且方便的方式將python表達(dá)式嵌入到字符串中來(lái)進(jìn)行格式化:

s1='Hello'

s2='World'

print(f'{s1} {s2}!')

# Hello World!在F-strings中我們也可以執(zhí)行函數(shù):

def power(x):

return x*x

x=4

print(f'{x} * {x} = {power(x)}')

# 4 * 4 = 16而且F-strings的運(yùn)行速度很快,比傳統(tǒng)的%-string和str.format()這兩種格式化方法都快得多,書(shū)寫(xiě)起來(lái)也更加簡(jiǎn)單。

本文主要講解了python幾種冷門(mén)但好用的函數(shù),更多內(nèi)容以后會(huì)陸陸續(xù)續(xù)更新~

python中l(wèi)en函數(shù)

python中l(wèi)en()的用法:

新建一個(gè)len()函數(shù)的使用py,中文編碼聲明注釋?zhuān)?coding=gbk,函數(shù):len()作用:返回字符串、列表、字典、元組等長(zhǎng)度。語(yǔ)法:len(str)。參數(shù):str:要計(jì)算的字符串、列表、字典、元組等。返回值:字符串、列表、字典、元組等元素的長(zhǎng)度。

實(shí)例:

1、計(jì)算字符串的長(zhǎng)度。

2、計(jì)算列表的元素個(gè)數(shù)。

3、計(jì)算字典的總長(zhǎng)度,即鍵值對(duì)總數(shù)。

4、計(jì)算元組元素個(gè)數(shù)。

在Python中,要知道一個(gè)字符串有多少個(gè)字符,以獲得字符串的長(zhǎng)度,或者一個(gè)字符串需要多少字節(jié),可以使用len函數(shù)。

Python常用函數(shù)三有哪些?這7個(gè)函數(shù)使用頻率最高,總算搞明白了

1.1 例如:print(hex(2))案例

1.2 輸出函數(shù):print(hex(2))

1.3 輸出結(jié)果:0x2

1.4 解析說(shuō)明:返回16進(jìn)制的數(shù)。

2.1 例如:print(chr(10))案例

2.2 輸出函數(shù):print(chr(10))

2.3 輸出結(jié)果:0o12

2.4 解析說(shuō)明:返回當(dāng)前整數(shù)對(duì)應(yīng)的ASCll碼

3.1 例如:print(ord("b"))案例

3.2 輸出函數(shù):print(ord("b"))

3.3 輸出結(jié)果:98

3.4 解析說(shuō)明:返回當(dāng)前ASCll碼的10進(jìn)制數(shù)

4.1 例如:print(chr(97))

4.2 輸出函數(shù):print(chr(97))

4.3 輸出結(jié)果:b

4.4 解析說(shuō)明:返回當(dāng)前ASCll碼的10進(jìn)制數(shù)。

案例一:給你一個(gè)字符串,s = 'hello kitty'

1.1 輸出函數(shù):print(s.capitalize())

1.2 輸出結(jié)果:0x2

1.3 解析說(shuō)明:返回16進(jìn)制的數(shù)。

2.1輸出函數(shù):print(s.replace('kitty','kuang'))

2.2 輸出結(jié)果:hello kuang

2.3 解析說(shuō)明:替換功能,將kitty換成kuang。

2.4 輸出函數(shù):print(s.replace('4','KK'))

2.5 輸出結(jié)果:12KK12KK

2.6 解析說(shuō)明:所有的4都替換成KK

2.7 輸出函數(shù):print(s.replace('4','KK'))

2.8 輸出結(jié)果:12KK12KK124

2.9 解析說(shuō)明:將前兩個(gè)的4替換成go

案例一:給你一個(gè)字符串,ip = '192.168.1.1'

3.1 輸出函數(shù):print(ip.split(','))

3.2 輸出結(jié)果:['192.168.1.1']

3.3 解析說(shuō)明:將字符串分割成列表

案例一:給你一個(gè)字符串,ip = '192.168.1.1'

3.3 輸出函數(shù):print(ip.split(',',2))

3.4 輸出結(jié)果:['192.168.1.1']

3.5 解析說(shuō)明:從第二個(gè)開(kāi)始分割成列表


網(wǎng)頁(yè)題目:python在函數(shù) python在函數(shù)外部定義的變量稱作
文章分享:http://weahome.cn/article/hgpehj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部