python學習筆記——函式 1
呼叫函式
python內建了很多有用的函式,我們可以直接呼叫。
要呼叫一個函式,需要知道函式的名稱和引數,可從python官方網站文件 檢視python的內建函式(Built-in Function).
例如 求絕對值的函式abs
,只有一個引數,可從文件檢視,也可在互動式命令列通過help(abs)
看abs
函式的幫助資訊
help(abs)
Help on built-in function abs in module builtins:
abs(x, /)
Return the absolute value of the argument.
呼叫abs
函式:
abs(-2.718218 )
2.718218
python內建的常用函式還包括資料型別轉換函式,比如int()
漢畫素可以把其他資料型別轉換為整數:
print(int('123'))
print(int(12.34))
123
12
float('12.34')
12.34
str(1.23)
'1.23'
函式名其實就是指向一個函式物件的引用,完全可以把函式名賦給一個變數,相當於給這個函式起了一個“別名”:
a = abs #變數a指向abs函式
a(-1)
1
函式定義
定義函式使用def
語句,一次寫出 函式名、括號、括號中的引數和冒號:
; 然後在縮排快中編寫函式體,函式的返回值用return
自定義一個求絕對值的函式my_abs
:
# -*- coding: utf-8 -*-
def my_abs(x):
if x>=0:
return x
else:
return -x
print(my_abs(-2.71828))
2.71828
函式體內部的語句在執行時,一旦執行到return
時,函式就執行完畢,並將結果返回
空函式
如果想定義一個什麼事也不做的空函式,可以用pass
語句,pass
可以用來作為佔位符。
def nop():
pass
pass
還可用於其他語句,例如:
age = input('please input your age:' )
age = int(age)
if age >= 18:
pass
please input your age:18
此處若缺少了pass
,程式碼執行將有語法錯誤
引數檢查
呼叫函式時,如果引數個數不對,python直譯器會自動檢查出來,並丟擲TypeError
;
但如果引數型別不對,python直譯器就無法檢查。
傳入不恰當引數時,內建函式abs
會檢查出引數錯誤,而我們定義的my_abs
無引數檢查,會導致if
語句出錯,出錯資訊和abs
不一樣。所以這個函式定義不夠完善。
修改my_abs
的定義,對引數型別做檢查,只允許整數和浮點型引數。資料型別檢查可以用內建函式isinstance()
實現:
abs('A')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-22-6eee3e7a739d> in <module>()
----> 1 abs('A')
TypeError: bad operand type for abs(): 'str'
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')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-21-3a4b4137ec2c> in <module>()
----> 1 my_abs('A')
<ipython-input-20-c24a51d84b1e> in my_abs(x)
1 def my_abs(x):
2 if not isinstance(x, (int, float)):
----> 3 raise TypeError('bad operand type')
4 if x >= 0:
5 return x
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
x, y = move(100, 100, 60, math.pi / 3)
print(x, y)
130.0 48.03847577293369
其實這是一種假象,python函式返回的仍然是單一值:
r = move(100, 100, 60, math.pi / 3)
print(r)
(130.0, 48.03847577293369)
實時上,返回值是一個tuple,但在語法上,返回一個tuple可以省略,而多個變數可以同時接收一個tuple,按位置賦給對應的值;
所以,python的函式返回多值,其實就是返回一個tuple.
小結
- 定義函式時,需要確定函式名和引數個數;
- 如果有必要,可以先對引數的資料型別做檢查;
- 函式體內部可以用
return
隨時返回函式結果; - 函式執行完也沒有
return
語句時,自動return None
; - 函式可以同時返回多個值,但其實就是一個tuple.