0.方法是綁定在對象的赃蛛,而函數(shù)則不是恃锉。
1.什么是函數(shù)?
在程序設(shè)計中焊虏,常常將一些常用的功能模塊編寫成函數(shù)淡喜。函數(shù)是帶有入口和出口的代碼片段,用于完成特定的功能诵闭。所謂的入口,就是函數(shù)所帶的各個參數(shù)澎嚣;所謂出口疏尿,就是函數(shù)的返回值。我們可以把函數(shù)比作一個帶入口和出口的盒子易桃,對于盒子的使用者褥琐,我們不關(guān)系盒子內(nèi)部是如何實現(xiàn)的,我們只關(guān)心這個盒子能做什么晤郑。
- 函數(shù)代碼塊以
def
關(guān)鍵字開頭敌呈,后接函數(shù)名和圓括號()
- 圓括號之間用于定義參數(shù)贸宏;函數(shù)調(diào)用時候也需要將傳入?yún)?shù)放置在圓括號中
- 函數(shù)的第一行語句可以選擇性的使用文檔字符串(
"""
)用于存放函數(shù)說明 - 函數(shù)內(nèi)容以(
:
)起始,并且注意縮進(jìn)磕洪。 -
return [表達(dá)式]
結(jié)束函數(shù)吭练,選擇性地返回一個值給調(diào)用方。不帶表達(dá)式的return
相當(dāng)于返回None
- 函數(shù)的返回值可以是多個析显,中間用逗號隔開鲫咽,但是其實實質(zhì)是返回了一個
tuple
注意:
在 python 中,類型屬于對象谷异,變量是沒有類型的:
a = 100
a = "string"
- python函數(shù)的參數(shù)傳遞:
可更改對象與不可更改對象
在 python 中分尸,strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象歹嘹。
- 不可變類型:變量賦值
a=5
后再賦值a=10
箩绍,這里實際是新生辰改了一個int值對象10,再讓a指向它,而5被丟棄尺上,不是改變了a的值伶选,而是新生成了一個a。 - 可變類型:變量賦值
la = [1, 2, 3, 4]
后再賦值la[2] = 5
尖昏,則是將list la 的第三個元素值更改仰税,本身la
沒有動。只是內(nèi)部的一部分值被修改了抽诉。
python函數(shù)的參數(shù)傳遞:
- 不可變類型:類似c++的值傳遞陨簇,如:整數(shù),字符串迹淌,元組河绽。如:
fun(a)
,傳遞的只是a
的值唉窃,沒有影響a
對象本身耙饰。比如在fun(a)
內(nèi)部修改a
的值,知識修改另外一個復(fù)制的對象纹份,不會影響到a
本身苟跪。 - 可變類型:類似于c++,的引用傳遞蔓涧,如:列表件已,字典。如:
func(la)
元暴,則是將la
真正的傳過去篷扩,修改后fun
外部的la
也會受影響。
python中一切都是對象茉盏,嚴(yán)格意義我們不能說值傳遞韓式引用傳遞鉴未,我們應(yīng)該說傳不可變對象和傳可變對象枢冤。
傳遞不可變對象 eg:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print b # 結(jié)果是 2
傳遞可變對象 eg:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 可寫函數(shù)說明
def changeme( mylist ):
"修改傳入的列表"
mylist.append([1,2,3,4]);
print "函數(shù)內(nèi)取值: ", mylist
return
# 調(diào)用changeme函數(shù)
mylist = [10,20,30];
changeme( mylist );
print "函數(shù)外取值: ", mylist
函數(shù)參數(shù):
1)必備參數(shù)
#可寫函數(shù)說明
def printme( str ):
"打印任何傳入的字符串"
print str;
return;
#調(diào)用printme函數(shù)
printme(); # 會報錯,沒有傳遞參數(shù)
2)關(guān)鍵字參數(shù):
鍵字參數(shù)和函數(shù)調(diào)用關(guān)系緊密铜秆,函數(shù)調(diào)用使用關(guān)鍵字參數(shù)來確定傳入的參數(shù)值淹真。
使用關(guān)鍵字參數(shù)允許函數(shù)調(diào)用時參數(shù)的順序與聲明時不一致,因為 Python 解釋器能夠用參數(shù)名匹配參數(shù)值羽峰。
#可寫函數(shù)說明
def printme( str ):
"打印任何傳入的字符串"
print str;
return;
#調(diào)用printme函數(shù)
printme( str = "My string");
3)缺省參數(shù)
#可寫函數(shù)說明
def printinfo( name, age = 35 ):
"打印任何傳入的字符串"
print "Name: ", name;
print "Age ", age;
return;
#調(diào)用printinfo函數(shù)
printinfo( name="miki" ); # 不會報錯
4)不定長參數(shù)
def functionname([formal_args,] *var_args_tuple ):
"函數(shù)_文檔字符串"
function_suite
return [expression]
eg:
# 可寫函數(shù)說明
def printinfo( arg1, *vartuple ):
"打印任何傳入的參數(shù)"
print "輸出: "
print arg1
for var in vartuple:
print var
return;
# 調(diào)用printinfo 函數(shù)
printinfo( 10 );
printinfo( 70, 60, 50 );
===
輸出:
10
輸出:
70
60
50
5)匿名函數(shù)
python使用lambda來創(chuàng)建匿名函數(shù)趟咆。
語法:
lambda [arg1 [,arg2,.....argn]]:expression
# 可寫函數(shù)說明
sum = lambda arg1, arg2: arg1 + arg2;
# 調(diào)用sum函數(shù)
print "相加后的值為 : ", sum( 10, 20 )
print "相加后的值為 : ", sum( 20, 20 )
eg:
sum = lambda a, b:a+b
print sum(10, 20)
return語句
return語句[表達(dá)式]退出函數(shù),選擇性地向調(diào)用方返回一個表達(dá)式梅屉。不帶參數(shù)值的return語句返回None.
形參和實參
def add_num(x, y): # 這里的x, y是形參
return x + y
add_num(2, 3) # 這里的2,3是實參
- 變量作用域
一個程序的所有的變量并不是在哪個位置都可以訪問的值纱。訪問權(quán)限決定于這個變量是在哪兒賦值的。
變量的作用域決定了在哪一部分程序你可以訪問哪個特定的變量名稱坯汤。兩種最基本的變量作用域如下:
定義在函數(shù)內(nèi)部的變量擁有一個局部作用域虐唠,定義在函數(shù)外的擁有全局作用域。
局部變量只能在其被聲明的函數(shù)內(nèi)部訪問惰聂,而全局變量可以在整個程序范圍內(nèi)訪問疆偿。調(diào)用函數(shù)時,所有在函數(shù)內(nèi)聲明的變量名稱都將被加入到作用域中搓幌。
全局變量
局部變量
total = 0; # 這是一個全局變量
# 可寫函數(shù)說明
def sum( arg1, arg2 ):
#返回2個參數(shù)的和."
total = arg1 + arg2; # total在這里是局部變量.
print "函數(shù)內(nèi)是局部變量 : ", total
return total;
#調(diào)用sum函數(shù)
sum( 10, 20 );
print "函數(shù)外是全局變量 : ", total
===
輸出結(jié)果:
函數(shù)內(nèi)是局部變量 : 30
函數(shù)外是全局變量 : 0
全局變量想作用于函數(shù)內(nèi)杆故,需加 global
:
globvar = 0
def set_globvar_to_one():
global globvar # 使用 global 聲明全局變量
globvar = 1
def print_globvar():
print(globvar) # 沒有使用 global
set_globvar_to_one()
print globvar # 輸出 1
print_globvar() # 輸出 1,函數(shù)內(nèi)的 globvar 已經(jīng)是全局變量