這裏是三歲,來和大家嘮嘮自定義函數,這一個神奇的東西,帶大家白話玩轉自定義函數
自定義函數,編程裏面的精髓!
def
自定義函數的必要函數:def
使用方法:
def 函數名(參數1,參數2,參數…):
函數體(語句塊)
return [返回值]
注意事項
- 函數名的命名規則:和標識符的基本規則是一樣的,基本上由小寫字母和數字下劃線構成
- def 是關鍵字,不能夠修改(define的簡稱)
- 函數後面一定要加括號(英文狀態的)括號裏面是否加參數看具體情況
- 括號後面的冒號不能夠忘記
- 函數體必須加上縮進(建議4個空格)
案例分析
def hello(): #自定義hello()函數
print('hello world !')
hello() # 調用函數
hello world ! # 輸出結果
該處是定義了一個輸出‘hello world !’的函數,只要調用hello()即可實現對函數體的調用。
來個複雜點的練練手,感受一下磨刀霍霍向木蘭
def add(x, y): # 新建add()
return x+y
add(3, 7) # 調用add()
運行ing
輸出none
啊累累!啊累累!啊累累!
我寫了個bug還是寫了一個寂寞?
哦哦哦!我建了一個房子沒有留門(淚目)
沒有輸出怎麼能夠有結果?
print(add(3, 7))
print(add('hello ', 'world'))
#運行結果
10
hello world
作死挑戰
記得每一次調用函數都加了 ()那麼不加括號的是什麼東西?
難道就是傳說中的寫了個寂寞還是什麼東西?
讓我們一起來作死看看
print(hello) # 調用hello
print(add) # 調用add
結果:
<function hello at 0x0000020213737048>
<function add at 0x0000020213737678>
哇哦!他真的可以有
經過查詢他顯示的是這個函數的內存地址,而不是這個函數的結果什麼的,函數並沒有被調用
- 溫馨提示
- 調用函數一定要在函數名後面加上括號
函數參數
自定義函數的參數,分爲幾大類:
- 位置傳參
- 關鍵字傳參
- 必選參數
- 默認參數
- 可變參數
……
形參與實參
白話時間:(個人理解基礎的表達,如有不同之處請指教提出)
形參:
就是參數名稱,一個沒有被賦值的變量名,不會實際的參與函數的運算,而是起到一個類似佔位符的作用。
實參:
實際參加函數運算的值,已經賦值給了相對應的變量名。
ps:以上基於個人理解,本非準確表達,在個人理解基礎上的白話表達
位置參數
位置參數就是按照參數的位置進行表達和相對應的
參數寫的位置決定了它所對應的值,這種寫法如果有多個參數必須注意,寫錯位置整個函數有可能會報錯,整個程序有可能會奔潰!!!
關鍵字參數
關鍵字參數雖然寫法較爲麻煩但是很好的解決了多個參數因爲位置錯誤導致的函數報錯及程序不穩定問題
通過定義的參數名稱來確定對應參數的值,可以有效的解決問題
例:print() 裏面除了經常用的輸出內容還有end參數
end參數默認是‘\n’,如果通過關鍵字參數進行重新定義就可以改變
for i in range(10):
print(i)
結果:
0
1
2
3
4
5
6
7
8
9
for i in range(10):
print(i,end= ' ')
結果:
0 1 2 3 4 5 6 7 8 9
默認參數
在函數涉及過程中很多參數不一定所有人一定用的上,可以設置一個默認值,這樣子需要的人可以DIY,沒有需要的就採用默認參數
比如print()中 end 就是默認參數默認值爲‘\n’
def add(x=0, y=0):
return x+y
print(add())
結果:
0
必選參數
必選參數就是必須要寫的參數,這個與默認參數相對,不是默認參數就是必選參數,如果沒有對必選參數進行導入就會引發報錯,導致系統函數奔潰
def add(x, y): # 新建add()
return x+y
print(add())
Traceback (most recent call last):
print(add())
TypeError: add() missing 2 required positional arguments: 'x' and 'y'
這個就是缺少x,y參數導致的異常。
所有在使用函數及自定義時要注意必選參數的設置
可變參數
可變參數這個名字比較高大上,但是實際上很簡單
比如要寫一個多個數字相加的函數怎麼辦呢?
直接寫?
def add(x, y): # 新建add()
return x+y
那如果是3個值呢?
會應爲多了一個參數報錯
那麼就改成三個參數?
def add(x, y, z): # 新建add()
return x+y+z
問題來了如果是2個值那麼就會報錯缺一個參數,如果是4個及以上就會報錯,多了參數
啊啊啊啊啊啊啊啊啊!
只是什麼東西,難度python一世英名就毀在這裏了嘛?
不不不!
神奇的事情發生了
def 函數名(參數1,參數2,參數…,*可變參數):
函數體(語句塊)
返回值
emmm,奇怪的知識增長了
def add(x, *y):
for num in y:
x += num
return x
print(add(2,3,4))
結果
9
ps:*y 所產生的是一個tuple(元組)
我們需要先逐個遍歷才能夠拿到每一個的結果。
可變關鍵字參數
如果有多個關鍵字參數或者字典的導入使用 *參數名 無法滿足怎麼辦
難道python一世英名就這樣子栽了嗎?
不不不
一個 * 不行那麼就來兩個 **
def personinfo(name, age, **message):
print(f'name:{name},age:{age},{message}')
personinfo('張三', 23, message = {'city':'北京', 'heigh': 180})
結果:
name:張三,age:23,{'message': {'city': '北京', 'heigh': 180}}
在裏面得到的結果是一個字典,看例子可以知道得到了一個鑲嵌的字典
參數問題解答
- 參數的書寫要求:
① 必選參數寫在最前面
②默認參數寫在必選參數後面
③默認參數後面是關鍵字參數
④關鍵字後面是*函數名(可變參數)
⑤後面跟着可變關鍵字參數(**函數名)
ps:按照該順序走,沒有的可以不寫
def a(x , y=0, *z, **i):
print(f'x:{x};y:{y};z:{z};i')
以上就是舉例子,命名方式不符合規定,不要借鑑
不安以上方式可能出現各種奇怪的情況
因爲這一塊奇怪的姿勢比較多,有問題的可以和三歲一起探討
那麼這一塊暫時就到這裏啦,希望大家留言,關注,收藏,一條龍
有什麼問題或者疑惑可以留言或私聊小編歡迎騷擾!!!