Python函式的定義方式與函式引數問題例項分析
本文例項講述了Python函式的定義方式與函式引數問題。分享給大家供大家參考,具體如下:
涉及內容:
- 函式的定義方式
- 函式的文字描述
- 空操作語句
- 位置引數
- 預設引數
- 關鍵引數
- 可變長度引數
函式的定義方式:
函式的文字說明:
為了讓別人瞭解函式的意義,或者避免自己遺忘,可以使用 字串(不需要賦值,單引號,雙引號,多引號都行)、#註釋 將文字說明寫在函式最開始的位置
def function1() : """ 這是這個程式的說明文字 """ print("hello function") return 1 function1()
空操作語句:
pass語句是空操作語句,當使用pass代表不進行任何操作:
空函式就是什麼操作也不執行,使用pass語句來定義
def pass_function(): pass
pass也可以使用在迴圈語句中:
if a>0: pass
函式的引數:
Python語言中的所有引數(引數)都將通過引用傳遞。如果在函式中更改引用類引數所指的內容,則更改也會反映在呼叫函式的外部
但當在函式中企圖修改引數的資料指向的時候,外部傳入的引數並不會被修改,因為當發生這樣的情況時,函式自己產生了一個區域性變數來避免錯誤修改外部變數:
如果確實要修改外部變數,那麼需要在更改前,使用global來宣告一下變數
print("------通過全域性改變數--------") print("before:",x) def test_globol(): global x x=6 test_globol() print("after_test_globol:",x)
如何進行函式輸入引數型別檢測:
1.當傳入了不恰當的引數時,內建函式一般都會檢查出引數錯誤並提示TypeError或ValueError,比如說
>>> int("abc") Traceback (most recent call last): File "<pyshell#37>",line 1,in <module> int("abc") ValueError: invalid literal for int() with base 10: 'abc' >>> int ('10') 10
>>> int('10','12') Traceback (most recent call last): File "<pyshell#46>",in <module> int('10','12') TypeError: 'str' object cannot be interpreted as an integer
這是因為內建函式一般都做了引數檢查。
有時候為了讓我們的函式更加完善,我們定義函式的時候需要考慮進行引數檢查。
對引數型別做檢查,資料型別檢查可以用內建函式 isinstance()
實現,raise可以丟擲異常:
""" if not isinstance(引數,(引數允許的型別1,允許的型別2...)) raise TypeError('自定義引數錯誤提示') """ def my_int(x): if not isinstance(x,int): raise TypeError("你輸入的不是整數") print(x)
位置引數:
- 根據位置一一對應賦值引數
def num002(a,b): print(a,b) keynum002("haha","helloworld")#a->"haha",b->"helloworld"
預設引數:
1.預設引數可以簡化引數的輸入。
比如說某些多用的值就不必多餘傳入,一個例子是學生資訊錄入,大部分同年級學生都是同齡人,年齡一致,所以可以簡化年齡引數的輸入
- 不給定變數名時,按位置順序提供預設引數
- 當不按順序提供部分預設引數時,需要把引數名寫上,並且給定引數名的變數不能在不給定引數名的變數
- 如果有引數沒有預設值,那麼這個“必需”引數定義的時候要在預設引數前
#如果有引數沒有預設值,那麼這個“必需”引數定義的時候要在預設引數前 def student2(name="aotuman",sex,age=18): print(name,age) student("lili","m")
由於預設引數會提前生成物件,所以對於可變物件,直接使用預設引數,可能會導致多個函式操作都是使用同一個變數:
print("預設引數的記憶體問題".center(50,"-")) def student3(name,age,id(age)) student3("lili","m") student3("lilei","f") #結果顯示在使用預設引數的情況下,id(age)的記憶體指向相同 #所以要注意使用指向類的變數(列表.....)
student3("hanmeimei","m",17) def my_append(x,list1=[]): list1.append(x) print(list1) my_append("haha") my_append("hehe") #結果顯示預設引數中留下了上一次結果的資料
如果要解決上面的問題,可以把預設引數賦值步驟移動到執行程式碼中:
print("改良結果".center(50,"-")) def my_append2(x,list1=None): if list1 is None: list1=[] list1.append(x) print(list1)
關鍵引數:
- 關鍵引數,在輸入引數時,顯式給定引數名來指定引數
- 但關鍵引數不能寫在位置引數前面
#關鍵引數,在輸入引數時,顯式指定引數 print("\n-----關鍵引數-------") def keynum002(a,b) keynum002(b="haha",a="helloworld") """ keynum002(b="haha","helloworld") #這是不行的,關鍵引數是不能在位置引數前面的 """
可變長度引數:
- 可變長度引數就是傳入的引數個數是可變的
- 如果要傳入多個引數,可以把引數存入list、tuple、dict型別的變數中,再把變數傳給函式:
>>> def can_change(l): print("%s %s" % (l[0],l[1])) >>> l1=["apple","pen"] >>> can_change(l1) apple pen
- python定義了可變引數的引數定義方式,引數前加*說明是一個元組,加**說明是一個字典,在傳值的時候傳入對應的元組或字典。
這種方式下,可變引數是有預設值的,預設為空元組或空字典。
如果同時使用*和**,“*”元組引數必須位於“**”字典引數之前
傳入引數的時候,可以對對應的可變引數加對應的"*"或"**",避免某些時候傳入引數的位置不對應函式引數位置的問題。
def change34(value1,*value2,**value3): print(value1,end='\t') print(value2,end='\t') print(value3,end='\t') change34((1,2))#* ** 有預設值 print("\n") change34(*(1,2))#1溢位到前面的value1 print("\n") change34(*(1,2),{1:1,2:2})#{1:1,2:2}溢位到前面的value2 print("\n") change34("value1",*(1,**{'1':1,'2':2}) print("\n") print("test2".center(50,'-'))
- 可使用多個關鍵字引數輸入一個字典類的引數
def test2(**args):#**可以接受關鍵引數,*只能接受位置引數 print(args) test2(x=1,y=2,c=3) test2(**{'x':1,'y':2,'c':3})
>>> a=[1,2,3,4,5,6] >>> def change(x): x.append("changed") >>> change(a) >>> a [1,6,'changed']
def test2(x): print(id(x)) test2(x) print(id(x))#同一片記憶體指向
關於Python相關內容感興趣的讀者可檢視本站專題:《Python函式使用技巧總結》、《Python面向物件程式設計入門與進階教程》、《Python資料結構與演算法教程》、《Python字串操作技巧彙總》、《Python編碼操作技巧總結》及《Python入門與進階經典教程》
希望本文所述對大家Python程式設計有所幫助。