一、函數定義與調用
def 函數名([參數列表]): '''注釋''' 函數體
# 輸出小於n的斐波那契數
>>def fib(n): a,b=1,1
while a < n: print(a,end=' ') a,b=b,a+b print() >>fib(3) 1 1 2
二、形參與實參
在絕大多數情況下,在函數內部直接修改形參的值不會影響實參
def addOne(a): print(a) a+=1
print(a) >>a=3
>>addOne(a) 3
4
>>a 3
修改函數參數值的方式:
如果傳遞給函數的是可變序列,
並且在函數內部使用下標或其他方式為課表序列增加、刪除、修改元素值時,
修改后的結果可以反映到函數之外,即實參得到相應修改
# 修改列表元素的值
def modify(v): v[0] = v[0] + 1
>>a=[2] >>print(a) [2] >>modify(a) >>print(a) [3]
# 為列表增加元素
def addList(v,item): v.append(item) >>a=[2] >>addList(a,3) >>print(a) [2,3]
三、參數類型
python函數參數主要分為:普通參數、默認值參數、關鍵參數、可變長度參數等
在定義函數時不需要指定參數的類型,形參類型由實參類型以及python解釋器的理解和推斷決定
同樣,不需要指定函數的返回值類型,由return語句返回值的類型決定
缺少return語句或沒有執行return語句時,默認返回空值None
1. 默認值參數
調用帶有默認值的函數時,可以不對默認值參數賦值,也可以通過顯示賦值來替換其默認值
在定義帶有默認值的函數時,默認值參數必須出現在函數形參列表的最右端,且任何一個默認值參數右邊都不能再出現非默認值參數
def 函數名(..., 形參名=默認值 ): 函數體 def say(message, time=1): print((message+' ')*times)
>>say.__defaults__
(1,)
2.關鍵參數
指調用函數時的參數傳遞方式,而與函數定義無關
通過關鍵參數可以按名字傳遞值,實參順序可以和形參不一致
def demo(a,b,c=5): print(a,b,c) >>demo(3,7) 3 7 5
>>demo(c=8,a=9,b=0) 9 0 8
3.可變長度參數
*parameter 用來接收任意多個實參並將其放在一個元組中
**parameter 用來接收類似於關鍵參數一樣顯示賦值形式的多個實參並將其放入字典中
def demo(*P): print(P) # 將實參放入元組
>>demo(1,2,3) (1,2,3) # 在調用函數時,自動將接收參數轉換為字典
def demo(**p): for item in p.items(): print(item) >>demo(x=1,y=2,z=3) ('x', 1) ('y', 2) ('z', 3)
4.參數傳遞時的序列解包
可以使用列表、元組、集合、字典及其他可迭代對象作為實參,
並在實參名稱前加一個星號,解釋器自動進行解包,並傳遞給多個單變量形參
要保證實參中元素個數與形參個數相等
def demo(a,b,c): print(a+b+c) >>seq = [1,2,3] >>demo(*seq) 6
# 字典型,默認按照鍵解包
>>dic={1:'a',2:'b',3:'c'} >>demo(*dic) 6
# 指定按照值解包
>>demo(*dic.values()) abc
四、變量作用域
函數內部定義的變量一般為局部變量,不屬於任何函數的變量一般為全局變量
應盡量避免使用全局變量,引用速度慢,增加不同函數之間的隱式耦合度
如果想在函數內部修改一個定義在函數外的變量值,那么這個變量就不能是局部的
def demo(): global x # 聲明全局變量
x=3 # 修改全局變量的值
y=4 # 局部變量
print(x,y) x=5 # 在函數外定義全局變量
demo() # 調用函數,修改全局變量的值
print(x) out: 5
print(y) # 函數結束后,局部變量自動刪除
out: NameError: name 'y' is not defined del x # 刪除全局變量
不同模塊間共享全局變量,定義單獨的模塊,傳遞全局變量
# 定義模塊 A.py
global_var = 0 # 在模塊 B.py中
import A A.global_var = 1
# 在模塊C.py中
import A A.global_var = 2
函數實例:
1、編寫函數,接收字符串參數,返回一個元組,其中第一個元素為大寫字母個數,第二個為小寫字母個數
def countStr(s): result = [0,0] for ch in s: if 'a'<= ch <= 'z': result[1] += 1
elif 'A' <= ch <= 'Z': result[0] += 1
return result tmpStr = 'abANV' bigN,littleN = countStr(tmpStr) print(bigN,littleN) out: 3 2
2、編寫函數,接收一個所有元素值互不相等的整數列表x和一個整數n,要求將值為n的元素作為支點,
將列表中所有小於n的元素全部放在n的前面,所有值大於n的元素放在n后面
1 import random 2 def sortN(x,n): 3 if n not in x: 4 print(n,' is not an element of ',x) 5 return
6
7 i = x.index(n) # 獲取指定元素在列表中的索引
8 x[0],x[i] = x[i],x[0] # 與第0個元素交換
9 key = x[0] 10
11 i = 0 12 j = len(x)-1
13 while i<j: 14 while i < j and x[j] >= key: 15 j-=1
16 x[i]=x[j] # 從后向前找第一個比指定元素小的元素
17
18 while i < j and x[i] <= key: 19 i+=1
20 x[j]=x[i] # 從前向后找第一個比指定元素小的元素
21
22 x[i] = key 23
24 return x
1 x=list(range(1,10)) 2 random.shuffle(x) 3 print(x) 4 sortN(x,4) 5 print(x)