Python 中的函數

來源:互聯網
上載者:User

學了 Python 中的資料類型,語句,接下來就來說一下 Python 中的函數,函數是結構化編程的核心。我們使用函數可以增加程式的可讀性。自訂函數時使用關鍵字def 函數由多條語句組成。在定義函數的時候我們可以使用如下的方式給函數定義一個解釋文檔。

def square(x):    'This is comment of this method !'    return x * x# 擷取方法注釋資訊square.__doc__

 

上面定義的函數我們就可以通過函數名.__doc__的方式擷取方法的文檔字串。

另外,所有的函數都有傳回值,如果你沒有顯示的告訴它返回什麼,則返回None

一個函數怎麼能少得了參數的部分呢,一不留神可能就會搞錯,這裡大概說一下,若傳遞的參數為不可變的參數,則不會修改參數的值,像是 數字,字串,元組,但若是引用值的話,就可能會將原來的值改變。比方說 列表,字典。可以採用切片的方式避免對傳入列表的修改,如:change(names[:]) 這樣的話我們傳入的是names列表的一個複製版本,而對 names 本身沒有影響。

關鍵字參數和預設值,舉例說明

def hello(greeting = 'Hello',name = 'world'):    print('{},{}!'.format(greeting,name))hello()Hello,world!hello(name = 'YJK923')Hello,YJK923!

 

可變參數:允許使用者提供任意數量的參數。使用 * 號將提供的所有參數收集到一個元組中。這種用法在賦值的時候也遇到過。舉例

def print_params(*param):    print(param)print_param('Testing')Testingprint_param(1,2,3)(1,2,3)

 

星號的參數最好放在最後,不然在調用方法的時候需要指出星號參數後面的參數的值是多少。 
還有一種使用兩個星號,是用於收集帶有關鍵字參數的方法,得到的值是一個字典而不是一個元組。

def print_dict(**params):    print(params)print_dict(x = 1,y = 2,z = 3){'z':'3','x':'1','y':'2'}

 

上面兩個都是在定義函數的時候使用了 * ,那我們在調用的函數的時候也可以使用星號,這也就是分配參數,像這樣

def add(x,y):    return x + yparam = (1,2) # 定義一個元組,用做參數add(*param) # 使用 * 來分配參數3 # 結果為 3 ,這就是分配參數之後的結果

 

Python 中的範圍的概念類似於 Java,所以理解起來沒有問題,但是 Python 好像都不是老老實實的,我們知道在方法裡的變數是局部變數,我們在方法裡使用時,全域變數不受影響,但是 Python 社區的小夥伴就是想改變全域變數的值,該怎麼操作呢?發明了一個關鍵字global用於指定某個方法裡的值為全域變數。

x = 1def change(x):    global x # 此時的x就是指向全域變數x    x = x + 1change(x)此時 x = 2

 

遞迴 : 函數之間的相互調用是很正常的,存在這麼一種情況,那就是自己調用自己,這就是遞迴調用。 
舉例說明

# 計算數字n的階乘 n ! = n * (n-1) * (n -2) * ... * 1# 分析:1 的階乘為 1,大於 1 的數 n 的階乘等於 n-1 的階乘 * ndef factorial(n):    if n == 1 :        return 1    else :        return n * factorial(n-1)

 

遞迴函式通常包含兩部分內容,一是基準條件,滿足條件函數將直接放回一個值,像上面的n = 1 return 1 二是包含一個或多個調用,這些調用旨在解決問題的一部門。這裡的關鍵是,通過將問題分解為較小的部門,可避免遞迴沒完沒了,因為問題終將被分解成基準條件可以解決的最小問題。(抽象啊,多看看,體會體會吧!)

# 計算某一個數的冪# 分析:power(x,n) 表示計算 x 的 n 次冪。也就是將數 x 自乘 n-1 次。# 對於任意數來說,n 為 0 的時候結果都為 1,n > 0 的時候,power(x,n) = x * power(x,n-1) ,是不是感覺可以用遞迴做點什麼!def power(x,n):    if n == 0 :        return 1    else :        return x * power(x,n-1)

 

好吧,上面兩個遞迴運算還沒有理解遞迴的概念,沒關係,還有一個!

# 使用python遞迴實現二分法尋找# 介紹:在有序的列表中,所要尋找資料和中間資料比較。依次拆分,比較中間的數。def search(list,number,lower,upper):    '使用二分法尋找指定資料的索引,list 是排好序的列表,number 是尋找的資料 lower,upper 指定尋找的起始位置'    if lower == upper:        assert number == list[upper]        return upper    else :        middle = (lower + upper) // 2  #  // 表示不留小數除        if number > list[middle] :            return search(list,number,middle+1,upper)        else :            return search(list,number,lower,middle)

 

說了以上這麼多,對函數式編程的理解也是馬馬虎虎,用函數來編寫程式 ?可能看到了 Python 中提供的這幾個函數,能對函數式編程加深一下感覺。map filter reduce 給幾個例子看一下

list(map(str,range(5))) # 與[srt(i) for i in range(5)] 等價['0','1','2','3','4']# 可以使用 filter根據布爾函數的傳回值對元素進行過濾# 首先你得有一個可以返回布爾值的函數def func(x):    return x.isalnum() # isalnum 方法檢測字串是否由字母或數字組成seq = ['foo','x41','***','?!']list(filter(func,seq))['foo','x41']# 同樣的實現可以這麼來[x for x in seq if x.isalnum()]# 還有一種叫 lambda 運算式的玩意,是這樣寫的filter(lambda x : x.isalnum(),seq)# lambda 運算式是一個匿名的函數,簡單的理解,冒號前面是參數,冒號後面是方法體(傳回值)lambda x , y : x + y # 這就是表示有兩個參數傳回值是參數和的匿名函數唄!# 使用指定的函數將序列的前兩個元素和二為一,再將結構與第三個元素和二為一,最終處理完序列得到一個結果。numbers = [72,42,7,9,23,67,97,245]from functools import reducereduce(lambda x,y:x+y,numbers)# 當然,就這個案例來說,倒不如使用內建函數 sum 求和。

 

好吧,以上就是 Python 中函數相關的問題,至此,我們已經學習了 Python 的資料類型以及資料類型的常用操作,後便是語句,語句中牽扯到一些迴圈和條件判斷語句的使用,而函數可以看成是對語句的簡單抽象與封裝,而真正的物件導向的思想還在下一節類的相關概念中。

 

推薦閱讀:

Python 學習經曆分享

Python 入門之基礎資料型別 (Elementary Data Type)

Python 中的語句

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.