Python的函數簡析

1.面向過程的基本定義,以及函數在內存中基本調用情況

2.Python中函數的基本應用(定義,調用,傳參)

3.Python中函數參數簡析(必需參數,命名(關鍵字)參數,默認參數,可變* **,匿名參數表達式,全局函數的引用)

4.返回值簡析()

5.函數間參數的傳遞,以及函數的傳遞

6.修改全局變量的問題

 

 

 

壹   函數是面向過程語言的基礎

函數是面向過程語言的基礎,當然,Python是一門大名鼎鼎的面向對象的語言,但是函數也是Python很重要的一個組成部分

什麼是面向過程?

打個比方,食堂要給1000個員工做飯,面向過程的話就是:給員工A做西紅柿炒蛋,給員工A做青椒小炒肉,給員工B做西紅柿炒蛋,給員工B做青椒小炒肉,給員工C做西紅柿炒蛋,給員工C做青椒小炒肉,給員工D......  以此類推,由上而下,總頭至尾按部就班的執行所需要的步驟,就是面向過程的編程。

底層開發經常用的c語言,就是一款很典型的面向過程的編程語言,它是根據目標,去一個個的調用執行所需要的函數,按步驟一步步來的。

所以,函數的存在就是面向過程一個重要的標誌;那什麼是面向對象呢?後面講到了Python面向對象編程的思想以後,我會再次拿這個食堂做飯的例子講一下,就茅塞頓開了~

在Python中,調用一個函數的調用過程,在底層解釋中叫做 “ 壓棧 ” ,就是把需要調用的函數代碼編譯的機器語言轉入到內存中,新建一個堆進行執行操作;等到函數執行完之後,就將內存中的機器餘語言代碼清空,擬稱爲 “ 彈棧 ” 。 

 

 

 

貳   Python中函數的基本應用

在Python中,如果要創建一個函數,需要如下定義:

def 函數名 (參數):
    函數體
    return 返回值
  • 因爲函數是一種對縮進換行敏感的語言,所以必須以關鍵字def開頭;
  • 後面接着函數的名稱和圓括號()內存放着需要使用的參數列表;
  • 函數的內容必須要以外加縮進起始;
  • return後緊跟需要返回給調用者的數值,專稱返回值;

我們先試着寫出並調用一個最簡單的輸出函數:

於是我們所需要的字符串就被輸出了出來;這是一個典型的無參函數:因爲函數內沒有參數的傳遞等問題;

這就是一個很典型的有參函數,參數傳遞中數據類型爲“str”值

上面兩個例子中在結尾分別通過有參數調用和無參調用了兩個不同的函數,形式都是:

函數名 (參數)

 

 

 

叄   Python中函數參數簡析

在Python中,函數內的參數主要有以下幾個類型:

  • 必需參數
  • 命名(關鍵字)參數
  • 默認參數
  • 可變 *** 類型
  • 匿名參數
  • 全局函數的引用*

 

必需參數:

簡要地說就是必需向函數內傳入一個正確的參數,不然函數就會報錯

如此報錯,所以說,在上面這個例子內的函數來說,par也就是一個必需參數

 

命名(關鍵字)參數

這個參數也相對簡單,就是在調用函數傳參的時候,傳入一個有着“參數名”的參數,而且這個參數名必須和函數內部所使用的名字相同,不然就會報錯:

這樣就報錯了,因爲關鍵字使用錯誤......

 

默認參數

默認參數,顧名思義,就是一個被預先默認好了的參數,在函數定義時候已經被預先設定好了一個默認值:

這樣子及時在調用的時候沒有對其進行定義,也不會一想到函數的調用,就會直接使用默認值進行傳參;例子裏面在調用的時候就沒有對其進行傳參;當然,如果有了默認參數,還要繼續傳參的話,便會按照我們所傳遞的參數值進行傳遞

優先級: 手動參數 > 默認參數

 

可變參數(萬能參數)

可變參數分爲兩種:

  • *型參數,傳遞值數據類型爲元組
  • **型參數,傳遞值得數據類型爲字典

先來看 * 型參數:

這就是 * 型參數,在函數開始的時候定義時候需要在參數名前面加一個 * 號,代表元組型可變參數;

