python基礎:自定義函數

来源:http://www.cnblogs.com/alan-babyblog/archive/2016/01/27/5162456.html
-Advertisement-
Play Games

一、背景在學習函數之前,一直遵循:面向過程編程,即:根據業務邏輯從上到下實現功能,其往往用一長段代碼來實現指定功能,開發過程中最常見的操作就是粘貼複製,也就是將之前實現的代碼塊複製到現需功能處,如下while True: if cpu利用率 > 90%: #發送郵件提醒 ...


一、背景

在學習函數之前,一直遵循:面向過程編程,即:根據業務邏輯從上到下實現功能,其往往用一長段代碼來實現指定功能,開發過程中最常見的操作就是粘貼複製,也就是將之前實現的代碼塊複製到現需功能處,如下

while True:
    if cpu利用率 > 90%:
        #發送郵件提醒
        連接郵箱伺服器
        發送郵件
        關閉連接
  
    if 硬碟使用空間 > 90%:
        #發送郵件提醒
        連接郵箱伺服器
        發送郵件
        關閉連接
  
    if 記憶體占用 > 80%:
        #發送郵件提醒
        連接郵箱伺服器
        發送郵件
        關閉連接

 腚眼一看上述代碼,if條件語句下的內容可以被提取出來公用,如下:

def 發送郵件(內容)
    #發送郵件提醒
    連接郵箱伺服器
    發送郵件
    關閉連接
  
while True:
  
    if cpu利用率 > 90%:
        發送郵件('CPU報警')
  
    if 硬碟使用空間 > 90%:
        發送郵件('硬碟報警')
  
    if 記憶體占用 > 80%:

  

對於上述的兩種實現方式,第二次必然比第一次的重用性和可讀性要好,其實這就是函數式編程和麵向過程編程的區別:

  • 函數式:將某功能代碼封裝到函數中,日後便無需重覆編寫,僅調用函數即可
  • 面向對象:對函數進行分類和封裝,讓開發“更快更好更強...”

函數式編程最重要的是增強代碼的重用性和可讀性

二、 函數的定義和使用

def 函數名(參數):
     
    ...
    函數體
    ...

  

函數的定義主要有如下要點:

  • def:表示函數的關鍵字
  • 函數名:函數的名稱,日後根據函數名調用函數
  • 函數體:函數中進行一系列的邏輯計算,如:發送郵件、計算出 [11,22,38,888,2]中的最大數等...
  • 參數:為函數體提供數據
  • 返回值:當函數執行完畢後,可以給調用者返回數據。

以上要點中,比較重要有參數和返回值:

1、返回值

函數是一個功能塊,該功能到底執行成功與否,需要通過返回值來告知調用者。

def 發送簡訊():
     
    發送簡訊的代碼...
 
    if 發送成功:
        return True
    else:
        return False
 
 
while True:
     
    # 每次執行發送簡訊函數,都會將返回值自動賦值給result
    # 之後,可以根據result來寫日誌,或重發等操作
 
    result = 發送簡訊()
    if result == False:
        記錄日誌,簡訊發送失敗...

  

1、返回值

函數是一個功能塊,該功能到底執行成功與否,需要通過返回值來告知調用者。

def 發送簡訊():
     
    發送簡訊的代碼...
 
    if 發送成功:
        return True
    else:
        return False
 
 
while True:
     
    # 每次執行發送簡訊函數,都會將返回值自動賦值給result
    # 之後,可以根據result來寫日誌,或重發等操作
 
    result = 發送簡訊()
    if result == False:
        記錄日誌,簡訊發送失敗...

  

2、參數

為什麼要有參數?

def CPU報警郵件()
    #發送郵件提醒
    連接郵箱伺服器
    發送郵件
    關閉連接

def 硬碟報警郵件()
    #發送郵件提醒
    連接郵箱伺服器
    發送郵件
    關閉連接

def 記憶體報警郵件()
    #發送郵件提醒
    連接郵箱伺服器
    發送郵件
    關閉連接
 
while True:
 
    if cpu利用率 > 90%:
        CPU報警郵件()
 
    if 硬碟使用空間 > 90%:
        硬碟報警郵件()
 
    if 記憶體占用 > 80%:
        記憶體報警郵件()

上例,無參數實現

  

def 發送郵件(郵件內容)

    #發送郵件提醒
    連接郵箱伺服器
    發送郵件
    關閉連接

 
while True:
 
    if cpu利用率 > 90%:
        發送郵件("CPU報警了。")
 
    if 硬碟使用空間 > 90%:
        發送郵件("硬碟報警了。")
 
    if 記憶體占用 > 80%:
        發送郵件("記憶體報警了。")

  

函數的有三中不同的參數:

  • 普通參數
  • 預設參數
  • 動態參數
# ######### 定義函數 ######### 

# name 叫做函數func的形式參數,簡稱:形參
def func(name):
    print name

# ######### 執行函數 ######### 
#  'wupeiqi' 叫做函數func的實際參數,簡稱:實參
func('wupeiqi')

普通參數

  

def func(name, age = 18):
    
    print "%s:%s" %(name,age)

# 指定參數
func('wupeiqi', 19)
# 使用預設參數
func('alex')

註:預設參數需要放在參數列表最後

預設參數

  

def func(*args):

    print args


# 執行方式一
func(11,33,4,4454,5)

# 執行方式二
li = [11,2,2,3,3,4,54]
func(*li)

動態參數一

  

def func(**kwargs):

    print args


# 執行方式一
func(name='wupeiqi',age=18)

# 執行方式二
li = {'name':'wupeiqi', age:18, 'gender':'male'}
func(**li)
動態參數二


def func(*args, **kwargs):

    print args
    print kwargs

  

python的變參

*args和**kwargs是Python的兩個動態參數,兩者有所不同的是*args是個tuple,**kwargs是個dict。

*args 和**kwargs並用時,*args必須放在**kwargs的前面。

例如:

def func(a,b, *c):

    pass

函數func至少有兩個參數變參數放在tuple  c中

def func(*c): 或者 def  func(**dc) 參數不確定

def func(a, *c, **dc):  可以共用*args和**kwargs,不過一定要把*args放在前


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前一直覺得定時程式好神秘,後來,當我自己真正寫了一個小的定時程式時,發現其實沒有想象中的那麼難。下麵,我分享一下我自己的操作過程,希望能對大家有幫助。1)在我們的項目中添加引用文件:TaskSchedulerEngine.dll(dll定義了一個ITask介面,定義了兩個方法Initialize和...
  • 問題:在MSSQLServer中定義的存儲過程可以直接返回一個數據集,如:create procedure sp_getAllEmployeesasSELECT * FROM [NORTHWND].[dbo].[Employees]在Oracle資料庫中這樣定義是錯誤的,怎麼解決?辦法:Oracle...
  • 12-5. 自動刪除相關聯實體問題當一個實體被刪除時,你想自動刪除它相關聯的實體解決方案假設你有一個表結構由一個course (科目), course 的classes (課程),以及enrollment (登記學生選課),如 Figure 12-5所示:.Figure 12-5. The Cour...
  • 需求:工廠類根據參數生成對應類的實例。示例:RoomParts.csnamespace ReflectionFactory{ /// /// 屋子產品的零件 /// public enum RoomParts { Roof, Window...
  • Control:1 public ActionResult GetPositionName(int parentid) //發佈新職位頁面中的根據職位類別,獲取職位名稱2 {3 List categorylist2 = categorymanage.G...
  • 實現反射的類型大多數都定義在System.Reflection命名空間之下。Assembly 定義一個Assembly,它是可重用、無版本衝突並且可自我描述的公共語言運行庫應用程式構造塊。AssemblyName 完整描述程式集的唯一標識EventInfo 發現事件的屬性(Attribute)...
  • Web大前端時代之:HTML5+CSS3入門系列:http://www.cnblogs.com/dunitian/p/5121725.html 定位類型 IP 定位 優點 任何位置都可用 在伺服器端處理 缺點 不精確,一般精確到城市 運算代價大,可能出錯 代理的時候就可能定位出錯了 GPS定位 優點...
  • 2016.1.27|A1∪A2∪…∪Am| = (1≤i≤m)∑|Ai| - (1≤i<j≤m)∑|Ai∩Aj| + (1≤i<j<k≤m)∑|Ai∩Aj∩Ak | - … + (-1)m-1|A1∩A2∩…∩Am|就是這東西,沒什麼好說的,不大懂的話取個較小的m試一下文氏圖就好,至於證明,出門右轉...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...