Python系列 (5)- 函數、拋出錯誤、參數

前言

本人自學了廖雪峯老師編寫的Python教程,將在學習過程中的一些心得、方法 成體系的寫成 本Python系列,所舉的部分例子可能會和廖雪峯老師舉的例子一致,本Python系列僅供大家學習參考,也相當於本人的學習筆記。

一、函數

1、函數的創建

  • 函數的創建使用 def 語句即可
def sum():		# sum爲函數名,自定義的
    pass		# pass 語句是佔位符,你可以在此寫你要實現的功能
  • 示例:創建一個與 abs() 函數功能相同的函數my_abs()
def my_abs(num):
    if num < 0:
        return -num
    else:
        return num
  • 在執行函數時,只要函數遇到了 return 語句,就會立馬返回 return 後面的參數(變量或常量或函數),這個時候,函數執行完畢
  • 如果沒有 return 語句,函數執行完會返回一個結果,爲None(空值)
  • 常常用 return 來返回某個想要的結果

既然會創建函數了,接下來就該調用函數了

print(my_abs(-9))		#運行結果是 9

2、函數的別名

我們自己創建的 my_abs() 函數,my_abs 爲函數名

print(my_abs)

#運行結果
<function my_abs at 0x00000137F7BD9168>

那什麼又是函數的別名呢?
首先我們需要先知道什麼是函數名,函數名就是指向函數對象的引用,他們有一個指向關係,通過函數名,能找到函數對象。那麼函數的別名是啥,就是把函數名賦值給一個變量,那麼這個變量也能指向函數對象,就相當於取了一個別名

print(my_abs)
a = my_abs
print(a,a(-9))

# 運行結果
<function my_abs at 0x00000222A07A9168>
<function my_abs at 0x00000222A07A9168> 9

3、空函數

  • 空函數就是啥功能都沒有的一個函數,用 pass 語句作爲佔位符
  • 一般用於,還沒想好怎麼寫這個函數,先用 pass 語句佔位,讓代碼可以先運行起來

示例:

def my_abs():
    pass

4、調用函數時的報錯

  • 以自定義的 my_abs() 函數爲例:
def my_abs(num):
    if num < 0:
        return -num
    else:
        return num

參數個數錯誤:

print(my_abs(-1,2))

# 報錯
TypeError: my_abs() takes 1 positional argument but 2 were given

數據類型錯誤:

print(my_abs('-1'))

# 報錯
TypeError: '<' not supported between instances of 'str' and 'int'

# 這種也是數據類型錯誤
TypeError: bad operand type for abs(): 'str'

5、拋出錯誤

python可以自定義 拋出錯誤 的內容

def my_abs(num):
    if not isinstance(num,(int,float)):
        raise TypeError('please input the int of number! ')
    elif num < 0:
        return -num
    else:
        return num
  • isinstance() 可以判斷變量的數據類型,not 表示非 ,連起來也就是 如果不是True,就拋出類型錯誤

運行一下看看:

my_abs('9')

# 運行結果
TypeError: please input the int of number!

6、return 的用法

def my_abs(num):
    if not isinstance(num,(int,float)):
        raise TypeError('please input the int of number! ')
    elif num < 0:
        return num,'小於零'
    else:
        return num,'大於零'

a = my_abs(-9)
print(a)

# 運行結果
(-9, '小於零')

可以看到 return 返回的是一個元組,那麼我們怎麼直接獲取這些返回值呢?

a,b = my_abs(-9)
print(a)
print(b)

# 運行結果
-9
小於零
  • 可以看到用 多個變量 來接收返回值就行了

剛纔我也說了,如果函數沒有執行 return 語句 就結束了的,會返回一個空值

def my_abs(num):
    if not isinstance(num,(int,float)):
        raise TypeError('please input the int of number! ')
    elif num < 0:
        return num,'小於零'
    else:
        num = num			# 沒有調用 return 語句
        
a = my_abs(9)			
print(a)

# 運行結果
None

7、小結

  • 定於函數用 def 語句,例如: def 函數名(參數):
  • 必要時,可以先對參數做一個類型檢查,isinstance() 函數
  • 在函數體,可以用 return 返回函數結果
  • 不寫 return 語句,默認爲 return none
  • 函數可以同時返回多個值,但實際上返回的是一個元組
  • 沒想好寫啥時,可以用 pass 語句,先讓函數能夠運行起來

二、參數

什麼是參數呢?舉個例子,剛纔自定義的函數 my_abs(num) 中的 num 就是參數,沒錯,函數名後面那個括號裏的變量就是參數

1、位置參數

  • 從以下例子可以看出,-9 對應的是 a ,10 對應的是 b 。按參數位置一一對應,這就是位置參數。
def sum(a,b):
    s = a + b
    return s

print(sum(-9,10))

2、默認參數

  • 默認參數就是讓某些參數有一個默認值,這樣用戶在調用函數給參數賦初值時,可以默認參數,此時默認參數爲默認值,如果寫了,默認參數就爲寫的值
  • 在定義函數時,必選參數必須寫在前面,默認參數寫在後面
  • 定義多個默認參數時,經常變化的寫在前面,萬年不變的寫在後面
  • 默認參數必須指向不可變對象,否則默認參數所指向的內容有改變的風險
