不可以一樣。一般這種編程的函數(shù)和它的變量不能讓她是一樣的如果你設(shè)成一樣的之后。在程序調(diào)動的過程中,它會區(qū)分不出來是函數(shù)還是變量就會導(dǎo)致程序運(yùn)行死機(jī)。所以在定義的時候你如果變量名和函數(shù)是一樣的,這個時候可能系統(tǒng)會提示你的。
在成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)過程中,需要針對客戶的行業(yè)特點(diǎn)、產(chǎn)品特性、目標(biāo)受眾和市場情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計(jì)方向。成都創(chuàng)新互聯(lián)還需要根據(jù)客戶的需求進(jìn)行功能模塊的開發(fā)和設(shè)計(jì),包括內(nèi)容管理、前臺展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計(jì)和安全保護(hù)等功能。
用type(),就可以查他是什么類型的
def?test(self):
...?????print?"123"
type(test)
type?'function'
a?=?123
type(a)
type?'int'
b?=?"123"
type(b)
type?'str'
c?=?123.456
type(c)
type?'float'
如果是函數(shù),可以用dir(該函數(shù)名),還可以顯示函數(shù)的方法使用方法
在前面已經(jīng)多次提到函數(shù)這個概念,之所以沒有解釋什么是函數(shù),是因?yàn)槌绦蛑械暮瘮?shù)和數(shù)學(xué)中的函數(shù)差不多,如input()、range()等都是函數(shù),這些都是Python的標(biāo)準(zhǔn)函數(shù),直接使用就可以了。根據(jù)需要,用戶也可以自定義函數(shù)。
12.1 函數(shù)
函數(shù)的結(jié)構(gòu):
def 函數(shù)名(參數(shù)):
函數(shù)體
return 返回值
例如:數(shù)學(xué)中的函數(shù)f(x)=2x+5在Python中可以定義如下:
def f(x):
y=2*x+5
return(y)
如果x取值為3,可以使用如下語句調(diào)用函數(shù):
f(3)
下面給出完整的程序代碼:
def f(x):
y=2*x+5
return(y)
res=f(3)
print(res)
運(yùn)行結(jié)果:11
如上例中的x是函數(shù)f(x)的參數(shù),有時也被稱為形式參數(shù)(簡稱形參),在函數(shù)被調(diào)用時,x被具體的值3替換y就是函數(shù)的返回值,這個值3也被稱為實(shí)際參數(shù)(簡稱實(shí)參)。
上例中的y是函數(shù)f(x)的返回值。并不是所有的函數(shù)都有參數(shù)和返回值。如下面的函數(shù):
def func():
print('此為無參數(shù)傳遞、無返回值的函數(shù)')
func()
輸出結(jié)果:此為無參數(shù)傳遞、無返回值的函數(shù)
可以看出,該函數(shù)func()無參數(shù),故調(diào)用時不用賦給參數(shù)值。
函數(shù)也可以有多個參數(shù),如f(x,y)=x2+y2,可用Python語言定義如下:
def f(x,y):
z=x**2+y**2
return z
print(f(2,3)) #調(diào)用函數(shù)f(x,y)
輸出結(jié)果:13
也可以通過直接給參數(shù)列表中的參數(shù)賦值的方法,為參數(shù)添加默認(rèn)值,如果用戶賦予參數(shù)值,則按照用戶賦值執(zhí)行,否則使用默認(rèn)值。例如:
def f(x,y=3):
z=x**2+y**2
return z
若調(diào)用時參數(shù)列表為(2,1),即x賦值為2,y賦值為1:
print(f(2,1))
輸出結(jié)果為:5
若調(diào)用時參數(shù)列表為(2),即x賦值為2,y賦值省缺,則y使用默認(rèn)值:
print(f(2))
輸出結(jié)果為:13
回調(diào)函數(shù),又稱函數(shù)回調(diào),是將函數(shù)作為另一函數(shù)的參數(shù)。
例如:
def func(fun,m,n):
fun(m,n)
def f_add(m,n):
print('m+n=',m+n)
def f_mult(m,n):
print('m*n=',m*n)
func(f_add,2,3)
func(f_mult,2,3)
輸出結(jié)果:
m+n= 5
m*n= 6
在f_add(m,n)和f_mult(m,n)被定義前,func(fun,m,n)中的fun(m,n)就已經(jīng)調(diào)用了這兩個函數(shù),即“先調(diào)用后定義”,這也是回調(diào)函數(shù)的特點(diǎn)。
如果無法預(yù)知參數(shù)的個數(shù),可以在參數(shù)前面加上*號,這種參數(shù)實(shí)際上對應(yīng)元組類型。譬如,參會的人數(shù)事先不能確定,只能根據(jù)與會人員名單輸入:
def func(*names):
print('今天與會人員有:')
for name in names:
print(name)
func('張小兵','陳曉梅','李大海','王長江')
運(yùn)行后,輸出結(jié)果為:
今天與會人員有:
張小兵
陳曉梅
李大海
王長江
參數(shù)為字典類型,需要在參數(shù)前面加上**號。
def func(**kwargs):
for i in kwargs:
print(i,kwargs[i])
func(a='a1',b='b1',c='c1')
輸出結(jié)果為:
a a1
b b1
c c1
一個有趣的實(shí)例:
def func(x,y,z,*args,**kwargs):
print(x,y,z)
print(args)
print(kwargs)
func('a','b','c','Python','is easy',py='python',j='java',ph='php')
輸出結(jié)果:
a b c # 前三個實(shí)參賦給前三個形參
('Python', 'is easy') # *args接收元組數(shù)據(jù)
{'py': 'python', 'j': 'java', 'ph': 'php'} # **kwargs接收字典數(shù)據(jù)
12.2 變量的作用域
變量的作用域即變量的有效范圍,可分為全局變量和局部變量。
局部變量
在函數(shù)中定義的變量就是局部變量,局部變量的作用域僅限于函數(shù)內(nèi)部使用。
全局變量
在主程序中定義的變量就是全局變量,但在函數(shù)中用關(guān)鍵字global修飾的變量也可以當(dāng)做全局變量來使用。
全局變量的作用域是整個程序,也就是說,全局變量可以在整個程序中可以訪問。
下面通過實(shí)例去討論:
程序1:
a=1 # a為全局變量
def a_add():
print('a的初值:',a) # 在函數(shù)中讀取a的值
a_add() # 調(diào)用函數(shù)a_add()
a+=1 # 主程序語句,a增加1
print('a現(xiàn)在的值是:',a) # 主程序語句,讀取a的值
運(yùn)行結(jié)果:
a的初值: 1
a現(xiàn)在的值是: 2
這個結(jié)果和我們想象的一樣,全局變量a既可以在主程序中讀取,也可以在子程序(函數(shù))中讀取。
程序2:
a=1
def a_add():
a+=1
print('a的初值:',a)
a_add()
print('a現(xiàn)在的值是:',a)
運(yùn)行程序1時出現(xiàn)如下錯誤提示:
UnboundLocalError: local variable 'a' referenced before assignment
意思是:局部變量'a'在賦值之前被引用。
從語法上來講,該程序沒有錯誤。首先定義了一個全局變量a并賦值為1,又定義了一個函數(shù)a_add(),函數(shù)內(nèi)的語句a+=1就是出錯的根源,雖然我們的初衷是想讓全局變量a的值增加1,但從錯誤提示看,這個語句中的a并不是全局變量,而是局部變量??磥恚诤瘮?shù)中讀取全局變量的值是沒有問題的(在程序1中已經(jīng)得到了驗(yàn)證),但要在函數(shù)中改變?nèi)肿兞康闹凳遣恍械模ㄔ诔绦?的錯誤提示a+=1中的a 是局部變量,而非全局變量)。
怎樣解決這個問題?
程序3:
a=1
def a_add(x):
x+=1
return x
print('a的初值:',a)
a=a_add(a)
print('a現(xiàn)在的值是:',a)
運(yùn)行結(jié)果:
a的初值: 1
a現(xiàn)在的值是: 2
結(jié)果的確是正確的,但在函數(shù)a_add(x)中沒有調(diào)用變量a(沒有出現(xiàn)變量a)。
程序4:
a=1
def a_add(a):
a+=1
return a
print('a的初值:',a)
a=a_add(a)
print('a現(xiàn)在的值是:',a)
運(yùn)行結(jié)果:
a的初值: 1
a現(xiàn)在的值是: 2
對比程序4和程序3不難發(fā)現(xiàn),其實(shí)程序4只是簡單的把函數(shù)的參數(shù)x變成了a,這個a的實(shí)質(zhì)和程序3中的x還是一樣的。這進(jìn)一步證實(shí),函數(shù)中的a是局部變量,與主程序的全局變量a有著本質(zhì)的區(qū)別。
程序5:
a=1
def a_add():
global a
a+=1
print('a的初值:',a)
a_add()
print('a現(xiàn)在的值是:',a)
運(yùn)行結(jié)果:
a的初值: 1
a現(xiàn)在的值是: 2
程序5和程序2相比較,僅僅是在函數(shù)中添加了一個定義“global a”,此時的局部變量a就可以當(dāng)做全局變量使用,由于它和全局變量a同名,自然也就不用區(qū)分a究竟是全局變量還是局部變量了,在主程序和該函數(shù)內(nèi)都可以訪問、修改變量a的值了。
雖然使用global可使變量使用起來非常方便,但也容易引起混淆,故在使用過程中還是謹(jǐn)慎為好。
12.3 函數(shù)的遞歸與嵌套
遞歸,就是函數(shù)調(diào)用它自身。遞歸必須設(shè)置停止條件,否則函數(shù)將無法終止,形成死循環(huán)。
以計(jì)算階乘為例:
def func(n):
if n==1:
return 1
else:
return n*func(n-1) #func( )調(diào)用func( )
print(func(5))
運(yùn)行結(jié)果為:120
嵌套,指在函數(shù)中調(diào)用另外的函數(shù)。這是程序中常見的一種結(jié)構(gòu),在此不再贅述。
匿名函數(shù)
Python中可以在參數(shù)前加上關(guān)鍵字lambda定義一個匿名函數(shù),這樣的函數(shù)一般都屬于“一次性”的。
例如:
程序1:這是一個常規(guī)的函數(shù)定義和調(diào)用。
def f_add(x,y):
return x+y
print(f_add(2,3))
輸出結(jié)果:5
程序2:使用lambda定義匿名函數(shù)。
f_add=lambda x,y:x+y
print(f_add(2,3))
輸出結(jié)果:5
從上面的代碼可以看出,使用lambda僅僅減少了一行代碼。f_add=lambda x,y:x+y中的f_add不是變量名,而是函數(shù)名。程序1和程序2的print( )語句中的參數(shù)都是一樣的——調(diào)用函數(shù)f_add( )。所以,匿名函數(shù)并沒有太多的優(yōu)點(diǎn)。
一、主體不同
1、類:是面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)現(xiàn)信息封裝的基礎(chǔ)。
2、函數(shù):是指一段在一起的、可以做某一件事兒的程序。也叫做子程序、(OOP中)方法。
二、特點(diǎn)不同
1、類:是一種用戶定義的引用數(shù)據(jù)類型,也稱類類型。每個類包含數(shù)據(jù)說明和一組操作數(shù)據(jù)或傳遞消息的函數(shù)。類的實(shí)例稱為對象。
2、函數(shù):分為全局函數(shù)、全局靜態(tài)函數(shù);在類中還可以定義構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、成員函數(shù)、友元函數(shù)、運(yùn)算符重載函數(shù)、內(nèi)聯(lián)函數(shù)等。
三、規(guī)則不同
1、類:實(shí)質(zhì)是一種引用數(shù)據(jù)類型,類似于byte、short、int(char)、long、float、double等基本數(shù)據(jù)類型,不同的是它是一種復(fù)雜的數(shù)據(jù)類型。
2、函數(shù):函數(shù)必須聲明后才可以被調(diào)用。調(diào)用格式為:函數(shù)名(實(shí)參)調(diào)用時函數(shù)名后的小括號中的實(shí)參必須和聲明函數(shù)時的函數(shù)括號中的形參個數(shù)相同。
參考資料來源:百度百科-函數(shù)
參考資料來源:百度百科-類
全局變量:在函數(shù)外或全局空間中聲明的變量稱為全局變量,這些變量可以由程序中的任何函數(shù)訪問;
局部變量:在函數(shù)內(nèi)聲明的任何變量都稱為局部變量,此變量存在局部空間中,而不是全局空間中。