python講稿3 函式定義和函式引數

2021-10-03 18:01:20 字數 4669 閱讀 8984

在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 二 函式自己呼叫自己,遞迴...