引數匿名函式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,...