基本介紹
沒有使用函數式編程之前帶來的問題
- 代碼的組織結構不清晰,可讀性差
- 實現重復的功能時,你只能重復編寫實現功能的代碼,導致代碼冗余,白白耗費精力
- 假如某一部分功能需要擴展或更新時,需要找出所有實現此功能的地方,一一修改,無法統一管理,加大了維護難度
函數是什么
- 函數是對實現某一功能的代碼的封裝
- 函數可以實現代碼的復用,從而減少代碼的重復編寫
一、定義函數
1. 函數的分類
函數分為內置函數和自定義函數
內置函數 是自帶的,直接可以調用。比如 :
id()
type()
list()
自定義函數 是我們自己在代碼中編寫定義的
2. 定義函數的語法
def 函數名(參數1,參數2,參數3,...):
'''注釋'''
函數體
return 返回值
def
是定義函數的關鍵字- 函數名 和變量名的定義規則一樣,要能體現出函數的功能含有
()
小括號是必須的:
小括號后面的英文的冒號:
也是必須的- 參數 不是必須的,多個參數使用英文逗號
,
隔開- 函數體 可以寫任意合法的 Python 代碼,需要縮進 4 個空格
retrurn
是用于返回數據的,這個是可選的。- 返回值 也是可選的
定義函數
def foo():
print("hello lenovo")
調用函數
foo()
注意:函數必須先定義,才能調用
二、函數的參數
函數的參數可以是python 中的任意數據類型,并且參數的數量可以是零個或多個。
函數的參數分為:
形參
形參就是形式上的參數,是在定義函數時使用的概念,其實就是一個變量名實參
實參就是實際的數據,是在調用(使用)函數時的概念。
1. 形參中位置參數和默認參數
def say(msg):
print(msg)
調用
s = "告訴你,一想到你,我這張丑臉上就泛起微笑。"
say(s)
say
就是位置參數
def func(x, y):
n = x - y
print(n)
調用函數
func(3, 2)
輸出: 1
func(2, 3)
輸出: -1
位置參數有幾個,調用函數時就要傳遞幾個。并且有位置順序的區分
def conn_ospf(ip="192.168.1.1"):
print(ip)
ip="192.168.1.1")
是定義了一個默認參數ip
,這個參數在定義函數的時后就有了一個值192.168.1.1
。
默認參數在調用函數時可以不用傳遞實參,就是使用默認值。
也可以傳遞實參, 傳遞時,就使用傳遞的參數。
conn_ospf()
輸出: 192.168.1.1
conn_ospf("192.168.1.254")
輸出: 192.168.1.254
2. 實參中的位置參數和關鍵字參數
在函數調用的時候,給函數傳遞的參數,稱為實參。
實參可以簡單分為 位置參數 和 關鍵字參數
- 位置參數就是 一個一個的數據對象,傳遞的時候是有位置順序區分的。
如:(18, 'shark')
- 關鍵字參數是變量名和變量值的組合,傳遞的時候沒有位置順序之分。
如:(name=shark
,age=18)
def say_me(name, age=20):
print("昵稱:", name)
print("年齡:", age)
say_me("shark", 18)
# 錯誤示例
say_me(18, "shark")
say_me(age=18, name="shark")
關鍵字參數的變量名必須 和定義函數時的參數名稱一致。
3. * 和 ** 實現接收任意參數
*
可以接收所有的位置參數, **
可以接收所有的關鍵字參數。
def some_arg(*args, **kwargs):
print(args)
print(kwargs)
調用
some_arg(1,3,a=10)
(1, 3)
{'a': 10}
三、感受返回值的強大之處
函數也可以通過關鍵字
return
返回任何數量的 Python 中的任意數據類型,作為結果
def foo():
s = 'lenovo'
li = [1,2,3]
retrue s, li
調用函數并且接收返回值
name, l3 = foo()
四、函數的高級用法
1. 作為參數傳遞
def f1():
n = 1 + 1
return n
def foo(arg):
ret = arg()
print(ret)
調用
foo(f1) # 會輸出 2
注意這里傳遞的是 函數名,后面不要加小括號。
本質上是傳遞了 函數對象本身
2. 作為返回值返回
def f2():
print("hello")
def func():
return f2
f = func()
print(id(f))
print(id(f2))
# f 和 f2 都指向了同一個函數對象