麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 使用 Python 函數進行模塊化

使用 Python 函數進行模塊化

來源:千鋒教育
發布人:xqq
時間: 2023-11-07 05:35:08 1699306508

你是否對函數、類、方法、庫和模塊等花哨的編程術語感到困惑?你是否在與變量作用域斗爭?無論你是自學成才的還是經過正式培訓的程序員,代碼的模塊化都會令人困惑。但是類和庫鼓勵模塊化代碼,因為模塊化代碼意味著只需構建一個多用途代碼塊集合,就可以在許多項目中使用它們來減少編碼工作量。換句話說,如果你按照本文對Python函數的研究,你將找到更聰明的工作方法,這意味著更少的工作。

本文假定你對Python很熟(LCTT譯注:稍微熟悉就可以),并且可以編寫和運行一個簡單的腳本。如果你還沒有使用過Python,請首先閱讀我的文章:Python簡介。

函數

函數是邁向模塊化過程中重要的一步,因為它們是形式化的重復方法。如果在你的程序中,有一個任務需要反復執行,那么你可以將代碼放入一個函數中,根據需要隨時調用該函數。這樣,你只需編寫一次代碼,就可以隨意使用它。

以下一個簡單函數的示例:

#!/usr/bin/envpython3

importtime

defTimer():

print("Timeis"+str(time.time()))

創建一個名為mymodularity的目錄,并將以上函數代碼保存為該目錄下的timestamp.py。

除了這個函數,在mymodularity目錄中創建一個名為__init__.py的文件,你可以在文件管理器或bashshell中執行此操作:

$touchmymodularity/__init__.py

現在,你已經創建了屬于你自己的Python庫(Python中稱為“模塊”),名為mymodularity。它不是一個特別有用的模塊,因為它所做的只是導入time模塊并打印一個時間戳,但這只是一個開始。

要使用你的函數,像對待任何其他Python模塊一樣對待它。以下是一個小應用,它使用你的mymodularity軟件包來測試Pythonsleep()函數的準確性。將此文件保存為sleeptest.py,注意要在mymodularity文件夾之外,因為如果你將它保存在mymodularity里面,那么它將成為你的包中的一個模塊,你肯定不希望這樣。

#!/usr/bin/envpython3

importtime

frommymodularityimporttimestamp

print("TestingPythonsleep()...")

#modularity

timestamp.Timer()

time.sleep(3)

timestamp.Timer()

在這個簡單的腳本中,你從mymodularity包中調用timestamp模塊兩次。從包中導入模塊時,通常的語法是從包中導入你所需的模塊,然后使用模塊名稱+一個點+要調用的函數名(例如timestamp.Timer())。

你調用了兩次Timer()函數,所以如果你的timestamp模塊比這個簡單的例子復雜些,那么你將節省大量重復代碼。

保存文件并運行:

$python3./sleeptest.py

TestingPythonsleep()...

Timeis1560711266.1526039

Timeis1560711269.1557732

根據測試,Python中的sleep函數非常準確:在三秒鐘等待之后,時間戳成功且正確地增加了3,在微秒單位上差距很小。

Python庫的結構看起來可能令人困惑,但其實它并不是什么魔法。Python被編程為一個包含Python代碼的目錄,并附帶一個__init__.py文件,那么這個目錄就會被當作一個包,并且Python會首先在當前目錄中查找可用模塊。這就是為什么語句frommymodularityimporttimestamp有效的原因:Python在當前目錄查找名為mymodularity的目錄,然后查找timestamp.py文件。

你在這個例子中所做的功能和以下這個非模塊化的版本是一樣的:

#!/usr/bin/envpython3

importtime

frommymodularityimporttimestamp

print("TestingPythonsleep()...")

#nomodularity

print("Timeis"+str(time.time()))

time.sleep(3)

print("Timeis"+str(time.time()))

對于這樣一個簡單的例子,其實沒有必要以這種方式編寫測試,但是對于編寫自己的模塊來說,優秀的實踐是你的代碼是通用的,可以將它重用于其他項目。

