1.函數的概念
概念
寫了一段代碼實作了某個小功能;然後把這些代碼集中到一塊,起一個名字,下一次就可以根據這個名字再次使用這個代碼,這就是函數。
作用
- 友善代碼的重複使用。
- 分解任務,簡化程式邏輯
- 使代碼更加子產品化
函數分類
- 内建函數
- 三方函數
- 自定義函數
2.函數的基本使用
1.簡單定義
def 函數名():
函數體
2.函數調用
函數名()
#函數的定義
def test():
print(2**2)
print(2**3)
print(2**4)
#函數的調用
test()#輸出4 8 16
3.函數的參數
3.1 單個參數
場景
需要動态的調整函數體中某一個處理資訊時,則可以以參數的形式接收到相關資料。
定義
def 函數名(參數名稱):
函數體:函數體中,可以直接以變量的方式使用該參數
函數的調用
函數名(參數值)
形參和實參的概念
上述函數定義中,參數名稱 即為形參 ,在調用函數的時候,傳遞的真實資料,即為實參。
#單個參數的函數的定義
def test(num):
print(num**2)
#函數的調用
test(3)#輸出 9
test(4)#輸出 16
3.2 多個參數
場景
需要動态的調整函數體中多個處理資訊使,則可以用逗号做分割,接收多個參數。
定義
def 函數名(參數名稱1,參數名稱2,........):
函數體:函數體中,可以直接以變量的方式使用該參數
函數的調用
函數名(參數1,參數2,.....)
函數名(參數名稱1=參數1,參數名稱2=參數2,....) 可以指明形參名稱,稱為 “關鍵字參數” 。不需要嚴格按照順序
#多個參數的函數的定義
def test(num1,num2):
print(num1+num2)
#函數的調用
test(3,4)#輸出 7
test(8,16)#輸出 24
test(num2 = 18,num1 = 54)#輸出 72
3.3 不定長參數
場景
如果函數體中,需要處理的資料,不确定長度,則可以使用不定長參數的方式接收資料。
定義
方式一
- def 函數名(*args):
- *args:接收的參數組成一個元組
- 函數體:函數體中,可以直接以元組變量的方式使用該參數
- 函數使用:函數名(參數1,參數2,參數3,.....)
方式二
- def 函數名(**args):
- args:**接收的參數組成一個字典
- 函數體:函數體中,可以直接以元組變量的方式使用該參數
- 函數使用:函數名(參數名稱1=參數1,參數名稱2 = 參數2,參數名稱3 = 參數3,.....)
參數拆包
裝包:把傳遞的參數,包裝成一個集合,稱之為“裝包”
拆包:把集合參數,再次分解成單獨的個體,稱之為“拆包”
#不定長參數的函數的定義 *args 元組
def mySum(*t):
print(t,type(t))
result = 0
for v in t:
result += v
print(result)
#函數的調用
mySum(3,4,5,6,7)#輸出 (3, 4, 5, 6, 7) <class 'tuple'> 25
mySum(3,8,5,12,7)#輸出 (3, 8, 5, 12, 7) <class 'tuple'> 35
#不定長參數的函數的定義 **args 字典
def mySum(**kwargs):
print(kwargs,type(kwargs))
#函數的調用
mySum(name ="sz",age = 12)#輸出 {'name': 'sz', 'age': 12} <class 'dict'>
#參數的拆包和裝包 *args
def mySum(a,b,c,d):
print(a+b+c+d)
def test(*args):
print(args)
#拆包操作
mySum(args)#報錯,b,c,d三個沒有指派成功
mySum(args[0],args[1],args[2],args[3])#這樣太繁瑣
mySum(*args)#這樣直接把已經裝包的參數,再次拆包後指派。
test(1,2,3,4)#輸出 (1, 2, 3, 4) 10 10
#參數的拆包和裝包 **args
def mySum(a,b):
print(a)
print(b)
def test(**args):
print(args)
#拆包操作
mySum(**args)
test(a=1,b=2)#輸出 {'a': 1, 'b': 2} 1,2
test(a=1,c=2)#輸出 報錯 因為字典拆包是拆成 a=1,c=2 這樣mySum函數中的參數沒有c
3.4 預設參數
場景
當我們使用一個函數的時候,如果大多數情況下,使用的某個資料是一個固定值,則可以使用預設值,這種參數,稱為“預設參數”
定義
def 函數名(變量名1=預設值,變量名2=預設值,........):
函數體:函數體中,即使外界沒有傳遞指定變量,也可以使用,隻不過值是給定的預設值
函數的調用
函數名(變量1,變量2,.....) 此次如果是預設參數,則可以不填寫
#預設參數,當沒有參數時,會使用預設值
def hit(somebody = "豆豆"):
print("我想打",somebody)
hit("zhangsan")#輸出我想打 zhangsan
hit()#輸出我想打 豆豆
3.5 參數注意
值傳遞和引用傳遞
值傳遞:是指傳遞過來的,是一個資料的副本,修改副本,對原件沒有任何影響
引用傳遞:是指傳遞過來的,是一個變量的位址,通過位址,可以操作用一份原件。
在python當中,隻有引用傳遞(位址傳遞),但是如果資料類型是可變的資料類型,則可以改變原件,如果資料類型是不可變類型,則不可以改變原件。
def change(num):
print(id(num))#140706432668744
b = 10
print(id(b))#140706432668744
change(b)
#此時b和num同時指向一個位址值,c c++ java三個語言是對于num建立一個新位址存放10
def change(num):
print(id(num))#140706434962504
num = 666
print(id(num))#2095039032144
b = 10
print(id(b))#140706434962504
change(b)
#此時因為num發生了改變,是以建立了一個新位址來存放num的改變,b沒有發生改變
4.函數的傳回值
場景
當我們通過某個函數,處理好資料之後,想要拿到處理的結果
文法
def 函數名(參數等):
函數體
return 資料
注意事項
- return後續代碼不會被執行
- 隻能傳回一次
- 如果想要傳回多個資料,可先把多個資料包裝成一個集合,整體傳回。如清單,元組,字典等等。