在上面這個例子裏面,我們前三個必需參數使用完之後,三個以後的所有參數都回進入到元組型可變參數中,通過元組的形式進行存儲,傳遞;我們在函數體內部進行引用的時候,直接使用它的命名名字就可以進行引用;

且這個可變參數一旦傳參成功,在函數內便不可修改,具體用法與元組一樣

再來看**型參數:

使用方法同*元組型可變參數類似,但是他在第三個以後的所有參數都回進入到字典型可變參數中,通過字典的形式進行存儲,傳遞;所以我們在調用函數時,傳遞的參數必須是要以鍵值一一對應的形式進行傳參,不然就會報錯;

注意:**型參數調用傳遞的時候  鍵  字符串不能加“”不然也會報錯

 

匿名函數

在Python中,我們使用 lambda 關鍵字來創建匿名函數,而不是使用我們所熟知的def;其所謂是匿名函數,是因爲它經濟只是一個表達式,比正常意義上的def函數簡潔很多;而她的主題僅僅是一個表達式,並不是代碼塊,所能實現的功能和用途也非常侷限;lambda函數擁有屬於自己的命名空間,且不能訪問自己之外的空間裏的全局空間內的參數;

匿名函數的使用方法:

變量名稱 = lambda 函數體 : 返回值

這就是一個最基礎的匿名函數,他沒有名字,函數體直接賦值給變量sum,sum直接指向了存儲函數體的內存地址,我們直接打印sum瞅瞅:

這就是匿名函數他的底層運行原理

 

Python中的全局函數

這裏我就是簡單演示一下Python中全局函數有哪一些:

首先導入模塊:import builtins

查看有哪些全局函數:dir(builtins)

啊好像有點小多,我打算在下一個博客中簡要分析一下全局函數在Python中的應用

 

 

 

肆   Python函數返回值簡析

前面簡要的提到了一下Python函數中return語句的基礎使用,這裏就結合着“遞歸函數”來詳細說一下;

函數返回值,就是通過函數體對傳入參數執行之後,在函數結束的時候,返回給調用者(有可能是一個變量,也有可能是另一個函數)的一個具體的數值,就是函數的返回值:

可以看到,函數體進行了一個傳入參數的乘法運算,然後把結果在函數體內直接賦值,return返回最後的乘積,就是返回給調用者的數值;

我們再來看這個例子,很顯然的表面了一個邏輯:調用者最後拿到的數值與函數體無關,只是與函數最後的返回值有關;

且Python函數運行返回多個值,最後一元組形式存儲傳遞,輸出;

 

遞歸函數在返回值中的應用

我們需要設計一個可以計算累乘的程序,於是我們如下設計:

我們在返回值中直接調用了自身函數,就形成了一個所謂 “ 遞歸 ” 的函數應用,簡潔的說就是“套娃”,將函數環環相嵌,在滅亡中走向永生,也許這就是編程哲學的最高境界吧

 

 

 

伍   函數間參數的傳遞,以及函數的傳遞

首先我們來看這個例子;

很明顯,x的值就是230,這是不可磨滅的事實,但是,假如我們這樣子給x賦值呢:

我們去掉了他的參數和後面的括號,直接賦值爲函數的名字odd?

這個時候,我們相當於做了一件有點牛逼的事情:函數的傳遞(不是對象不能叫繼承)

相當於把odd這個函數的所有內容直接賦值給了x這個變量,這裏的x就相當於一個指針堆大概就是這樣,類似於Linux裏面的軟鏈接

隨意我們在這兒可以吧變量x當成一個新的函數來使用(x的代碼塊將會與odd函數的代碼虧啊一同變化):

結果也是230

神奇的Python

 

 

 

陸   函數中引用全局變量的問題

什麼是全局變量?

上面左圖的i很明顯想用的就是全局(外部)變量 i = 99,而右邊的調用就是局部(內部)變量 i = 9

全局變量就是在整個程序中任何地方都能使用的變量,但是在函數體中,默認優先使用的是局部變量

要是我們想在函數中使用全局變量,並且修改全局變量的話,我們需要使用到以下關鍵字:global

首先在global後面加上全局變量的名稱(必須先聲明,不然會報錯),然後才能在下面進行賦值等操作

我們這裏能夠看到,修改之後,即使在函數外面,變量 i 的值也變爲了函數內進行修改後的 1 值

 

 

 

 

拒絕終點思維,不斷成長學習愛是永恆的主題

 

= =

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章