带你学python基础:函数是个function?
一、為什么需要函數
有沒有發現,在前面的那么多的教程當中,我們沒有函數是不是也是可以寫的出來的,似乎沒有函數這個東西,我們變成也是可以實現的,但是,在實際的開發過程中,我們為什么需要函數呢,它到底能夠給我們變成帶來怎樣的好處呢?
其實,函數這個東西我們可以把它想成是一個包裝盒,我們沒有包裝盒的時候,其實也是可以把禮物送給相送的人手上的,但是,當我們用包裝盒包裝美化之后,我們首先會更好拿,其次,會更加的好看,更賞心悅目,當然,我們要達到的目的就是,讓收到禮物的人開心,所以,我們買禮物的時候,通常都會很用心的買一個包裝盒美美的包裝一下。
而函數,就是這么個作用,我們需要把我們寫的零零散散的代碼包裝起來,讓它更好閱讀,同時也能更好的管理我們的代碼。
說了這么多,那么到底如何使用函數呢?下面一一道來。
二、如何定義函數
這里,我們先把上面用很淺顯的話說的函數更加正式的表達一下。函數是組織好的、可重復使用的、用戶實現單一或者關聯功能的代碼段。函數能夠提高應用的模塊性和代碼的重復利用率。
定義函數規則
def 函數名([參數列表]): #參數列表可選項函數體舉例
def printName():print('我是 hello world!')printName()注意幾點
- 函數代碼塊以 def 關鍵詞開頭,后接函數標識符名稱和圓括號()。
- 任何傳入參數和自變量必須放在圓括號中間。
- 函數內容以冒號起始,并且縮進。
是不是很簡單,只要你學過一門編程語言,這些應該都是不值得一提。
現在我們定義好了函數,就相當于我們已經有了包裝禮物的包裝盒,那么我們如何用包裝盒去包裝禮物呢,也就是說我們如何去使用函數呢?
使用函數
規則
函數名([參數列表])舉例
- 定義函數
- 調用函數
其實就是這么簡單!
好了,在我們包裝禮物的時候,可能我們會想收禮物的人寫封信或者寫點東西遞交給他,這個時候,我們可能會寫個小紙條啦,而函數,我們也可以傳信哦!
這時候,就要用到函數參數這個概念了。
三、函數參數
函數參數就是說我們可以在定義函數的時候,在括號中定義變量,用于傳給函數內部使用,已達到“傳信”’的效果!
舉例
def printName(name):print('我是:', name)這個括號中的 name ,就是我們定義的函數參數了。
除了需要知道這個以外,我們還需要了解一個概念。
實參與形參
那么什么是實參,什么是形參呢,通過下面這張圖,你就知道了!
我們傳信給對方的時候是不是也有很多的方式,比如,我們可以簡單的拿張小紙條寫寫,也可以買個信封寫封信。
同樣,函數的參數也有一些不同的類型。
參數類型
位置實參
位置實參:函數定義中允許擁有多個形參,因此函數在調用的時候,也可能包含多個實參。向函數傳遞參數的方式有很多,通過實參和形參的順序對應
關鍵字參數
關鍵字實參是傳遞給函數的名稱-值對。直接在實參中將名稱和值關聯起來,因此向函數傳遞實參時不會混淆。函數調用使用關鍵字參數來確定傳入的值。所以,位置可以不用對應。
# 定義函數 def printName(name, age):print('我是:', name)print('我:', age)# 調用函數 printName(age=18, name='歐陽思海') # 名字跟形參對應,但是位置可以不對應參數默認值
在很多語言都是有默認值這個特性的。
**默認值:**函數定義的時候,設置的參數是形參。那么也可以給每個形參指定一個默認值。當調用函數時,如果沒有傳入實參,就使用形參的默認值。如果調用的時候傳入了實參,那么程序將使用傳入的實參。
# 定義函數:使用默認值 age=15 def printName(name, age=15):print('我是:', name)print('我:', age)# 調用函數 printName(age=18, name='歐陽思海') # 名字跟形參對應,但是位置可以不對應 printName(name='歐陽思海') # age有默認值,不賦值,默認15不定長參數
**不定長參數:**你可能需要一個函數能處理比當初聲明時更多的參數。
規則
def 函數名(*parameter,**parameter):函數體**注意:**加了*和**的就是不定長參數。
# 定義函數 def printPara(*para, **para2):print(para)print(para2)# 調用函數 printPara('one', 'two', 'three', four='4', five='5')由此可知:
- 加一個*的不定長參數,會接收沒有命名的實參,且會轉為元祖tuple。
- 加兩個*的不定長參數,會接受有命名的實參,且轉化為字典dictionary。
以上就是函數參數的內容了。
有時候,我們把信封放在禮物中送給對方之后,可能,她直接把禮物加信息拒絕了,這時候,就返回給你了。所以,把函數參數傳過去之后,并不是一定就輸出結果的,有時候,還會返回。所以就有返回值了
四、函數返回值
換專業點的話說:函數其實并非我們想象的總是簡單的將結果直接輸出,相反,函數的調用者需要函數提供一些通過函數處理過后的一個或者一組數據,只有調用者擁有了這個數據,才能夠做一些其他的操作。那么這個時候,就需要函數返回給調用者數據,這個就被稱之為返回值,想要在函數中把結果返回給調用者,需要在函數中使用return。return 就是返回值的關鍵詞。
下面,我們用一個例子直接看 return 怎么使用。
def sum(a, b):return a + bresult = sum(1, 2) print(result)通過這個例子我們可以看出,通過 return 語句 這樣的方式,就可以把 我們想要返回的東西返回。
然后,通過 調用函數 可以用一個變量 接收函數返回的值,以便保存使用。
看了這個例子之后,我想,我們應該知道 return 有什么作用了。
return 作用
五、局部變量和全局變量
在編程語言中,都有叫做變量域的東西。也就是,限制我們變量在哪個地方能用,哪個地方不能用。
變量分為局部變量和全局變量。
局部變量:在函數內定義的變量,局部變量只能在所定義的函數內使用,在不同函數內定義的相同的變量是不會相互影響的,如果在函數 A 中定義了變量 variable,在函數 B 中也定義了變量 variable,這兩個是相互不影響的。
全局變量:在函數外定義的變量,任何地方都可以使用。
舉例
c = 3 # 全局變量def sum(a, b):d = 5 # 局部變量return a + bresult = sum(1, 2) print(result) print(c) # 正確,全局變量處處可以訪問 print(d) # 錯誤,不能訪問局部變量下面,我們需要注意一個問題,當我們需要在函數內部修改一個全局變量時,我們需要用一個關鍵詞 global 來聲明,這樣我們才能夠改變。
舉例
c = 3 # 全局變量 print('全局變量id:', id(c))def sum(a, b):global cc = 5 # 局部變量print('sum中全局變量id:', id(c))return a + bdef sum2(a, b):print('sum2中全局變量id:', id(c))return a + bsum(1, 2) print('全局變量id..:', id(c)) sum2(2, 2)在這個例子中我們可以看到,當我們用 global c 聲明之后,后面再使用變量 c 的時候,變量 c 已經改變了。
再用一個例子,當我們不用 global 聲明直接修改時,后面的 變量 c 的 id的值是不會改變了。
c = 3 # 全局變量 print('全局變量id:', id(c))def sum(a, b):# global cc = 5 # 局部變量print('sum中全局變量id:', id(c))return a + bdef sum2(a, b):print('sum2中全局變量id:', id(c))# c = 10return a + bsum(1, 2) print('全局變量id..:', id(c)) sum2(2, 2)注:id 是用來展示變量唯一性的。
六、匿名函數
**匿名函數:**定義函數的過程中,沒有給定名稱的函數就叫做 匿名函數;Python 中使用 lambda 表達式來創建匿名函數。
規則
lambda 參數列表: 表達式下面我們先用一個例子來看看 lambda表達式 怎么使用。
舉例
res = lambda a, b: a + bprint(res(1, 2)) # 輸出3其中,a,b是參數,a + b 是執行表達式,可以是簡單的表達式,也可以是函數等。
def sum(a, b):return a + bres = lambda a, b: sum(a, b) #執行表達式是函數print(res(1, 2))在前面的我們已經學過 if-else 形式了,在這里,再學習一種不一樣的形式。
條件成立的內容 if 條件 else 條件不成立的內容舉例
s = lambda x, y: x if x > 2 else y print(s(2, 4)) # 輸出4七、遞歸函數
遞歸就是子程序(或函數)直接調用自己或通過一系列調用語句間接調用自己。
形象點說就是一個黑洞一樣,一層一層的往里走,走到最后,再往回走,直到走到出發點,這就是遞歸的整個過程。在走的過程中,我們就可以計算。
這里只是簡單的說說遞歸函數的簡單的用法。
例如:
階乘 1 * 2 * 3 ··· * n
'''階乘 ''' def jiechen(n):if n == 1:return 1else:return n*jiechen(n-1)print(jiechen(10))這個例子,就是函數自己再調用函數自己。
八、高階函數
map()函數接收兩個參數,一個是函數,一個是序列,map將傳入的函數依次作用到序列的每個元素,并把結果作為新的list返回。
舉例說明,比如我們有一個函數f(x)=x2,要把這個函數作用在一個list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()實現如下:
現在,我們用Python代碼實現:
>>> def f(x): ... return x * x ... >>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) [1, 4, 9, 16, 25, 36, 49, 64, 81]請注意我們定義的函數f。當我們寫f時,指的是函數對象本身,當我們寫f(1)時,指的是調用f函數,并傳入參數1,期待返回結果1。
因此,map()傳入的第一個參數是f,即函數對象本身。
像map()函數這種能夠接收函數作為參數的函數,稱之為高階函數(Higher-order function)。
你可能會想,不需要map()函數,寫一個循環,也可以計算出結果:
L = [] for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:L.append(f(n)) print L的確可以,但是,從上面的循環代碼,能一眼看明白“把f(x)作用在list的每一個元素并把結果生成一個新的list”嗎?
所以,map()作為高階函數,事實上它把運算規則抽象了,因此,我們不但可以計算簡單的f(x)=x2,還可以計算任意復雜的函數。
再看reduce的用法。reduce把一個函數作用在一個序列[x1, x2, x3…]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)比方說對一個序列求和,就可以用reduce實現:
>>> def add(x, y): ... return x + y ... >>> reduce(add, [1, 3, 5, 7, 9]) 25當然求和運算可以直接用Python內建函數sum(),沒必要動用reduce。
但是如果要把序列[1, 3, 5, 7, 9]變換成整數13579,reduce就可以派上用場:
>>> def fn(x, y): ... return x * 10 + y ... >>> reduce(fn, [1, 3, 5, 7, 9]) 13579這個例子本身沒多大用處,但是,如果考慮到字符串str也是一個序列,對上面的例子稍加改動,配合map(),我們就可以寫出把str轉換為int的函數:
>>> def fn(x, y): ... return x * 10 + y ... >>> def char2num(s): ... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] ... >>> reduce(fn, map(char2num, '13579')) 13579整理成一個str2int的函數就是:
def str2int(s):def fn(x, y):return x * 10 + ydef char2num(s):return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]return reduce(fn, map(char2num, s))還可以用lambda函數進一步簡化成:
def char2num(s):return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]def str2int(s):return reduce(lambda x,y: x*10+y, map(char2num, s))也就是說,假設Python沒有提供int()函數,你完全可以自己寫一個把字符串轉化為整數的函數,而且只需要幾行代碼!
這就是函數的基本內容了!
參考
- https://www.cnblogs.com/ghgyj/p/3997548.html
總結
以上是生活随笔為你收集整理的带你学python基础:函数是个function?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 带你学python基础:条件控制if与循
- 下一篇: 带你学python基础:面向对象编程