def sum(a,b=-1):
    s = a + b
    return s
    
print(sum(-9))			#  b 默認爲 -1 了
print(sum(-9,10))
print(sum(-9,b=10))		# 當定義的默認參數多了,不知道在哪個位置
						# 				可以直接根據參數名來定義

# 運行結果
-10
1
1

3、可變參數

  • 可變參數在形式上就是 在一個參數前加上一個星號,例如:有一個參數叫 num ,那麼*把 num 變成可變參數的形式就是 num
  • 可變參數有什麼作用呢?那就是把普通參數(只能接收一個參數)變成可以接收任意個(可以是0個,也可以是1,2,3…)參數的參數
def sum(*num):
    s = 0
    for i in num:		# 使用方法是循環
        s = s +i
    return s

print(sum(1,2,3,4,5))

# 運行結果
15

4、關鍵字參數

  • 關鍵字參數的形式是 ,在參數前加兩個星號,通常用 ** kwargs來表示
  • 關鍵字參數和可變參數一樣,可以傳入任意個參數,不同的是這些參數必須含有參數名
  • 關鍵字參數 在調用函數時,自動封裝成一個字典
  • 關鍵字參數的作用是,作爲擴展函數功能,必要的信息必填,選填的信息就用關鍵字參數來實現
def info(name,age,**kwargs):
    print('name:%s \nage:%s\nother:%s' % (name,age,kwargs))

info('lxn','21',job='student',sex='男')		# 含有參數名

# 運行結果
name:lxn 
age:21
other:{'job': 'student', 'sex': '男'}		# 字典

5、命名關鍵字參數

  • 命名關鍵字參數的作用是限定參數,這些限定的參數必須傳入,也不可多傳,傳入參數時根據關鍵字傳入!
def info(name,age,*,job,where):		# 命名關鍵字參數job,where必須傳入
    print('name:%s \nage:%s\njob:%s where:%s' % (name,age,job,where))

info('lxn','21',job='student',where='ChongQing')

# 運行結果
name:lxn 
age:21
job:student where:ChongQing
  • 命名關鍵字參數job,where必須傳入,否則報錯
def info(name,age,*,job,where):
    print('name:%s \nage:%s\njob:%s where:%s' % (name,age,job,where))

info('lxn','21',job='student')

# 運行結果
TypeError: info() missing 1 required keyword-only argument: 'where'
  • 也不能多傳入其它參數,否則報錯
def info(name,age,*,job,where):
    print('name:%s \nage:%s\njob:%s where:%s' % (name,age,job,where))

info('lxn','21',job='student',where='ChongQing',test='None')

# 運行結果
TypeError: info() got an unexpected keyword argument 'test'

6、參數組合

  • 在 Python 中,定義函數可以使用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數
  • 而且這五種參數類型可以混合使用,除了可變參數無法和命名關鍵字參數無法組合
  • 參數的順序必須是: 必選 - 默認 - 可變/命令關鍵字 - 關鍵字參數
def mux(a,b,c=3,*args,**kw):
    print('a-->',a,' b-->',b,' c-->',c,' args-->',args,' kw-->',kw)

mux(1,2)
mux(1,2,3,4,5,x=6,y=7)   # 位置參數必須寫,如果要寫後面的可變參數的話

tuple=(1,2)
dic={'x':6,'y':7}
mux(*tuple,**dic)       # 字典對應的是關鍵字參數
                        # 元組是將所有元素一次匹配前面的參數類型
# 運行結果
a--> 1  b--> 2  c--> 3  args--> ()  kw--> {}
a--> 1  b--> 2  c--> 3  args--> (4, 5)  kw--> {'x': 6, 'y': 7}
a--> 1  b--> 2  c--> 3  args--> ()  kw--> {'x': 6, 'y': 7}
  • 從結果可以看到:可變參數收到參數後會封裝成元組關鍵字參數收到參數後會封裝成字典

  • *tuple 或者 *list 代表依此提取出元組或列表中的元素
    示例:

li = [i for i  in range(10)]
print(li)			# 顯示列表
print(*li)			# 只有元素

# 運行結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
0 1 2 3 4 5 6 7 8 9

7、小結

  • 默認參數一定要用不可變對象,如果是可選對象,程序運行時可能會有邏輯錯誤
  • *args 是可變參數, args 參數接收的是一個 tuple
    **kw 是 關鍵字參數, kw 參數 接收的是一個字典
  • 必選參數: 必須有的參數,用於不可或缺的參數,必須輸入
  • 默認參數: 給參數一個默認的值,省得調用參數的時候每次都去寫
  • 可變參數: 常用於不知道有多少個參數,很靈活,可以調用任意個參數,以元組或者列表的形式調用
  • 關鍵字參數: 以字典的形式調用,常用於可選輸入
  • 命名的關鍵字參數: 是爲了限制調用者可以傳入的參數名,格式是 *,參數名
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章