Python(調用函數、定義函數)


函數的返回值:
    return 值:只能返回一次,只要執行return函數就終止
    返回值:沒有類型限制,也沒有個數限制
        沒有return:None
        返回一個值
        返回多個值:元組

 

 

 

 

 

 

先定義,后使用,定義階段只判斷語法,不執行代碼。上面定義階段 if 1>2 print……有語法錯誤,所以報錯,下面,調用了不存在的變量,不算語法錯誤

 

 

一、調用函數

Python內置了很多有用的函數,我們可以直接調用。

要調用一個函數,需要知道函數的名稱和參數,比如求絕對值的函數abs,只有一個參數。可以直接從Python的官方網站查看文檔:

http://docs.python.org/3/library/functions.html#abs

也可以在交互式命令行通過help(abs)查看abs函數的幫助信息。

調用abs函數:

>>> abs(100) 100 >>> abs(-20) 20 >>> abs(12.34) 12.34 

調用函數的時候,如果傳入的參數數量不對,會報TypeError的錯誤,並且Python會明確地告訴你:abs()有且僅有1個參數,但給出了兩個:

>>> abs(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module> TypeError: abs() takes exactly one argument (2 given) 

如果傳入的參數數量是對的,但參數類型不能被函數所接受,也會報TypeError的錯誤,並且給出錯誤信息:str是錯誤的參數類型:

>>> abs('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module> TypeError: bad operand type for abs(): 'str' 

max函數max()可以接收任意多個參數,並返回最大的那個:

>>> max(1, 2) 2 >>> max(2, 3, 1, -5) 3 

數據類型轉換

Python內置的常用函數還包括數據類型轉換函數,比如int()函數可以把其他數據類型轉換為整數:

>>> int('123') 123 >>> int(12.34) 12 >>> float('12.34') 12.34 >>> str(1.23) '1.23' >>> str(100) '100' >>> bool(1) True >>> bool('') False 

函數名其實就是指向一個函數對象的引用,完全可以把函數名賦給一個變量,相當於給這個函數起了一個“別名”:

>>> a = abs # 變量a指向abs函數 >>> a(-1) # 所以也可以通過a調用abs函數 1 

 

二、定義函數

在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_abs TypeError: 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_abs TypeError: bad operand type 

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

返回多個值

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

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

import math def 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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM