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