通過在調用函數時傳遞信息,可以使代碼更通用。例如,假設你想要使用模塊來測試的不是系統的sleep函數,而是用戶自己實現的sleep函數,更改timestamp代碼,使它接受一個名為msg的傳入變量,它將是一個字符串,控制每次調用timestamp時如何顯示:

#!/usr/bin/envpython3

importtime

#更新代碼

defTimer(msg):

print(str(msg)+str(time.time()))

現在函數比以前更抽象了。它仍會打印時間戳,但是它為用戶打印的內容msg還是未定義的。這意味著你需要在調用函數時定義它。

Timer函數接受的msg參數是隨便命名的,你可以使用參數m、message或text,或是任何對你來說有意義的名稱。重要的是,當調用timestamp.Timer函數時,它接收一個文本作為其輸入,將接收到的任何內容放入msg變量中,并使用該變量完成任務。

以下是一個測試測試用戶正確感知時間流逝能力的新程序:

#!/usr/bin/envpython3

frommymodularityimporttimestamp

print("PresstheRETURNkey.Countto3,andpressRETURNagain.")

input()

timestamp.Timer("Startedtimerat")

print("Countto3...")

input()

timestamp.Timer("Yousleptuntil")

將你的新程序保存為response.py,運行它:

$python3./response.py

PresstheRETURNkey.Countto3,andpressRETURNagain.

Startedtimerat1560714482.3772075

Countto3...

Yousleptuntil1560714484.1628013

函數和所需參數

新版本的timestamp模塊現在需要一個msg參數。這很重要,因為你的第一個應用程序將無法運行,因為它沒有將字符串傳遞給timestamp.Timer函數:

$python3./sleeptest.py

TestingPythonsleep()...

Traceback(mostrecentcalllast):

File"./sleeptest.py",line8,in

timestamp.Timer()

TypeError:Timer()missing1requiredpositionalargument:'msg'

你能修復你的sleeptest.py應用程序,以便它能夠與更新后的模塊一起正確運行嗎?

變量和函數

通過設計,函數限制了變量的范圍。換句話說,如果在函數內創建一個變量,那么這個變量只在這個函數內起作用。如果你嘗試在函數外部使用函數內部出現的變量,就會發生錯誤。

下面是對response.py應用程序的修改,嘗試從timestamp.Timer()函數外部打印msg變量:

#!/usr/bin/envpython3

frommymodularityimporttimestamp

print("PresstheRETURNkey.Countto3,andpressRETURNagain.")

input()

timestamp.Timer("Startedtimerat")

print("Countto3...")

input()

timestamp.Timer("Yousleptfor")

print(msg)

試著運行它,查看錯誤:

$python3./response.py

PresstheRETURNkey.Countto3,andpressRETURNagain.

Startedtimerat1560719527.7862902

Countto3...

Yousleptfor1560719528.135406

Traceback(mostrecentcalllast):

File"./response.py",line15,in

print(msg)

NameError:name'msg'isnotdefined

應用程序返回一個NameError消息,因為沒有定義msg。這看起來令人困惑,因為你編寫的代碼定義了msg,但你對代碼的了解比Python更深入。調用函數的代碼,不管函數是出現在同一個文件中,還是打包為模塊,都不知道函數內部發生了什么。一個函數獨立地執行它的計算,并返回你想要它返回的內容。這其中所涉及的任何變量都只是本地的:它們只存在于函數中,并且只存在于函數完成其目的所需時間內。

Return語句

如果你的應用程序需要函數中特定包含的信息,那么使用return語句讓函數在運行后返回有意義的數據。

時間就是金錢,所以修改timestamp函數,以使其用于一個虛構的收費系統:

#!/usr/bin/envpython3

importtime

defTimer(msg):

print(str(msg)+str(time.time()))

charge=.02

returncharge

現在,timestamp模塊每次調用都收費2美分,但最重要的是,它返回每次調用時所收取的金額。

以下一個如何使用return語句的演示:

#!/usr/bin/envpython3

frommymodularityimporttimestamp

