目錄
函數的作用
定義一個函數簡單的規則
函數的定義
函數的注釋
函數的調用
函數的返回值
1.形參
2.實參
1、位置參數
站在實參角度
1、按照位置傳值(涉及if的三元表達式)
2、按照關鍵字傳值
3、位置、關鍵字形式混著用
站在形參角度
1、位置參數必須傳值
2、默認參數
1、默認參數的概念
2、默認參數陷阱問題(超重點)
3、動態參數
動態參數的概念
*args求和函數應用
**kwargs應用
- 1.使程序變得更簡短而清晰
- 2.有利於程序維護
- 3.可以提高程序開發的效率
- 4.提高了代碼的重用性(復用性)
函數的定義
def 關鍵詞開頭,空格之後接函數名稱和圓括號(),最後還有一個":"。
- 任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數。
- 函數的第一行語句可以選擇性地使用文檔字符串—用於存放函數說明。
- 函數內容以冒號 : 起始,並且縮進。
- return [表達式] 結束函數,選擇性地返回一個值給調用方,不帶表達式的 return 相當於返回 None。
def func(): print('hello world')
函數的注釋
- 注釋:每一個函數都應該對功能和參數進行相應的說明,應該寫在函數下面第一行。以增強代碼的可讀性。
>>>def func(): >>> ''' >>> 這是一個輸出hello world的函數 >>> :return: >>> ''' >>> print('hello world')
函數的調用
使用函數名加小括號就可以調用了 寫法:函數名() ,這個時候函數的函數體會被執行
只有解釋器讀到函數名() 時,才會執行此函數,如果沒有這條指令,函數裡面即使有10萬行代碼也是不執行的。而且是這個指令你寫幾次,函數裡面的代碼就運行幾次
>>>def func(): >>> print('hello world') >>>func() >>>func() hello world hello world
返回值的三種情況:沒有返回值
一、沒有返回值----返回None(不報錯) 1、不寫return #函數定義 def mylen(): """計算s1的長度""" s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) #函數調用 str_len = mylen() #因為沒有返回值,此時的str_len為None print('str_len : %s'%str_len) 輸出結果: 11 str_len : None
2、只寫return:結束整個函數def ret_demo(): print(111) return print(222) ret = ret_demo() print(ret) 輸出結果: 111 None
3、return None ---- 不常用def ret_demo(): print(111) return None print(222) ret = ret_demo() print(ret) 輸出結果: 111
二、返回一個值
1、return和返回值之間要有空格且可以返回任何數據類型def f(): return {'k':'v'} print(f()) 輸出結果: {'k':'v'}
2、只要返回就可以接收到 3、如果在一個程序中有多個return,那麼值執行第一個:因為函數只要遇到return就會終止 三、返回多個值: 可以用多個變量接收多個返回值(return 1,2)但如果只用一個變量接收多個返回值的話那麼得到的就是一個元祖def f2(): return 1,2,3 print(f2()) 輸出結果: (1,2,3)
原因:為什麼返回的是(1,2,3)、而不是返回1,2,3或其他?
>>> 1,2 #python中把用逗號分割的多個值就認為是一個元組。 (1, 2) >>> 1,2,3,4 (1, 2, 3, 4) >>> (1,2,3,4) (1, 2, 3, 4)
序列解壓擴展
#序列解壓一 >>> a,b,c,d = (1,2,3,4) >>> a 1 >>> b 2 >>> c 3 >>> d 4 #序列解壓二 >>> a,_,_,d=(1,2,3,4) >>> a 1 >>> d 4 >>> a,*_=(1,2,3,4) >>> *_,d=(1,2,3,4) >>> a 1 >>> d 4 #也適用於字符串、列表、字典、集合 >>> a,b = {'name':'eva','age':18} >>> a 'name' >>> b 'age'
1.形參
寫在函數聲明的位置的變量叫形參,形式上的一個完整.表示這個函數需要xxx
2.實參
在函數調用的時候給函數傳遞的值.加實參,實際執行的時候給函數傳遞的信息.表示給函數xxx
函數的傳參就是函數將實際參數交給形式參數的過程.
def my_sum(a): #a為形式參數 print(a) res = my_sum('hello') #此時的'hello'為實際參數 print(res) 輸出結果: hello None
1、按照位置傳值(涉及if的三元表達式)
def mymax(x,y): #此時x=10,y=20 the_max = x if x > y else y return the_max ma = mymax(10,20) print(ma) 輸出結果: 20
2、按照關鍵字傳值
def mymax(x,y): #此時x = 20,y = 10 print(x,y) the_max = x if x > y else y return the_max ma = mymax(y = 10,x = 20) print(ma) 輸出結果: 20
3、位置、關鍵字形式混著用
def mymax(x,y): #此時x = 10,y = 20 print(x,y) the_max = x if x > y else y return the_max ma = mymax(10,y = 20) print(ma)
注意:
1、位置參數必須在關鍵字參數的前
2、對於一個形參只能賦值一次
1、位置參數必須傳值
def mymax(x,y): #此時x = 10,y = 20 print(x,y) the_max = x if x > y else y return the_max #調用mymax不傳遞參數 ma = mymax() print(ma) 輸出結果: TypeError: mymax() missing 2 required positional arguments: 'x' and 'y'
1、默認參數的概念
調用函數時,如果沒有傳遞參數,則會使用默認參數。以下實例中如果沒有傳入 age 參數,則使用默認值:(一般將變換不大的值設為默認參數)
#可寫函數說明 def func( name, age = 18 ): "打印任何傳入的字符串" print ("名字: ", name,"年齡: ", age) #調用printinfo函數 func( age=100, name="zhou" ) func( name="zhou" ) 輸出結果: 名字: zhou 年齡: 100 名字: zhou 年齡: 18
2、默認參數的陷阱問題(超重點)
默認參數中超級重要的知識點:默認參數的陷阱問題(當默認參數是一個可變的數據類型時如列表,字典等)
如果默認參數的值是一個可變數據類型,那麼每一次調用函數時如果不傳值就公用這個數據類型的資源
''' 如果默認參數的值是一個可變數據類型 那麼每一次調用函數時如果不傳值就公用這個數據類型的資源 ''' #==========當默認參數是一個列表時==================== def f(l = []): l.append(1) print(l) f() f() f([]) f() f() #==========當默認參數是一個字典時==================== def f2(l = {}): l['k'] = 'a' print(l) f2() #覆蓋 f2() def f3(k,l = {}): l[k] = 'a' print(l) f3(1) f3(2) f3(3) 輸出結果: [1] [1, 1] [1] [1, 1, 1] [1, 1, 1, 1] {'k': 'a'} {'k': 'a'} {1: 'a'} {1: 'a', 2: 'a'} {1: 'a', 2: 'a', 3: 'a'}
動態參數的概念
動態參數,也叫不定長傳參,就是你需要傳給函數的參數很多,不定個數,那這種情況下,你就⽤*args,**kwargs接收,args是元祖形式,接收除去鍵值對以外的所有參數,kwargs接收的只是鍵值對的參數,並保存在字典中。
*args : 接收的是按照位置傳參的值,組織成一個元組
**kwargs: 接受的是按照關鍵字傳參的值,組織成一個字典
args必須在kwargs之前
def mysum(*args):
the_sum = 0
for i in args:
the_sum+=i
return the_sum
the_sum = mysum(1,2,3,4)
print(the_sum)
輸出結果:
10
def stu_info(**kwargs):
print(kwargs)
print(kwargs['name'],kwargs['sex'])
stu_info(name = 'lisa',sex = 'male')
dir = {'a':97,'b':98}
print(*dir)
輸出結果:
{'name': 'lisa', 'sex': 'male'}
lisa male
a b
站在實參的角度:
按照位置傳參
按照關鍵字傳參
注意:兩個混著用可以但是必須先按照位置傳參,再按照關鍵字傳參, 因為不能給同一個變量傳多個值
站在形參的角度上:
位置參數:必須傳,且有幾個參數就傳幾個值
默認參數:可以不傳,如果不傳就是用默認的參數,如果傳了就用傳的只有調用函數的時候
按照位置傳: 直接寫參數的值
按關鍵字傳: 關鍵字 = 值
定義函數的時候:
位置參數:直接定義函數
默認參數(關鍵字參數):參數名 = ‘默認的值’
動態參數:可以接受任意多個參數
參數名之前加*, 習慣參數名args;
參數名之前加**, 習慣參數名kwargs;
參數的順序(必須死記):位置參數 > *args > 默認參數 > **kwargs
最後感謝各位友友能夠看到這裡:
在魯迅一篇未發表的文章中說過:“代碼看懂了不是懂一定要自己實際操作哇這樣才能更好的理解和吸收。”
最後來一句:一個人可以在任何他懷有無限熱忱的事情上成功,讓我們一起進步吧