python之定義函數

來源:互聯網
上載者:User

標籤:自動   修改   port   縮排   trace   pos   pes   資料   資料類型   

在Python中,定義一個函數要使用def語句,依次寫出函數名、括弧、括弧中的參數和冒號:,然後,在縮排塊中編寫函數體,函數的傳回值用return語句返回。

我們以自訂一個求絕對值的my_abs函數為例:

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

請自行測試並調用my_abs看看返回結果是否正確。

請注意,函數體內部的語句在執行時,一旦執行到return時,函數就執行完畢,並將結果返回。因此,函數內部通過條件判斷和迴圈可以實現非常複雜的邏輯。

如果沒有return語句,函數執行完畢後也會返回結果,只是結果為None

return None可以簡寫為return

在Python互動環境中定義函數時,注意Python會出現...的提示。函數定義結束後需要按兩次斷行符號重新回到>>>提示符下:

 

 

 

如果你已經把my_abs()的函數定義儲存為abstest.py檔案了,那麼,可以在該檔案的目前的目錄下啟動Python解譯器,用from abstest import my_abs來匯入my_abs()函數,注意abstest是檔案名稱(不含.py副檔名):

 

 

空函數

如果想定義一個什麼事也不做的空函數,可以用pass語句:

def nop():    pass

pass語句什麼都不做,那有什麼用?實際上pass可以用來作為預留位置,比如現在還沒想好怎麼寫函數的代碼,就可以先放一個pass,讓代碼能運行起來。

pass還可以用在其他語句裡,比如:

if age >= 18:    pass

缺少了pass,代碼運行就會有語法錯誤。

參數檢查

調用函數時,如果參數個數不對,Python解譯器會自動檢查出來,並拋出TypeError

>>> my_abs(1, 2)Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: my_abs() takes 1 positional argument but 2 were given

但是如果參數類型不對,Python解譯器就無法幫我們檢查。試試my_abs和內建函數abs的差別:

>>> my_abs(‘A‘)Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 2, in my_absTypeError: unorderable types: str() >= int()>>> abs(‘A‘)Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: bad operand type for abs(): ‘str‘

當傳入了不恰當的參數時,內建函數abs會檢查出參數錯誤,而我們定義的my_abs沒有參數檢查,會導致if語句出錯,出錯資訊和abs不一樣。所以,這個函數定義不夠完善。

讓我們修改一下my_abs的定義,對參數類型做檢查,只允許整數和浮點數類型的參數。資料類型檢查可以用內建函數isinstance()實現:

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

添加了參數檢查後,如果傳入錯誤的參數類型,函數就可以拋出一個錯誤:

>>> my_abs(‘A‘)Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "<stdin>", line 3, in my_absTypeError: bad operand type

錯誤和異常處理將在後續講到。

返回多個值

函數可以返回多個值嗎?答案是肯定的。

比如在遊戲中經常需要從一個點移動到另一個點,給出座標、位移和角度,就可以計算出新的新的座標:

import mathdef move(x, y, step, angle=0):    nx = x + step * math.cos(angle)    ny = y - step * math.sin(angle)    return nx, ny

import math語句表示匯入math包,並允許後續代碼引用math包裡的sincos等函數。

然後,我們就可以同時獲得傳回值:

>>> x, y = move(100, 100, 60, math.pi / 6)>>> print(x, y)151.96152422706632 70.0

但其實這隻是一種假象,Python函數返回的仍然是單一值:

>>> r = move(100, 100, 60, math.pi / 6)>>> print(r)(151.96152422706632, 70.0)

原來傳回值是一個tuple!但是,在文法上,返回一個tuple可以省略括弧,而多個變數可以同時接收一個tuple,按位置賦給對應的值,所以,Python的函數返回多值其實就是返回一個tuple,但寫起來更方便。

小結

定義函數時,需要確定函數名和參數個數;

如果有必要,可以先對參數的資料類型做檢查;

函數體內部可以用return隨時返回函數結果;

函數執行完畢也沒有return語句時,自動return None

函數可以同時返回多個值,但其實就是一個tuple。

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.