Python 函式定義以及引數傳遞

2021-07-27 08:09:19 字數 2237 閱讀 5381

#形如

deffunc

(args...):

dosomething

以關鍵字def 開頭,後面是函式名和引數下面是函式處理過程。

舉例:

def

add( a, b ):

return a+b

引數可以設定預設值,如:

def

add( a, b=10 ):

#注意:預設值引數只會運算一次

return a+b

預設值引數只會運算一次是什麼意思?

def

func

( a, b= ):

#b的預設值指向乙個空的列表,每次不帶預設值都會指向這塊記憶體

return b

print(func(1))#向預設的空列表裡加入元素1 ,預設列表裡已經是[1]

print(func(2))#向預設的列表裡加入元素2,預設列表裡已經是[1,2]

print(func(3,))#向b指向的空列表裡加入元素1 ,預設列表裡還是[1,2]

print(func(4))#向預設的列表裡加入元素4,預設列表裡已經是[1,2,4]

'''結果:

[1][1, 2]

[3][1, 2, 4]

'''

這下明白為什麼預設引數只計算一次了吧,函式引數不傳遞時預設值總是指向固定的記憶體空間,就是第一次計算的空間。

def

func

(a, b):

print('a=%d, b=%d' % (a,b) )

在使用函式時可以如下方式,結果都是相同的

func(10,20) #不使用引數名,需要按引數順序傳遞

func(a=10,b=20) #使用引數名可以不按順序傳遞

func(b=20,a=10)

#結果:

a=10, b=20

a=10, b=20

a=10, b=20

如果函式定義形式如下方式:

def

func

(*args):

#這種定義會把傳遞的引數包成元組

print(args,type(args))

func(10,20)

#結果:

#(10, 20)

舉乙個和上述過程相反的例子:

def

func

(a,b):

print('a=%d, b=%d' % (a,b) )

a = (10, 20)

func(*a) #在呼叫函式使用`*`則會把元組解包成單個變數按順序傳入函式

#結果:a=10, b=20

總結:*號在定義函式引數時,傳入函式的引數會轉換成元組,如果*號在呼叫時則會把元組解包成單個元素。

另一種定義:

def

func

(**kw):

#使用**定義引數會把傳入引數包裝成字典dict

print(kw, type(kw) )

func(a=10,b=20)#這種函式在使用時必須指定引數值,使用key=value這種形式

#結果:

相反的例子:

def

func

(a,b):

print('a=%d, b=%d' % (a,b) )

d =

func(**d) #在呼叫時使用**會把字典解包成變數傳入函式。

def

func

(*args, **kw):

#這種形式的定義代表可以接受任意型別的引數

print(args,kw )

總結:**號在定義函式引數時,傳入函式的引數會轉換成字典,如果**號在呼叫時則會把字典解包成單個元素。lambda表示式就是一種簡單的函式

形如f = lambda 引數1,引數2: 返回的計算值

例如:

add = lambda x,y: x+y

print(add(1,2))

'''結果:3

'''

函式傳引數 python 函式引數

1.位置引數 最熟悉的一種引數形式,優點 簡單。缺點 傳遞引數不夠靈活 2.預設引數 優點 提高了 的復用性 缺點 容易產生二義性 注意事項 一是必選引數在前,預設引數在後。二是如何設定預設引數。當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。def p...

Python之函式(一)定義函式以及傳參

函式的定義 def 函式名 函式體 例子 def func def關鍵字 定義 func函式名 和變數定義規則一樣 必須要寫格式 宣告 語句結束 s 1,2,3 count 0 for i in s count 1 print count 呼叫函式 def my len s 1,2,23,3,4,5...

Forward,redirect,以及引數傳遞問題

forward 常用 流程 客戶端瀏覽器傳送http請求 web伺服器接收該請求並 請求 在方法內 到了另乙個請求 web伺服器實現請求的 處理並執行結果 可能是另乙個action,檢視等 web伺服器傳送結果到瀏覽器。實現 return forward hello.action response....