9 函式詳解 python基礎知識

2021-10-02 06:18:12 字數 4053 閱讀 3964

引數匿名函式lambda函式將在後續文章中講解,事實上,如果把它看做乙個表示式也是可以理解的。

定義,呼叫

函式通過def定義,執行時會建立函式物件,並將其賦值給函式名,通過return返回值,如果執行控制流執行到函式體末尾沒有發現可執行return的時候,則會返回none

作用域訪問:lgbe原則

來看乙個例子:

x =

99def

func1

(y):

z = x+y

return z

print

(func1(1)

)>>

>

100x =

99def

func2()

: x =

100func2(

)print

(x)>>

>

99

前面說過,由於函式內的引數在函式結束時會被**,再func1中,z是在函式中定義的,y是傳入的引數,x先訪問區域性作用域沒找到,在訪問到全域性作用域,找到了x=99,然後計算返回了z

而在func2中,函式內的x=100不是對全域性變數x進行了賦值更改,而是重新定義了區域性作用域的變數x,所以在全域性作用域輸出x還是等於100,要實現賦值變更,需要用到下面講到的global函式

global,nonlocal

global將變數宣告為全域性變數,在整個模組檔案中都可以使用,global需要在函式內部宣告,在外部宣告則無效

#在區域性作用域func1中呼叫全域性變數x

x =99

deffun1()

:global x

x =100fun1(

)print

(x)>>

>

100

nonlocal將變數宣告為父級函式的區域性變數

x =

99def

fun1()

:global x#宣告x是全域性變數的x

x =100#實現了對x的賦值修改

y =100#宣告fun1的區域性變數y

deffun2()

:nonlocal y#宣告y是父級fun1的區域性變數

y =99#實現對y的修改

print

('func2,y:'

,y) fun2(

)fun1(

)print

('main,x:'

,x)>>

> func2,y:

99 main,x:

100

如果父級沒有定義該變數,則會報錯,即使父級引入全域性變數也不行:

x =

99y =

100def

fun1()

:global x ,y

x =100# y = 100 #父級未定義y

deffun2()

:nonlocal y #報錯,y未定義

y =99print

('func2,y:'

,y) fun2(

)fun1(

)print

('main,x:'

,x)>>

> file "e:/python_project/django/qshop/qshop/__init__.py"

, line 7

nonlocal y

^syntaxerror: no binding for

nonlocal

'y' found

*迴圈變數與預設引數

預設引數x=x,這樣既完成了從父級迴圈匯入變數,又不會像global一樣改變原有變數值:

def

fun1()

: x=

10def

fun2

(x=x)

: x=

20print

('fun2'

,x) fun2(

)print

('fun1'

,x)fun1(

)

再來看乙個例子,如果需要使用迴圈來定義一些巢狀函式,需要使用預設引數來儲存狀態:

lambda也是定義了函式,函式makeaction可以用來計算次方

def

makeactions()

: acts =

for i in

range(5

):lambda x:i**x)

return acts

acts = makeactions(

)print

(acts[0]

)>>

>

<

locals

>

.<

lambda

> at 0x000001e56f172af8

>

但是上面的函式,傳入底數2

acts[0]

(2)>>

>

16acts[1]

(2)>>

>

16acts[2]

(2)>>

>

16acts[3]

(2)>>

>

16acts[4]

(2)>>

>

16

所有的都是2的四次方,說明引數i都是4,這時就需要i保持預設值:

def

makeactions()

: acts =

for i in

range(5

):lambda x,i=i:i**x)

return acts

acts = makeactions(

)acts[0]

(2)>>

>

0acts[1]

(2)>>

>

1acts[2]

(2)>>

>

4acts[3]

(2)>>

>

9acts[4]

(2)>>

>

16

引數

如何傳遞

引數實際上傳遞的引用,將物件位址指向函式執行時新建的變數上

可變物件此時對其操作會改變物件,所有引用物件的變數會改變值

l =[1

,2,3

]def

change

(object):

object

=object4)

change(l)

print

(l)>>

>[1

,2,3,4]

不可變物件的操作其實是新建物件來指向,所以不會改變原物件的值

如果仔細閱讀過前面的可變物件與不可變物件的原理,這裡是很容易理解的。

s =

'abc'

defchange

(object):

object

=object

+'de'

change(s)

print

(s)>>

> abc

引數型別

再次需要我們注意的是,不管是函式定義還是引數解包賦值的時候,一定要注意引數的順序,常用引數放前面,關鍵字引數放後面,不然會匹配不到常用引數報錯。

python基礎知識 函式

函式其實就是一段可以多次呼叫的 1 函式的定義 格式 def 函式名 引數1 預設值1 引數2 預設值2 return 表示式 函式名的命名規則 函式名可以是字母 數字或下劃線組成的字串,但是不能以數字開頭。例如加法操作 def addfunc x,y return x y print addfun...

python函式基礎知識

1,函式返回值有多個 def func ip 127.0.0.1 port 3389 return ip,port ip,port func 即可得到ip和port的值 2,函式legb 引數尋找順序 l local 本地作用域 e enclosing function 上一層結構中def或lamb...

python函式基礎知識

函式的定義的格式 def 函式名 引數 可選 功能 的實現 定義函式不會呼叫 defshow print 我叫張三丰,年齡18 呼叫函式 函式名 引數 定義帶有引數的函式 name,age 形式引數 函式定義帶有的引數叫形式引數 形參 defshow msg name,age print name,...