成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用 Python 函數(shù)進行模塊化

開發(fā) 后端
使用 Python 函數(shù)來很大程度地減少重復任務編碼工作量。 你是否對函數(shù)、類、方法、庫和模塊等花哨的編程術(shù)語感到困惑?你是否在與變量作用域斗爭?無論你是自學成才的還是經(jīng)過正式培訓的程序員,代碼的模塊化都會令人困惑。

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

[[275550]]

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

函數(shù)

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

以下一個簡單函數(shù)的示例:

  1. #!/usr/bin/env python3 
  2. import time 
  3. def Timer(): 
  4.  print("Time is " + str(time.time() )) 

創(chuàng)建一個名為 mymodularity 的目錄,并將以上函數(shù)代碼保存為該目錄下的 timestamp.py。

除了這個函數(shù),在 mymodularity 目錄中創(chuàng)建一個名為 __init__.py 的文件,你可以在文件管理器或 bash shell 中執(zhí)行此操作:

  1. $ touch mymodularity/__init__.py 

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

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

  1. #!/usr/bin/env python3 
  2. import time 
  3. from mymodularity import timestamp 
  4. print("Testing Python sleep()..."
  5. # modularity 
  6. timestamp.Timer() 
  7. time.sleep(3) 
  8. timestamp.Timer() 

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

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

保存文件并運行:

  1. $ python3 ./sleeptest.py 
  2. Testing Python sleep()... 
  3. Time is 1560711266.1526039 
  4. Time is 1560711269.1557732 

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

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

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

  1. #!/usr/bin/env python3 
  2. import time 
  3. from mymodularity import timestamp 
  4. print("Testing Python sleep()..."
  5. no modularity 
  6. print("Time is " + str(time.time() ) ) 
  7. time.sleep(3) 
  8. print("Time is " + str(time.time() ) ) 

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

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

  1. #!/usr/bin/env python3 
  2. import time 
  3. # 更新代碼 
  4. def Timer(msg): 
  5.  print(str(msg) + str(time.time() ) ) 

現(xiàn)在函數(shù)比以前更抽象了。它仍會打印時間戳,但是它為用戶打印的內(nèi)容 msg 還是未定義的。這意味著你需要在調(diào)用函數(shù)時定義它。

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

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

  1. #!/usr/bin/env python3 
  2. from mymodularity import timestamp 
  3. print("Press the RETURN key. Count to 3, and press RETURN again."
  4. input() 
  5. timestamp.Timer("Started timer at "
  6. print("Count to 3..."
  7. input() 
  8. timestamp.Timer("You slept until "

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

  1. $ python3 ./response.py 
  2. Press the RETURN keyCount to 3, and press RETURN again. 
  3. Started timer at 1560714482.3772075 
  4. Count to 3... 
  5. You slept until 1560714484.1628013 

函數(shù)和所需參數(shù)

新版本的 timestamp 模塊現(xiàn)在 需要 一個 msg 參數(shù)。這很重要,因為你的第一個應用程序?qū)o法運行,因為它沒有將字符串傳遞給 timestamp.Timer 函數(shù):

  1. $ python3 ./sleeptest.py 
  2. Testing Python sleep()... 
  3. Traceback (most recent call last): 
  4.  File "./sleeptest.py", line 8, in <module> 
  5.  timestamp.Timer() 
  6. TypeError: Timer() missing 1 required positional argument: 'msg' 

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

變量和函數(shù)

通過設計,函數(shù)限制了變量的范圍。換句話說,如果在函數(shù)內(nèi)創(chuàng)建一個變量,那么這個變量 只 在這個函數(shù)內(nèi)起作用。如果你嘗試在函數(shù)外部使用函數(shù)內(nèi)部出現(xiàn)的變量,就會發(fā)生錯誤。

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

  1. #!/usr/bin/env python3 
  2. from mymodularity import timestamp 
  3. print("Press the RETURN key. Count to 3, and press RETURN again."
  4. input() 
  5. timestamp.Timer("Started timer at "
  6. print("Count to 3..."
  7. input() 
  8. timestamp.Timer("You slept for "
  9. print(msg) 

試著運行它,查看錯誤:

  1. $ python3 ./response.py 
  2. Press the RETURN keyCount to 3, and press RETURN again. 
  3. Started timer at 1560719527.7862902 
  4. Count to 3... 
  5. You slept for 1560719528.135406 
  6. Traceback (most recent call last): 
  7.  File "./response.py", line 15, in <module> 
  8.  print(msg) 
  9. NameError: name 'msg' is not defined 

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

Return 語句

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

時間就是金錢,所以修改 timestamp 函數(shù),以使其用于一個虛構(gòu)的收費系統(tǒng):

  1. #!/usr/bin/env python3 
  2. import time 
  3. def Timer(msg): 
  4.  print(str(msg) + str(time.time() ) ) 
  5.  charge = .02 
  6.  return charge 

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

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

  1. #!/usr/bin/env python3 
  2. from mymodularity import timestamp 
  3. print("Press RETURN for the time (costs 2 cents)."
  4. print("Press Q RETURN to quit."
  5. total = 0 
  6. while True
  7.  kbd = input() 
  8.  if kbd.lower() == "q"
  9.  print("You owe $" + str(total) ) 
  10.  exit() 
  11.  else
  12.  charge = timestamp.Timer("Time is "
  13.  total = total+charge 

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

  1. $ python3 ./charge.py 
  2. Press RETURN for the time (costs 2 cents). 
  3. Press Q RETURN to quit. 
  4. Time is 1560722430.345412 
  5. Time is 1560722430.933996 
  6. Time is 1560722434.6027434 
  7. Time is 1560722438.612629 
  8. Time is 1560722439.3649364 
  9. You owe $0.1 

內(nèi)聯(lián)函數(shù)

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

  1. #!/usr/bin/env python3 
  2. import time 
  3. total = 0 
  4. def Timer(msg): 
  5.  print(str(msg) + str(time.time() ) ) 
  6.  charge = .02 
  7.  return charge 
  8. print("Press RETURN for the time (costs 2 cents)."
  9. print("Press Q RETURN to quit."
  10. while True
  11.  kbd = input() 
  12.  if kbd.lower() == "q"
  13.  print("You owe $" + str(total) ) 
  14.  exit() 
  15.  else
  16.  charge = Timer("Time is "
  17.  total = total+charge 

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

全局變量

在函數(shù)外部創(chuàng)建的變量沒有限制作用域,因此它被視為 全局 變量。

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

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

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

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

總結(jié)

你已經(jīng)學到了很多關于函數(shù)的知識,所以開始將它們放入你的腳本中 —— 如果它不是作為單獨的模塊,那么作為代碼塊,你不必在一個腳本中編寫多次。在本系列的下一篇文章中,我將介紹 Python 類。

 

責任編輯:華軒 來源: Linux中國
相關推薦

2010-03-11 17:24:27

Python編程語言

2019-08-28 16:18:39

JavaScriptJS前端

2019-01-30 14:04:57

Fedora存儲庫

2013-08-20 18:39:34

JavaScript模requireJS

2020-09-17 10:30:21

前端模塊化組件

2013-08-20 15:31:18

前端模塊化

2017-05-18 10:23:55

模塊化開發(fā)RequireJsJavascript

2015-10-10 11:29:45

Java模塊化系統(tǒng)初探

2022-03-11 13:01:27

前端模塊

2020-09-18 09:02:32

前端模塊化

2013-08-20 17:05:38

HTML5 BoileWeb App模塊化

2018-03-21 21:31:28

Java9編程Java

2022-09-05 09:01:13

前端模塊化

2018-06-21 09:36:09

模塊化數(shù)據(jù)中心集中化

2016-10-09 11:03:41

Javascript模塊化Web

2017-05-18 11:43:41

Android模塊化軟件

2016-12-21 17:02:35

數(shù)據(jù)中心MDC模塊化

2023-06-28 08:12:49

Python代碼重構(gòu)

2022-09-21 11:51:26

模塊化應用

2015-04-13 17:15:11

模塊化UPS華為
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产一区二区麻豆 | 一区二区三区在线 | 久草资源在线 | 在线播放国产一区二区三区 | 免费视频一区二区 | 特级黄一级播放 | 蜜桃av一区二区三区 | 男女激情网站免费 | 国产精品久久久久久久久久久久午夜片 | 国产日韩精品一区二区 | 久久久无码精品亚洲日韩按摩 | 欧美在线a | 美国av毛片 | 免费在线观看av网址 | 久久久999免费视频 999久久久久久久久6666 | 久久精品国产久精国产 | 成人免费网站在线 | 九九热精品免费 | 日韩欧美在线观看视频 | 精品香蕉一区二区三区 | 日韩欧美在线一区二区 | 午夜二区 | k8久久久一区二区三区 | 国产精品一区二区不卡 | 久久久国产精品 | 中文字幕欧美一区 | 成人午夜高清 | 伊大人久久 | 久久九七 | 97人人草| 日韩在线播放av | 天天草天天射 | 国产一在线观看 | 国产美女福利在线观看 | 午夜伊人 | 久产久精国产品 | 久久伊| 日韩毛片 | 亚洲一区二区三区四区五区午夜 | 精品欧美一区二区三区久久久 | 精品国产不卡一区二区三区 |