標籤:range param fine 序列 元素 efi pst 相等 數值
一、函數定義與調用
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)34>>a3
修改函數參數值的方式:
如果傳遞給函數的是可變序列,
並且在函數內部使用下標或其他方式為課表序列增加、刪除、修改元素值時,
修改後的結果可以反映到函數之外,即實參得到相應修改
# 修改列表元素的值
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: 5print(y) # 函數結束後,局部變數自動刪除out: NameError: name ‘y‘ is not defined del x # 刪除全域變數
不同模組間共用全域變數,定義單獨的模組,傳遞全域變數
# 定義模組 A.pyglobal_var = 0# 在模組 B.py中import AA.global_var = 1# 在模組C.py中import AA.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 resulttmpStr = ‘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 = 012 j = len(x)-113 while i<j:14 while i < j and x[j] >= key:15 j-=116 x[i]=x[j] # 從後向前找第一個比指定元素小的元素17 18 while i < j and x[i] <= key:19 i+=120 x[j]=x[i] # 從前向後找第一個比指定元素小的元素21 22 x[i] = key23 24 return x
1 x=list(range(1,10))2 random.shuffle(x)3 print(x)4 sortN(x,4)5 print(x)
python程式設計——函數設計與調用