1. 程式人生 > 程式設計 >Python函式的定義方式與函式引數問題例項分析

Python函式的定義方式與函式引數問題例項分析

本文例項講述了Python函式的定義方式與函式引數問題。分享給大家供大家參考,具體如下:

涉及內容:

  • 函式的定義方式
  • 函式的文字描述
  • 空操作語句
  • 位置引數
  • 預設引數
  • 關鍵引數
  • 可變長度引數

函式的定義方式:

image_5a748651_2c7b

函式的文字說明:

為了讓別人瞭解函式的意義,或者避免自己遺忘,可以使用 字串(不需要賦值,單引號,雙引號,多引號都行)、#註釋 將文字說明寫在函式最開始的位置

def function1() :
 """
 這是這個程式的說明文字
 """
 print("hello function")
 return 1

function1()

空操作語句:

pass語句是空操作語句,當使用pass代表不進行任何操作:

空函式就是什麼操作也不執行,使用pass語句來定義

def pass_function():
 pass

pass也可以使用在迴圈語句中:

if a>0:
 pass


函式的引數:

Python語言中的所有引數(引數)都將通過引用傳遞。如果在函式中更改引用類引數所指的內容,則更改也會反映在呼叫函式的外部

但當在函式中企圖修改引數的資料指向的時候,外部傳入的引數並不會被修改,因為當發生這樣的情況時,函式自己產生了一個區域性變數來避免錯誤修改外部變數:

image_5a748a0a_24d0

如果確實要修改外部變數,那麼需要在更改前,使用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.預設引數可以簡化引數的輸入。

比如說某些多用的值就不必多餘傳入,一個例子是學生資訊錄入,大部分同年級學生都是同齡人,年齡一致,所以可以簡化年齡引數的輸入

  • 不給定變數名時,按位置順序提供預設引數
  • 當不按順序提供部分預設引數時,需要把引數名寫上,並且給定引數名的變數不能在不給定引數名的變數
  • 如果有引數沒有預設值,那麼這個“必需”引數定義的時候要在預設引數前

image_5a748d0b_407

#如果有引數沒有預設值,那麼這個“必需”引數定義的時候要在預設引數前
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定義了可變引數的引數定義方式,引數前加*說明是一個元組,加**說明是一個字典,在傳值的時候傳入對應的元組或字典。

這種方式下,可變引數是有預設值的,預設為空元組或空字典。

如果同時使用*和**,“*”元組引數必須位於“**”字典引數之前

image_5a7497f2_98b

傳入引數的時候,可以對對應的可變引數加對應的"*"或"**",避免某些時候傳入引數的位置不對應函式引數位置的問題。

image_5a7497f2_6827

image

image

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,'-'))

image_5a7497f3_352

  • 可使用多個關鍵字引數輸入一個字典類的引數
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程式設計有所幫助。