砸們說說函數這檔子事

函數式最基本的代碼抽象方式
一.調用函數
知道一個函數的作用的方法有
1.http://docs.python.org/3/library/functions.html#abs
在該網址上查詢
2.調用help(函數名)的方法
3.可以函數調用返回一個變量。
二.定義函數
1.在Python中,定義一個函數要使用def語句,依次寫出函數名、括號、括號中的參數和冒號:,然後,在縮進塊中編寫函數體,函數的返回值用return語句返回。

def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

這裏已經習慣C的筒子要注意Python的寫法。
2.在Python交互環境中定義函數時,注意Python會出現…的提示。函數定義結束後需要按兩次回車重新回到>>>提示符下。
3.如果你已經把my_abs()的函數定義保存爲abstest.py文件了,那麼,可以在該文件的當前目錄下啓動Python解釋器,用from abstest import my_abs來導入my_abs()函數,注意abstest是文件名(不含.py擴展名)。
4.空函數:

def  nop()
     pass

pass可以用來作爲佔位符,比如現在還沒想好怎麼寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。
5.參數檢查
內置函數isinstance()實現

def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x >= 0:
        return x
    else:
        return -x

6.返回多個值
其實只是return一個tuple
小結
定義函數時,需要確定函數名和參數個數;
如果有必要,可以先對參數的數據類型做檢查;
函數體內部可以用return隨時返回函數結果;
函數執行完畢也沒有return語句時,自動return None。
函數可以同時返回多個值,但其實就是一個tuple。
三.函數的參數
Python的函數定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數外,還可以使用默認參數、可變參數和關鍵字參數,使得函數定義出來的接口,不但能處理複雜的參數,還可以簡化調用者的代碼。
默認參數:
默認參數可以簡化函數的調用。設置默認參數時,有幾點要注意:
一是必選參數在前,默認參數在後,否則Python的解釋器會報錯;二是如何設置默認參數。
當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作爲默認參數。使用默認參數最大的好處是能降低調用函數的難度。
關鍵字參數:
關鍵字參數的主要用於一些非必填的函數參數,比如,在person函數裏,我們保證能接收到name和age這兩個參數,但是,如果調用者願意提供更多的參數,我們也能收到。試想你正在做一個用戶註冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關鍵字參數來定義這個函數就能滿足註冊的需求。

def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

命名關鍵字參數
如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,只接收city和job作爲關鍵字參數。這種方式定義的函數如下:

def person(name, age, *, city, job):
    print(name, age, city, job
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

需要注意的是命名參數必須傳入和定義的參數個數一樣多的參數。
參數組合
參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
四.遞歸函數
使用遞歸函數需要注意防止棧溢出。在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出。報錯提示爲:

>>> fact(1000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in fact
  ...
  File "<stdin>", line 4, in fact
RuntimeError: maximum recursion depth exceeded in comparison

解決遞歸調用棧溢出的方法是通過尾遞歸優化,事實上尾遞歸和循環的效果是一樣的,所以,把循環看成是一種特殊的尾遞歸函數也是可以的。

發佈了25 篇原創文章 · 獲贊 10 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章