Python學習,第八課 - 函數

来源:https://www.cnblogs.com/yidaoge/archive/2020/02/04/12261561.html
-Advertisement-
Play Games

本次講解函數,由於內容比較多,小編列了個大綱,主要有一下內容: 1. 函數基本語法及特性 2. 函數參數 3.局部變數 4. 返回值 5.嵌套函數 6.遞歸 7.匿名函數 8.高階函數 9.內置函數 1. 函數基本語法及特性 函數的定義:函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執 ...


本次講解函數,由於內容比較多,小編列了個大綱,主要有一下內容:

1. 函數基本語法及特性

2. 函數參數

3.局部變數

4. 返回值

5.嵌套函數

6.遞歸

7.匿名函數

8.高階函數

9.內置函數

 

1. 函數基本語法及特性

函數的定義:函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可

函數的特性:

  1. 減少重覆代碼
  2. 使程式變的可擴展
  3. 使程式變的易維護

函數的語法定義

直接上代碼:

# def 是定義函數的關鍵字

def test():#test既是函數名
    print('學習Python的第一個函數')
    
test() #調用函數

 

同時函數也可以帶參數

a, b = 1, 3


# 帶參函數
def test(x, y):  # x 和 y 即是在我們調用函數時傳入的參數
    return x + y  # 返回執行的結果


c = test(a, b)  # 把函數返回結果賦值給 C
print(c)

 

 

2. 函數參數

在說函數參數前,大家需要瞭解一個知識點,形參 & 實參

何為形參?

既變數只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。

因此,形參只在函數內部有效,函數調用結束返回主調用函數後則不能再使用該形參變數

何為實參?

既可以是常量、變數、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。

因此應預先用賦值,輸入等辦法使參數獲得確定值

這麼說可能有些不理解,還是來個實例讓大家更加清晰:

a, b = 1, 3


def test(x, y):  # x 和 y 即是形參
    return x + y

c = test(a, b)  # a,b既是實參
print(c)

 

 

關鍵參數

上面的例子中,我們調用函數傳參是根據函數的形參位置來傳遞的。

既 a 傳給 x ,b 傳給 y。這種叫做位置參數。

我們還可以使用關鍵參數,既傳遞的時候給函數的參數名傳遞你的值:

a, b = 1, 3


# 帶參函數
def test(x, y):
    return x + y


c = test(y=a, x=b)#這裡把 a 傳給 y , b 傳給 x
print(c)

 

這樣參數就可以不用按照順序傳遞,根據參數名傳遞給函數。

我們甚至可以把位置參數和關鍵參數同時使用:

a, b = 1, 3


def test(x, y):
    return x + y


c = test(1, y=b)
print(c)

 

如果同時使用一定要註意:關鍵參數必須要放在位置參數的後面,並且已經傳值的位置參數不能再用關鍵參數

下麵是一些錯誤的用法:

c = test(x=a, b)
#報錯:TypeError: test() got multiple values for argument 'x'
c = test(a, x=b)
#報錯:TypeError: test() got multiple values for argument 'x'

 

 

預設參數

參數還可以設置一個預設值,這樣我們在調用的時候既可以不傳參給預設參數

def test(x, y, z=9):  # 設置了 z 的預設值是 9
    print(x + y + z)

test(1, 3)#如果我們第三個參數也就是z 不傳的話,z的預設值就是9
test(1, 3, 10)#我們傳了第三個參數,則 z 的值就變成10

 

 

非固定參數

所謂非固定參數就是可以傳遞任意個數的參數,比如你的函數在定義的時候不能確定用戶想傳入多少個參數,就可以使用

def test(*args):  # 使用 *args, 這裡args可以改成任意變數名,但是不建議這麼做。
    print(args)


test()
# 輸出結果:()
test(1, 2)
# 輸出結果:(1, 2)
test(1, 2, '承受', 'Python')
# 輸出結果:(1, 2, '承受', 'Python')

 

調用函數可以傳入任意個數的參數,然後轉換成 元組 的形式

 

3.局部變數

局部變數:就是只能在局部使用的變數

name = 'Cheng Shou'


def change_name(name):
    print('改變前:', name)
    name = '承受'
    print('改變後:', name)


change_name(name)

print('在外面在看下name的值:', name)

#輸出結果:
#改變前: Cheng Shou
#改變後: 承受
#在外面在看下name的值: Cheng Shou

 

從上面的例子大家發現了沒?函數裡面的name修改了,函數外面的name沒有改變。

其實函數裡面的name 就是局部變數,他並沒有調用外部的name。

 

那函數裡面就不能使用全局變數了嗎?非要用也是可以的

name = 'Cheng Shou'


def change_name():
    global name #在函數中使用global既可
    print('改變前:', name)
    name = '承受'
    print('改變後:', name)


change_name()

print('在外面在看下name的值:', name)

#輸出結果:
#改變前: Cheng Shou
#改變後: 承受
#在外面在看下name的值: 承受

 

使用global 既可,我們的全局變數也被修改了。

當然不建議這麼做。

 

全局變數與局部變數

在子程式中定義的變數稱為局部變數,在程式的一開始定義的變數稱為全局變數。 全局變數作用域是整個程式,局部變數作用域是定義該變數的子程式。 當全局變數與局部變數同名時: 在定義局部變數的子程式內,局部變數起作用;在其它地方全局變數起作用

 

4. 返回值

其實我們第一個例子中就有用到返回值,既 return 語句。return可以吧函數的執行結果返回

