簡單介紹下python中函數的基礎語法
python 函數
定義
函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可。
特性
- 減少代碼重復
- 使程序變得可擴展
- 使程序變得易於維護
函數的創建
python中創建函數,需要使用__def__關鍵字,後面寫函數的名字,然後是形參列表,大體如下:
def 函數名(形參列表):
函數體......
return 返回值
其中形參列表和 return返回值並不是必須的。
函數的使用
想要調用函數程序,需要以函數名加括號的形式進行調用,而括號內可以傳入參數,而括號內的參數我們稱之為__實參列表__,傳入的實參會通過形參傳遞進函數,在函數內部就可以使用了。如下:
def add(x,y):
return x + y
# 調用函數
add(10,20)
需要註意的是,python中的實參列表每一個參數之前用逗號分割,而向add()括號內的10,20這樣的參數我們稱之為位置參數(positional argument)。
那麽需要註意的是,在python中,函數的實參的個數必須和形參的個數一樣,實參個數多於形參或者少於形參都會報錯。
函數的參數
形參也可以叫做形參變量,只有在被調用時才分配內存單元,在調用結束時,即釋放所分配的內存單元。所以形參只能在函數內部生效。函數調用結束返回主調用函數後則不能夠再使用該形參變量。
實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
默認參數
首先,先來看下面的代碼:
def stu_register(name,age,country,course): print(‘------註冊學生信息--------‘) print(‘學員姓名:‘,name) print(‘學員年齡:‘,age) print(‘學員國籍:‘,country) print(‘學員選擇課程:‘,course) stu_register(‘小明‘,19,‘中國‘,‘web前端‘) stu_register(‘小紅‘,20,‘中國‘,‘linux‘) stu_register(‘李白‘,25,‘中國‘,‘python‘)
在上面的實例中,每一個學員註冊的國籍都是中國,而在網上的一些網站中,如果不去手動設置,都默認為中國,這就是通過默認參數實現的。
如下,把country變成默認參數,
def stu_register(name,age,course,country=‘中國‘)
那麽此時再註冊學員的時候如果國籍是中國就可以不需要進行國籍的傳參,而是采用默認的參數。
關鍵參數
正常情況下,給函數傳參數要按順序,不想按順序就可以用關鍵參數,只需指定參數名即可,但記住一個要求就是,關鍵參數必須放在位置參數之後。
# 使用關鍵字參數
stu_register(name=‘小明‘,country=‘中國‘,age=19,course=‘linux‘)
‘‘‘關鍵字參數必須放在位置參數之後‘‘‘
stu_register(‘小紅‘,country=‘中國‘,age=19,course=‘linux‘)
非固定參數
如果你的函數中並不是很確定用戶會傳入多少個參數,那麽就可以使用非固定參數。
‘‘‘非固定參數‘‘‘
def test01(x,y,*args):
print(x,y)
print(args)
test01(‘李白‘,‘艷艷‘,12,3,4)
輸出結果為:
李白 艷艷
(12, 3, 4)
需要註意的是,當使用了*args的時候,會發現傳入的參數全部被放在了一個元組中。那麽如果想要操作的話只需按照元組的操作方式操作即可。
非固定參數除了可以轉換成元組以外,還可以將傳入的數據轉換成字典,需要使用**kwargs,代碼如下:
def stu_register(name,age,*args,**kwargs): # *kwargs 會把多傳入的參數變成一個dict形式
print(name,age,args,kwargs)
stu_register("Alex",22)
#輸出
#Alex 22 () {}#後面這個{}就是kwargs,只是因為沒傳值,所以為空
stu_register("Jack",32,"CN","Python",sex="Male",province="ShanDong")
#輸出
# Jack 32 (‘CN‘, ‘Python‘) {‘province‘: ‘ShanDong‘, ‘sex‘: ‘Male‘}
局部變量和全局變量
在python中,函數外部聲明的變量我們稱之為全局變量,在函數內部聲明的變量是局部變量。
全局變量可以在變量聲明之後的任何位置使用,而局部變量只能夠在函數內部使用。
‘‘‘全局變量和局部變量‘‘‘
name = ‘李白‘ # 函數外部聲明 ,稱之為全局變量
def test():
age = 20 # 函數內部聲明,稱之為局部變量
print(age) # 局部變量只能夠在函數內部使用
print(name) # 全局變量可以在函數內部使用
test()
# print(age) 在函數外部沒有辦法使用局部變量
__tip:函數內部聲明全局變量__
如果想要在函數內部聲明全局變量,需要使用global關鍵字
def test():
global test
test = ‘李白鬥酒詩百篇‘
test()
print(test) # 李白鬥酒詩百篇
通過global關鍵字就能夠在函數內部創建全局變量,但是這種寫法是不推薦使用的,有可能造成變量汙染。
還有一點需要註意,看下面的代碼:
name = ‘艷艷‘
def test():
# 在函數中更改全局變量name的值
name = ‘hello,world‘
print(name) # hello,world
test()
print(name) # 艷艷
上述代碼中,在函數中對全局變量進行了更改,並且打印更改之後的變量,那麽打印的結果是更改的結果,但是在函數的外面再次打印在函數中更改的全局變量,發現結果並沒有被更改,因為在函數中更改全局變量,那麽更改過後的值作用域僅停留在函數當中。
那麽如何在函數中對全局變量更改並且在函數外部調用結果為更改之後的值呢?同樣可以使用global關鍵字來實現。
name = ‘艷艷‘
def test():
global name
# 在函數中更改全局變量name的值
name = ‘hello,world‘
print(name) # hello,world
test()
print(name) # hello,world
返回值
要想獲取函數的執行結果,就可以用return語句把結果返回
註意:
函數在執行過程中只要遇到return語句,就會停止執行並返回結果,so 也可以理解為 return 語句代表著函數的結束
如果未在函數中指定return,那這個函數的返回值為None 。
遞歸函數
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
‘‘‘創建一個遞歸,將傳入的參數不斷的除以2,到0為止‘‘‘
def calc(n):
print(n)
if int(n/2) > 0 :
return calc( int(n/2) )
calc(10)
輸出結果為:
10
5
2
1
遞歸特性:
-
必須有一個明確的結束條件
-
每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
-
遞歸效率不高,遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出)
堆棧掃盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
簡單介紹下python中函數的基礎語法