print("PressRETURNforthetime(costs2cents).")

print("PressQRETURNtoquit.")

total=0

whileTrue:

kbd=input()

ifkbd.lower()=="q":

print("Youowe$"+str(total))

exit()

else:

charge=timestamp.Timer("Timeis")

total=total+charge

在這個示例代碼中,變量charge為timestamp.Timer()函數的返回,它接收函數返回的任何內容。在本例中,函數返回一個數字,因此使用一個名為total的新變量來跟蹤已經進行了多少更改。當應用程序收到要退出的信號時,它會打印總花費:

$python3./charge.py

PressRETURNforthetime(costs2cents).

PressQRETURNtoquit.

Timeis1560722430.345412

Timeis1560722430.933996

Timeis1560722434.6027434

Timeis1560722438.612629

Timeis1560722439.3649364

q

Youowe$0.1

內聯函數

函數不必在單獨的文件中創建。如果你只是針對一個任務編寫一個簡短的腳本,那么在同一個文件中編寫函數可能更有意義。唯一的區別是你不必導入自己的模塊,但函數的工作方式是一樣的。以下是時間測試應用程序的最新迭代:

#!/usr/bin/envpython3

importtime

total=0

defTimer(msg):

print(str(msg)+str(time.time()))

charge=.02

returncharge

print("PressRETURNforthetime(costs2cents).")

print("PressQRETURNtoquit.")

whileTrue:

kbd=input()

ifkbd.lower()=="q":

print("Youowe$"+str(total))

exit()

else:

charge=Timer("Timeis")

total=total+charge

它沒有外部依賴(Python發行版中包含time模塊),產生與模塊化版本相同的結果。它的優點是一切都位于一個文件中,缺點是你不能在其他腳本中使用Timer()函數,除非你手動復制和粘貼它。

全局變量

在函數外部創建的變量沒有限制作用域,因此它被視為全局變量。

全局變量的一個例子是在charge.py中用于跟蹤當前花費的total變量。total是在函數之外創建的,因此它綁定到應用程序而不是特定函數。

應用程序中的函數可以訪問全局變量,但要將變量傳入導入的模塊,你必須像發送msg變量一樣將變量傳入模塊。

全局變量很方便,因為它們似乎隨時隨地都可用,但也很難跟蹤它們,很難知道哪些變量不再需要了但是仍然在系統內存中停留(盡管Python有非常好的垃圾收集機制)。

但是,全局變量很重要,因為不是所有的變量都可以是函數或類的本地變量。現在你知道了如何向函數傳入變量并獲得返回,事情就變得容易了。

以上內容為大家介紹了使用Python函數進行模塊化,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。http://www.dietsnews.net/

tags: python培訓
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 黑人巨大战冲田杏梨| 欧美日韩高清完整版在线观看免费 | 伊人色综合久久| 与子乱勾搭对白在线观看| 放荡的女老板bd中文在线观看| 中文字幕一精品亚洲无线一区| jizz老师喷水| 日本伊人色综合网| 蜜桃精品| 波多野结衣女教师6bd| 丁香伊人| 久久九九国产精品怡红院| 一个人晚上在线观看的免费视频| 日本污全彩肉肉无遮挡彩色| 成人永久福利免费观看| 中文字幕精品亚洲无线码二区| 最近中文字幕最新在线视频| 久久久久久亚洲精品| 亚洲人成伊人成综合网久久久| 日本三级免费观看| 大陆三级午夜理伦三级三| 国产色秀视频在线观看| 天天夜天干天天爽| 色老太bbw| 日b视频在线观看| 日本私人影院| 87福利网| 波多野结衣porn| 日韩中文在线播放| 日韩精品一区二区三区在线观看l 日韩精品无码一区二区三区 | 欧美人善交videosg| 波多野结衣1区| 三级久久| 最近高清中文在线国语字幕 | 国产特黄一级片| 国产精品v欧美精品∨日韩| 波多野结衣动态图| 攵女yin乱合集高h文| 欧美日一级片| 蜜柚视频影院在线播放| 国产四虎精品|