返回值記住兩點:

1.函數在執行過程中只要遇到 return 語句就會停止函數的執行,並且返回結果。所以 return 語句出現就代表著函數結束

2.如果函數中未使用 return ,那函數執行完畢後,返回的值為 None

 

5.嵌套函數

顧名思義就是函數裡面套函數,小編看到這個也是內心驚呼一聲:python 果然牛掰

那麼怎麼套呢,上代碼:

name = 'Cheng Shou'


def change_name():
    name = '小承'

    def change_name2():
        name = '小受'
        print('第三層:', name)

    change_name2() # 調用記憶體函數
    print('第二層:', name)


change_name()
print('最外層:', name)

#輸出結果:
#第三層: 小受
#第二層: 小承
#最外層: Cheng Shou

 

神奇吧,一層套一層,跟俄羅斯套娃一樣

至於這個嵌套函數什麼作用,之後學習到裝飾器的時候我們就知道了。

 

6.遞歸

在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。

說白了,就是在函數裡面調用自身函數

def subtraction(n):
    print(n)
    if n < 1:
        return n
    return subtraction(n-1)

subtraction(5)

#輸出結果:
#5
#4
#3
#2
#1
#0

 

註意:python預設的遞歸深度是很有限的(預設是1000),因此當遞歸深度超過999的樣子,就會引發這樣的一個異常。

報錯:RecursionError: maximum recursion depth exceeded while calling a Python object

如果你的業務需要遞歸深度超過1000,則需要修改遞歸深度的值

import sys
sys.setrecursionlimit(10000)

 

導入sys模塊,然後設置,需要多大就設置多大既可。

一般我們的業務代碼不建議超過預設深度,否則代碼性能不好。

在二分查找的時候,我們會用到遞歸,不過這講到演算法問題本篇就直接帶過,後續有時間小編在寫一篇演算法相關的文章

遞歸特性:

1. 必須有一個明確的結束條件

2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少

3. 遞歸效率不高,遞歸層次過多會導致棧溢出(在電腦中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出)

 

7.匿名函數

匿名函數就是不需要顯式的指定函數

def test(n):
    return n + 1

print(test(2))
# 上面的函數修改成匿名函數後
test = lambda n: n + 1
print(test(2))

 

一般匿名函數是和其它函數搭配使用的,如下

print(map(lambda x: x ** 2, [1, 2, 3, 4, 5]) )
#輸出:[1, 4, 9, 16, 25]

 

 

8.高階函數

變數可以指向函數,函數的參數能接收變數,那麼一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。

簡單的說就是把函數當做參數傳遞給另一個函數,在函數中調用傳遞過來的函數。

def add(x, y, func):
    return func(x) + func(y)

def square(n):
    return n ** 2

res = add(3, 6, square)
print(res)

 

這裡把square函數,傳遞給了add ,並且在add中使用了 square函數。這便實現了高階函數

 

9.內置函數

直接展示一張圖,不做詳解,大家使用到的時候在瞭解既可。

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • Kafka系列1:Kafka概況 Kafka是當前分散式系統中最流行的消息中間件之一,憑藉著其高吞吐量的設計,在日誌收集系統和消息系統的應用場景中深得開發者喜愛。本篇就聊聊Kafka相關的一些知識點。主要包括以下內容: Kafka簡介 Kafka特點 Kafka基本概念 Kafka架構 Kafka的 ...
  • 學習要求: 知道一點兒函數式介面和Lambda表達式的基礎知識,有利於更好的學習。 1.先體驗一下Stream的好處 需求:給你一個ArrayList用來保存學生的成績,讓你列印出其中大於60的成績。 解決方案二: 使用Stream流操作,只需要一行代碼 2.什麼是Stream流? 在Jdk1.8中 ...
  • 一、 Calendar解析 package com.bjpowernode.java_learning; import java.util.Date; import java.text.ParseException; import java.text.SimpleDateFormat; import ...
  • MySQL在SQL中,合理的別名可以讓SQL更容易以及可讀性更高。別名使用as來表示,可以分為表別名和列別名,別名應該是先定義後使用才對,所以首先要瞭解sql的執行順序(1) from(2) on(3) join(4) where(5) group by(開始可以使用select的別名,後面的也行) ...
  • /** * 查詢還沒生成索引的帖子 * @return */ @Query(value = "SELECT * FROM t_article WHERE index_state=0",nativeQuery = true) public List<Article> getArticleNoIndex ...
  • 聯表查詢: SELECT t1.user_Name FROM t_user AS t1 , t_comment AS t2 WHERE t2.user_id=t1.id 結果如圖: 加上GROUP BY user_name(SELECT t1.user_Name FROM t_user AS t1 ...
  • 前一期博文中,初步探索了numpy中矩陣的幾種運算操作,本文將展示numpy矩陣的元素抽取與合併操作。 1 元素抽取 在我們使用矩陣的時候,有時需要提取出矩陣的某些位置上的元素單獨研究,這時就需要熟悉矩陣元素的定位操作。 1.1 提取單個元素 從上圖中可以看到:矩陣的行列次序是從零開始的,即代碼中矩 ...
  • pip install mitmproxy Man In The Middle 原理 mitmproxy工程工具包,主要包含了3個組件 功能一致,交互界面不同 mitmproxy:命令行界面,window不支持 mitmdump:命令行介面,可以對接python腳本,通過腳本實現監聽後的處理,可定製 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...