python函數(shù)該如何使用?
Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì)的吉多·范羅蘇姆于1990年代初設(shè)計(jì),作為一門(mén)叫做ABC語(yǔ)言的替代品。 Python提供了高效的高級(jí)數(shù)據(jù)結(jié)構(gòu),還能簡(jiǎn)單有效地面向?qū)ο缶幊獭ython語(yǔ)法和動(dòng)態(tài)類(lèi)型,以及解釋型語(yǔ)言的本質(zhì),使它成為多數(shù)平臺(tái)上寫(xiě)腳本和快速開(kāi)發(fā)應(yīng)用的編程語(yǔ)言, [2] 隨著版本的不斷更新和語(yǔ)言新功能的添加,逐漸被用于獨(dú)立的、大型項(xiàng)目的開(kāi)發(fā)。 Python解釋器易于擴(kuò)展,可以使用C語(yǔ)言或C++(或者其他可以通過(guò)C調(diào)用的語(yǔ)言)擴(kuò)展新的功能和數(shù)據(jù)類(lèi)型。 Python也可用于可定制化軟件中的擴(kuò)展程序語(yǔ)言。Python豐富的標(biāo)準(zhǔn)庫(kù),提供了適用于各個(gè)主要系統(tǒng)平臺(tái)的源碼或機(jī)器碼。
由于Python語(yǔ)言的簡(jiǎn)潔性、易讀性以及可擴(kuò)展性,在國(guó)外用Python做科學(xué)計(jì)算的研究機(jī)構(gòu)日益增多,一些知名大學(xué)已經(jīng)采用Python來(lái)教授程序設(shè)計(jì)課程。例如卡耐基梅隆大學(xué)的編程基礎(chǔ)、麻省理工學(xué)院的計(jì)算機(jī)科學(xué)及編程導(dǎo)論就使用Python語(yǔ)言講授。眾多開(kāi)源的科學(xué)計(jì)算軟件包都提供了Python的調(diào)用接口,例如著名的計(jì)算機(jī)視覺(jué)庫(kù)OpenCV、三維可視化庫(kù)VTK、醫(yī)學(xué)圖像處理庫(kù)ITK。而Python專(zhuān)用的科學(xué)計(jì)算擴(kuò)展庫(kù)就更多了,例如如下3個(gè)十分經(jīng)典的科學(xué)計(jì)算擴(kuò)展庫(kù):NumPy、SciPy和matplotlib,它們分別為Python提供了快速數(shù)組處理、數(shù)值運(yùn)算以及繪圖功能。因此Python語(yǔ)言及其眾多的擴(kuò)展庫(kù)所構(gòu)成的開(kāi)發(fā)環(huán)境十分適合工程技術(shù)、科研人員處理實(shí)驗(yàn)數(shù)據(jù)、制作圖表,甚至開(kāi)發(fā)科學(xué)計(jì)算應(yīng)用程序。2018年3月,該語(yǔ)言作者在郵件列表上宣布Python 2.7將于2020年1月1日終止支持。用戶(hù)如果想要在這個(gè)日期之后繼續(xù)得到與Python 2.7有關(guān)的支持,則需要付費(fèi)給商業(yè)供應(yīng)商。
一,函數(shù)簡(jiǎn)介
如數(shù)學(xué)上的函數(shù)一樣,例如三角函數(shù)sin(),給一個(gè)角度值,他就會(huì)有一個(gè)結(jié)果。用計(jì)算器計(jì)算時(shí),我們知道輸入角度就會(huì)有結(jié)果,那么在編程時(shí)如何實(shí)現(xiàn)sin()這個(gè)函數(shù)的功能呢?
1,函數(shù)的基本概念
函數(shù)也叫功能,它是對(duì)數(shù)據(jù)與代碼的封裝,實(shí)現(xiàn)了代碼的復(fù)用。
當(dāng)我們?cè)趐ycharm中寫(xiě)代碼時(shí),假如先寫(xiě)了一個(gè)功能的代碼,我們可以右鍵進(jìn)行運(yùn)行;如果我們又寫(xiě)了一個(gè)功能代碼,點(diǎn)擊運(yùn)行時(shí),兩個(gè)功能代碼都會(huì)運(yùn)行,這時(shí)就可以把各個(gè)功能的代碼塊進(jìn)行封裝起來(lái),寫(xiě)成函數(shù)。下次想要用哪個(gè)功能就調(diào)哪個(gè)函數(shù)。
2,函數(shù)的分類(lèi)
python函數(shù)有四類(lèi),分別是:內(nèi)置函數(shù)(builtin functions),標(biāo)準(zhǔn)庫(kù)函數(shù),第三方庫(kù)函數(shù),自定義函數(shù)。
內(nèi)置函數(shù):python一經(jīng)運(yùn)行就加載到內(nèi)存的,例如有l(wèi)ist,len,str等函數(shù)
標(biāo)準(zhǔn)庫(kù)函數(shù):需要用import語(yǔ)句進(jìn)行導(dǎo)入,常見(jiàn)標(biāo)準(zhǔn)庫(kù)有time,os等
第三方庫(kù):需要另外下載到本地的庫(kù),例如opencv庫(kù),然后用import導(dǎo)入
自定義函數(shù):自己在模塊里的寫(xiě)的函數(shù)
二,函數(shù)的定義與調(diào)用
1,python函數(shù)的定義
定義語(yǔ)法如下:
def 函數(shù)名 (參數(shù)) :
'''文檔字符串'''
函數(shù)體/若干語(yǔ)句
def func():
"""
打印'人生苦短,我學(xué)python'
"""
print('人生苦短,我學(xué)python')
當(dāng)python解釋器遇到def時(shí),他就會(huì)在內(nèi)存里創(chuàng)建一塊內(nèi)存塊來(lái)存儲(chǔ)代碼信息,即函數(shù)對(duì)象,然后將內(nèi)存塊的首地址給函數(shù)名稱(chēng),實(shí)現(xiàn)變量名與函數(shù)對(duì)象的綁定。
然而并不會(huì)執(zhí)行,因?yàn)檫€沒(méi)有調(diào)用。
2,函數(shù)的調(diào)用
語(yǔ)法格式如下:
函數(shù)名()
def func():
"""
打印'人生苦短,我學(xué)python'
"""
print('人生苦短,我學(xué)python')
func()
# 人生苦短,我學(xué)python
在函數(shù)名的后面加上英文小括號(hào)()即可。
另外除了用函數(shù)名來(lái)綁定函數(shù)對(duì)象之外,也可以用其他變量名來(lái)綁定函數(shù)。
def func():
"""
打印'人生苦短,我學(xué)python'
"""
print('人生苦短,我學(xué)python')
func_copy = func # func_copy也與函數(shù)對(duì)象進(jìn)行了綁定
func_copy()
# 人生苦短,我學(xué)python
函數(shù)對(duì)象也有三屬性,也就是類(lèi)型,id,值。
類(lèi)型就是函數(shù)類(lèi)型;id就是函數(shù)對(duì)象的地址;值就是函數(shù)封裝的各種數(shù)據(jù)和代碼,但是利用print打印時(shí)只會(huì)打印出函數(shù)的id地址。
def func():
"""
打印'人生苦短,我學(xué)python'
"""
print('人生苦短,我學(xué)python')
func_copy = func
print(func_copy, 'and', type(func_copy), 'and', id(func_copy), 'and', id(func))
# and and 2981859760744 and 2981859760744
3,return語(yǔ)句
return語(yǔ)句用于將函數(shù)處理結(jié)果返回,或者返回一些其他數(shù)據(jù)。當(dāng)return被執(zhí)行,代表函數(shù)調(diào)用結(jié)束,也就是說(shuō)return語(yǔ)句的作用之二就是結(jié)束函數(shù)的調(diào)用。
def maxab(a, b):
'''
比較兩個(gè)整數(shù)的大小
'''
if type(a) == int and type(b) == int:
return a if a >= b else b
else:
return '類(lèi)型錯(cuò)誤'
print(maxab(1, 2))
print(maxab(1, 'q'))
# 2
# 類(lèi)型錯(cuò)誤
如果函數(shù)體里不寫(xiě)return,默認(rèn)返回None。
def pr():
print(666)
print(pr()) # 先調(diào)用pr,再打印出返回值
# 666
# None
return可以返回任何東西。
def test():
return [1, 2, 3, 4] # 返回一個(gè)列表
print(test())
def test():
return test # 返回函數(shù)對(duì)象本身
print(test()())
def test():
return range(5) # 返回一個(gè)range對(duì)象
for itm in test():
print(itm)
# [1, 2, 3, 4]
#
# 0
# 1
# 2
# 3
# 4
三,變量的作用域(全局變量和局部變量)
變量起作用的范圍稱(chēng)為變量的作用域,不同作用域內(nèi)同名變量之間互不影響。變量分為:全局變量、局部變量。
所謂起作用的范圍就是,某些代碼他隸屬于不同的語(yǔ)句。例如定義了一個(gè)函數(shù),函數(shù)體里的所有代碼是屬于這個(gè)函數(shù)的,因?yàn)榭s進(jìn)已經(jīng)不同了。在函數(shù)體里的定義的變量在函數(shù)里面可以使用,但是在函數(shù)外邊卻用不了。
1,全局變量
1 ,在函數(shù)和類(lèi)定義之外聲明的變量。全局變量的縮進(jìn)為0,作用域?yàn)槎x的模塊,從定義位置開(kāi)始直到模塊結(jié)束。也就是說(shuō),全局變量即使沒(méi)有定義在函數(shù)里邊,但是在函數(shù)里邊也可以使用,只是使用而已,修改的話(huà)需要作說(shuō)明。這就是全局變量在整個(gè).py文件里都可以訪(fǎng)問(wèn)使用的原因。
2 ,全局變量降低了函數(shù)的通用性和可讀性。應(yīng)盡量避免全局變量的使用。
3 ,要在函數(shù)內(nèi)修改全局變量的值,使用 global 聲明一下。
out = 520 # 全局變量
print(out, 'and id is ', id(out))
def test():
out = 520 # 局部變量
print(out, 'and id is ', id(out))
test()
# 520 and id is 2305420215504
# 520 and id is 2305450107984
# 明顯兩個(gè)id不同,因?yàn)樵诤瘮?shù)里面對(duì)全局變量進(jìn)行修改,會(huì)隱藏全部變量,另外生成一個(gè)新對(duì)象
兩個(gè)out變量名字雖然相同,但不是綁定的同一個(gè)對(duì)象。但是當(dāng)整數(shù)比較小時(shí),由于整數(shù)緩存,他們都是同一個(gè)變量。
out = 520
print(out, 'and id is ', id(out))
def test():
global out # 用global聲明out變量和全局變量out是同一個(gè)
print(out, 'and id is ', id(out))
test()
# 520 and id is 2355312182480
# 520 and id is 2355312182480
在函數(shù)里用global把同名變量聲明為全局變量,則會(huì)修改函數(shù)外部的變量。
2,局部變量
1 ,在函數(shù)體中聲明的變量。(包括形參變量也是局部變量)。
2 ,局部變量的引用比全局變量快,優(yōu)先考慮使用。這里是說(shuō),在函數(shù)或者類(lèi)里面操作自己的局部變量比操作外部變量快。
3 ,如果局部變量和全局變量同名,如果對(duì)同名變量進(jìn)行賦值操作,則在函數(shù)內(nèi)隱藏全局變量,只使用同名的局部變量
Python 函數(shù)
函數(shù)是組織好的,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。
函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道Python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫做用戶(hù)自定義函數(shù)。
定義一個(gè)函數(shù)
你可以定義一個(gè)由自己想要功能的函數(shù),以下是簡(jiǎn)單的規(guī)則:
函數(shù)代碼塊以 def 關(guān)鍵詞開(kāi)頭,后接函數(shù)標(biāo)識(shí)符名稱(chēng)和圓括號(hào)()。
任何傳入?yún)?shù)和自變量必須放在圓括號(hào)中間。圓括號(hào)之間可以用于定義參數(shù)。
函數(shù)的第一行語(yǔ)句可以選擇性地使用文檔字符串—用于存放函數(shù)說(shuō)明。
函數(shù)內(nèi)容以冒號(hào)起始,并且縮進(jìn)。
return [表達(dá)式] 結(jié)束函數(shù),選擇性地返回一個(gè)值給調(diào)用方。不帶表達(dá)式的return相當(dāng)于返回 None。
語(yǔ)法
def functionname( parameters ): "函數(shù)_文檔字符串" function_suite return [expression]
默認(rèn)情況下,參數(shù)值和參數(shù)名稱(chēng)是按函數(shù)聲明中定義的順序匹配起來(lái)的。
實(shí)例
以下為一個(gè)簡(jiǎn)單的Python函數(shù),它將一個(gè)字符串作為傳入?yún)?shù),再打印到標(biāo)準(zhǔn)顯示設(shè)備上。
實(shí)例(Python 2.0+)
def printme( str ): "打印傳入的字符串到標(biāo)準(zhǔn)顯示設(shè)備上" print str return
函數(shù)調(diào)用
定義一個(gè)函數(shù)只給了函數(shù)一個(gè)名稱(chēng),指定了函數(shù)里包含的參數(shù),和代碼塊結(jié)構(gòu)。
這個(gè)函數(shù)的基本結(jié)構(gòu)完成以后,你可以通過(guò)另一個(gè)函數(shù)調(diào)用執(zhí)行,也可以直接從Python提示符執(zhí)行。
如下實(shí)例調(diào)用了printme()函數(shù):
實(shí)例(Python 2.0+)
#!/usr/bin/python # -*- coding: UTF-8 -*- # 定義函數(shù) def printme( str ): "打印任何傳入的字符串" print str return # 調(diào)用函數(shù) printme("我要調(diào)用用戶(hù)自定義函數(shù)!") printme("再次調(diào)用同一函數(shù)")
以上實(shí)例輸出結(jié)果:
我要調(diào)用用戶(hù)自定義函數(shù)!
再次調(diào)用同一函數(shù)
參數(shù)傳遞
在 python 中,類(lèi)型屬于對(duì)象,變量是沒(méi)有類(lèi)型的:
a=[1,2,3] a="Runoob"
以上代碼中,[1,2,3] 是 List 類(lèi)型,"Runoob" 是 String 類(lèi)型,而變量 a 是沒(méi)有類(lèi)型,她僅僅是一個(gè)對(duì)象的引用(一個(gè)指針),可以是 List 類(lèi)型對(duì)象,也可以指向 String 類(lèi)型對(duì)象。
可更改(mutable)與不可更改(immutable)對(duì)象
在 python 中,strings, tuples, 和 numbers 是不可更改的對(duì)象,而 list,dict 等則是可以修改的對(duì)象。
不可變類(lèi)型:變量賦值 a=5 后再賦值 a=10,這里實(shí)際是新生成一個(gè) int 值對(duì)象 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當(dāng)于新生成了a。
可變類(lèi)型:變量賦值 la=[1,2,3,4] 后再賦值 la[2]=5 則是將 list la 的第三個(gè)元素值更改,本身la沒(méi)有動(dòng),只是其內(nèi)部的一部分值被修改了。
python 函數(shù)的參數(shù)傳遞:
不可變類(lèi)型:類(lèi)似 c++ 的值傳遞,如 整數(shù)、字符串、元組。如fun(a),傳遞的只是a的值,沒(méi)有影響a對(duì)象本身。比如在 fun(a)內(nèi)部修改 a 的值,只是修改另一個(gè)復(fù)制的對(duì)象,不會(huì)影響 a 本身。
可變類(lèi)型:類(lèi)似 c++ 的引用傳遞,如 列表,字典。如 fun(la),則是將 la 真正的傳過(guò)去,修改后fun外部的la也會(huì)受影響
python 中一切都是對(duì)象,嚴(yán)格意義我們不能說(shuō)值傳遞還是引用傳遞,我們應(yīng)該說(shuō)傳不可變對(duì)象和傳可變對(duì)象。
python 傳不可變對(duì)象實(shí)例
實(shí)例(Python 2.0+)
#!/usr/bin/python # -*- coding: UTF-8 -*- def ChangeInt( a ): a = 10 b = 2 ChangeInt(b) print b # 結(jié)果是 2
實(shí)例中有 int 對(duì)象 2,指向它的變量是 b,在傳遞給 ChangeInt 函數(shù)時(shí),按傳值的方式復(fù)制了變量 b,a 和 b 都指向了同一個(gè) Int 對(duì)象,在 a=10 時(shí),則新生成一個(gè) int 值對(duì)象 10,并讓 a 指向它。