10、函式介紹、函式引數
一、函式介紹
1、什麼是函式
ps:函式時用來盛放程式碼的容器
具備某一功能的工具-->函式
事先準備工具的過程-->函式的定義
遇到應用場景拿來就用-->函式的呼叫
所以函式的使用原則:
類似於定義變數
先定義
後呼叫
2、為何要用函式
解決下述問題:
1、程式碼組織結構不清晰、可讀性差
2、可拓展性差
3、如何用函式
定義的語法:
def函式名(引數1,引數2,引數3...):
"""函式檔案的註釋"""
程式碼1
程式碼2
程式碼3
return 返回值
呼叫的語法
一、定義函式
發生的事情
1、申請記憶體空間把函式體程式碼放進去
2、將函式記憶體地址繫結給函式名
#強調:定義函式只檢測語法,不執行程式碼
def login(): # login = 函式的記憶體地址 print(1111) print(2222) print(3333) print(4444) print(5555)
x=10
print(X) python對於變數有特殊待遇,輸出為10
print(login) 輸出為ID
二、呼叫函式:
發生的事情:
1、先通過函式名定位到函式的記憶體地址
2、函式記憶體地址()->觸發函式體程式碼的執行
強調:呼叫函式才會執行函式體程式碼
例1:
def func():
print(1111
#這裡python直接報錯,語法錯誤
例2:
def func():
print(1111)
x
print(2222)
func
例3:
# ================ def bar(): print('from bar') def foo(): print('from foo') bar() foo() ================ def foo(): print('from foo') bar() def bar(): print('from bar') foo()
三、定義函式的三種方式
3.1無參
def say(): print('========') print('welcome to here') print('========') say() def login(): inp_name = input("username>>>: ").strip() inp_pwd = input("password>>>: ").strip() if inp_name == "egon" and inp_pwd == "123": print('login successful') else: print("username or password error") login()
3.2有參
def max2(x,y): if x > y: print(x) else: print(y) max2(10,20)
3.3空
def login()
pass
#這種方法一般用與羅列整體框架
四、呼叫函式的三種形式
4.1語句
len(''hello'')
4.2表示式
res = len("hello")*10
print(res)
4.3可以當做引數傳給另一個引數
print(len("hello"))
五、引數
總體分為兩大類:
1、形參:在函式定義階段括號內指定的引數,稱之為形式引數,簡稱形參-->變數名
2、實參:在函式呼叫階段括號內傳入的值,稱之為實際引數,簡稱實參-->變數值
形參與實參的關係是:
在呼叫函式時,實參值會繫結給形參名,在函式呼叫完畢後解除繫結
def func(x,y): # x = 111 # y = 222 print(x,y) m=111 n=222 func(111,222)
細分的話:
===========================形參系列==============================
1、位置形參:在定義函式時,按照從左到右的順序依次定義的變數名,稱之為位置形參
特點:內次呼叫,必須被賦值
def func(name,age): print(name) print(age) func(1,2,3) func(1)#被賦的值一個都不能多,一個都不能少,不然就報錯
二、預設形參:在定義函式時,就已經為了某個形參賦值了,稱之為預設形參
特點:呼叫函式時,可以不用為其賦值
def func(name,age=18): print(name) print(age) func("egon") func("egon",19)
注意:可以混用位置形參與預設形參,但是
1、位置形參必須在前面
2、預設形參的值通常應該是不可變型別
3、預設形參的值實在函式定義階段賦值的
def func(age=18,name): print(name) print(age) def func(name,hobby,hobbies = None): if hobbies is None: hobbies = [] hobbies.append(hobby) print('%s的愛好是%s' %(name,hobbies)) func('egon','read') func('tom','play') func('jack','music') func('lili','eat',["movie"]) m=1111 def func(x,y,z=m): print(x) print(y) print(z) m=666#z還是1111 func(1,2)
=========================實參系列============================
一、位置實參:在呼叫函式時,按照從左到右的順序依次傳入的值,稱之為位置實參
特點:按照位置為形參賦值,一一對應
func("egon",18)
func(18,"egon")
二、關鍵字實參:在呼叫函式時,按照key=value的形式傳值,稱之為關鍵字實參
#特點:可以打亂順序,但是任然能夠指名道姓的為指定的引數賦值
func(age=18,name="egon")
注意:可以混用位置實參與關鍵字實參,但是
1、位置實參必須在關鍵字實參的前面
2、不能為同意形參重複賦值
func("egon",age=18) func(age=18,"egon") # 語法錯誤 def foo(x,y,z): pass foo(1,y=2,3) # 錯誤 foo(1,y=2,z=3,x=4) # 錯誤
可變長系列:
可變長引數值的是在呼叫函式時,傳入的引數個數不固定,對應著必須有特殊形式的形參來接收溢位的實參
實參無非兩種形式
溢位的位置實參-->*
溢位的位置關鍵字實參-->**
=========================*與**在形參中事一種彙總行為===================
1、*在形參中的應用:*會將溢位的位置實參合併成一個元組,然後複製給緊跟其後的那個形參名
def func(x,*args): # y = (2,3,4,5) print(x) print(args) func(1,2,3,4,5) def my_sum(*args): res = 0 for i in args: res += i print(res) my_sum(1,2)
2、**在形參中的應用:**會將溢位的關鍵字實參合併成一個字典,然後複製給緊跟氣候的那個形參名
def func(x,**kwargs): # kwargs = {"a":2,"c":4,"b":3} print(x) print(kwargs) func(1,a=2,b=3,c=4)
=========================*與**在實參中是一種打散行為====================
*在實參中的應用:*後可以跟可以被for迴圈遍歷的任意型別,*會將緊跟其後的那個值打散成為位置實參
def func(x,y,z): print(x) print(y) print(z) func([11,22,33]) func(*[11,22,33]) # func(11,22,33) func(*"hello") # func("h","e","l","l","o") func(*{"k1":111,"k2":2222}) # func("k1","k2") **在實參中的應用:**只能跟字典型別,**會將字典打散成關鍵字實參 func(**{"k1":111,"k2":2222}) # func(k2=2222,k1=111) func(**{"x":111,"y":2222,"z":333})
例: def index(x,y,z): print(x,y,z) def wrapper(*args,**kwargs): # args=(1,2,3,4,5,6) kwargs={"a":1,"b":2,"c":3} index(*args,**kwargs) # index(*(1,2,3,4,5,6),**{"a":1,"b":2,"c":3}) # index(1,2,3,4,5,6,a=1,b=2,c=3) # wrapper(1,2,3,4,5,6,a=1,b=2,c=3) wrapper(1,y=2,z=3)
瞭解(**):命名關鍵字形參:在*與**中間的形參稱之為命名關鍵字形參
特點:必須按照key=value的形式傳值
def func(x,m=333,*args,y=222,z,**kwargs): print(x) print(args) print(y) print(z) print(kwargs) func(1,2,3,z=4,a=1,b=2,c=3) func(1,2,3,4,5,6,7)