在python中,定義乙個函式要使用def語句,python強制要求格式
1 定義
我們以自定義乙個求絕對值的my_abs函式為例:
def my_abs(x):
if x >= 0:
return x
else:
return -x
呼叫my_abs(x)如下:
print(my_abs(-9))
1.1 空函式
def nop():
pass
pass還可以用在其他語句裡,比如:
if age >= 18:
pass
缺少了pass,**執行就會有語法錯誤。
1.2 返回多個值
函式可以返回多個值,比如在遊戲中經常需要從乙個點移動到另乙個點,給出座標、位移和角度,就可以計算出新的新的座標:
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 / 6)
>>> print(x, y)
151.96152422706632 70.0
2 函式的引數
先看乙個例子:power(x,n)求x的n次方
def power(x, n):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
>>> power(5, 2)
25>>> power(5, 3)
125
2.1 必選引數,預設引數
def power(x, n=2):#x是必選引數,n是預設引數
s = 1
while n > 0:
n = n - 1
s = s * x
return s
這樣,當我們呼叫power(5)時,相當於呼叫power(5, 2).
注:必選引數在前,預設引數在後
使用預設引數有什麼好處?最大的好處是能降低呼叫函式的難度。
舉個例子,我們寫個一年級小學生註冊的函式,需要傳入name和gender兩個引數:
def enroll(name, gender):
print('name:', name)
print('gender:', gender)
這樣,呼叫enroll()函式只需要傳入兩個引數:
>>> enroll('sarah', 'f')
name: sarah
gender: f
如果要繼續傳入年齡、城市等資訊怎麼辦?我們可以把年齡和城市設為預設引數:
def enroll(name, gender, age=6, city='beijing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
比如:
enroll('bob', 'm', 7)
enroll('adam', 'm', city='tianjin')
2.2 可變引數
我們以數學題為例子,給定一組數字a,b,c……,請計算a2 + b2 + c2 + ……。
要定義出這個函式,我們必須確定輸入的引數。由於引數個數不確定,我們首先想到可以把a,b,c……作為乙個list或tuple傳進來,這樣,函式可以定義如下:
def calc(numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc([1, 2, 3])
14>>> calc((1, 3, 5, 7))
84
來看可變引數的寫法:
def calc(*numbers): # 這裡後面會講numerbers是乙個可迭代物件
sum = 0
for n in numbers:
sum = sum + n * n
return sum
定義可變引數時,僅僅在引數前面加了乙個*號。在函式內部,引數numbers接收到的是乙個tuple.但是,呼叫該函式時,可以傳入任意個引數,包括0個引數:
>>> calc(1, 2)
5>>> calc()
0
如果已經有乙個list或者tuple,要呼叫乙個可變引數怎麼辦?可以這樣做:
>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
這種寫法當然是可行的,問題是太繁瑣,我們在list或tuple前面加乙個*號,
>>> nums = [1, 2, 3]
>>> calc(*nums) # 這裡*nums相當於將列表nums打散
14
2.3 關鍵字引數
可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為乙個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為乙個dict。
def person(**kw): # kw是keyword的縮寫
for k,v in kw.items():
print(k,'=',v)
>>> person(name='job')
name = job
>>> person(name='job',age=30)
name = job
age = 30
>>> person(name='job',age=30,city='beijing')
name = job
age = 30
city = beijing
可見,**kw引數可以接受0到多個字典引數(key1=value1,key2=value2,…).
這樣,直接這樣寫不可以:
>>> person(
>>>person(**canshu1)
2.4 預設引數,可變引數,關鍵字引數的綜合應用
例1
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('michael', 30)
name: michael age: 30 other: {}
>>> person('bob', 35, city='beijing')
name: bob age: 35 other:
>>> person('adam', 45, gender='m', job='engineer')
name: adam age: 45 other:
例2
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
>>>f1(1,2)
a=1 b=2 c=0 args=() kw={}
>>>f1(1,2,3)
a=1 b=2 c=3 args=() kw={}
>>>f1(1,2,3,'a','b')
a=1 b=2 c=3 args=('a','b') kw={}
>>>f1(1,2,3,'a','b',x=99)
a=1 b=2 c=3 args=('a','b'),kw=
當然,通過乙個元組(tuple)或字典(dict),可以呼叫f1.
>>>args=(1,2,3,4)
>>>kw=
>>>f1(*args,**kw)
a=1 b=2 c=3 args=(4,) kw=
>>>f1(7,8,*args,**kw)
a=7 b=8 c=1 args=(2,3,4) kw=
作業:
1 請定義乙個函式quadratic(a, b, c),接收3個引數,返回一元二次方程:
$ax^2+bx+c=0$
的兩個解。
2 以下函式允許計算兩個數的乘積,請稍加改造,變成可接收乙個或多個數並計算乘積:
def product(x, y):
return x * y
python中的函式 函式定義 函式引數和函式呼叫
我們在程式設計過程中經常會遇到同樣功能的 不斷地出現,使得程式設計成為枯燥無味的複製貼上過程的迴圈。為了找樂子 讓 變得精簡。我們需要函式來幫助我們。函式就是完成特定功能的 塊,本質上是對 的封裝。函式的語法格式為 def 函式名 引數 段 函式體需要注意的是,函式名的命名規則與變數的命名規則一致。...
python3 map函式和filter函式詳解
map 函式可以對乙個資料進行同等迭代操作。例如 def f x return x x r map f,1,2,3,4,5,6,7,8,9 print list r map函式傳入的第乙個引數就是函式本身,即f。第二個引數是要操作的資料 map 作為高階函式,事實上它把運算規則抽象了,因此,我們不但...
python函式和模組 python內建函式與模組
一 函式中如果return是多個引數,只用乙個引數接收時,是元組 也可以用多個引數接收,那就是解包 def func a 1 b 2 c 3 return a,b,c q,w,e func print func type func q,w,e 輸出 1,2,3 1 2 3 二 函式自己呼叫自己,遞迴...