函數基礎'''1. 什麼是函數 具有某一功能的工具->函數 事先準備工具的過程--->函數的定義 遇到應用場景,拿來就用---->函數的調用 函數分類兩大類: 1. 內置函數 2. 自定義函數2. 爲什麼要用函數 1. 代碼冗餘 2. 可讀性差 3. 可擴展性差一 爲什麼要用函數之不用函數的問題 #一、代碼的組織結構不清晰,可讀性差 #二、遇到重複的功能只能重複編寫實現代碼,代碼冗餘 #三、功能須要擴展時,須要找出全部實現該功能的地方修改之,沒法統一管理且維護難度極大3. 如何用函數 原則:必須先定義,再調用 定義函數的語法: def 函數名(參數1,參數2,...): """文檔註釋""" code1 code2 code3 .... return 返回值 調用函數的語法: 函數名(值1,值2,...)'''函數的使用應該分爲兩個明確的階段:先定義後調用1. 定義階段:只檢測語法,不執行函數體代碼2. 調用階段:會觸發函數體代碼的執行二 函數使用的原則:先定義,再調用三 函數在定義階段都幹了哪些事?#只檢測語法,不執行代碼也就說,語法錯誤在函數定義階段就會檢測出來,而代碼的邏輯錯誤只有在執行時纔會知道函數的定義與調用形式一:定義函數三種形式一、有參:須要根據外部傳進來的參數,才能執行相應的邏輯,好比統計長度,求最大值最小值二、無參:應用場景僅僅只是執行一些操做,好比與用戶交互,打印三、空函數:設計代碼結構'''# 有參函數def func(x): passfunc(1)# 無參函數def bar(): passbar()# 空函數def shopping(): pass'''二:函數調用的三種形式函數的調用:函數名加括號1 先找到名字2 根據名字調用代碼register() # 1,語句形式(單純的語句操做,沒有返回值)def max2(x,y): if x > y: return x else: return yres=max2(10,20)*12 # 2,表達式(能夠+-*/)res=max2(max2(10,20),30) # 3,將函數的調用看成參數傳給另一個函數print(res)函數的返回值return注意點:1. 函數的返回值沒有類型限制2. 函數的返回值沒有個數限制return返回值的三個功能2.1 返回多個值: 多個返回值用逗號分隔開,返回的是元組形式def func(): print('from func') return 1,1.1,'hello',[1,2,3]res=func()print(res,type(res))2.2 返回1個值: 返回的就是該值自己def func(): return 123res=func()print(res,type(res))2.3 返回0個值或者乾脆沒有return: 返回Nonedef func(): # return passres=func()print(res)return除了有返回值的功能,還有結束函數執行的的功能函數內能夠有多個return,但只要執行一次,整個函數就當即結束,而且將return後的值返回def func(): print(1) return print(2) return print(3)func()函數參數的使用!!!!!函數的參數一 形參與實參#形參即變量名,實參即變量值,函數調用時,將值綁定到變量名上,函數調用結束,解除綁定一: 函數的參數分爲兩大類:形式參數(形參): 在定義函數階段,括號內定義的參數/變量名 稱爲形參實際參數(實參): 在調用函數階段,括號內傳入的值/變量值 稱爲實參ps: 在調用函數階段會將實參(值)的值綁定給形參(變量名),\ 這種綁定關係只在調用函數時生效,在函數執行完畢後就會解除綁定二: 細分:1. 位置\參數:1.1 位置形參: 在定義階段,按照從左到右的順序依次定義的形參稱之爲位置形參特色: 但凡時按照位置定義的形參,必須被傳值,多一個不行少一個也不行1.2 位置實參: 在調用階段,按照從左到右的順序依次傳入的值稱之爲位置實參特色:與形參一一對應def func(x,y,z): print(x,y,z)func(2,1,4)2. 關鍵字實參: 在調用階段,按照key=value的形式定義的實參稱之爲關鍵字實參特色: 能夠徹底打亂順序,但仍然能爲指定的形參傳值(總結:指名道姓地爲指定的形參傳值)實參的形式能夠是位置實參與關鍵字實參混合使用,可是必須遵循原則1.位置實參必須放在關鍵字實參的前面2.不能對同一個形參重複傳值func(1,z=3,y=2)func(z=3,1,y=2) #錯誤func(1,z=3,x=2,y=3) #錯誤3. 默認形參:在定義階段,就已經爲形參賦值,該形參稱之爲默認參數特色1. 定義階段就已經有值意味着調用階段能夠不用傳值2. 位置形參必須放到默認形參的前面3. 默認形參的值只在定義時賦值一次,定義階段以後的改動不會影響該值4. 默認形參的值一般應該是不可變類型def func(x,z=100,y): # 位置形參必須放到默認形參的前面 print(x,y,z)m=10def func(x,y,z=m): #z=10 print(x,y,z)m=100 # 默認形參的值只在定義時賦值一次,定義階段以後的改動不會影響該值func(1,2)def add_hobby(name,x,hobbies=[]): # 默認形參的值一般應該是不可變類型 hobbies.append(x) print('%s 的愛好有 %s' %(name,hobbies))add_hobby('egon練習','read',[])add_hobby('wxx','eat',[])add_hobby('alex','piao',[])正確的作法def add_hobby(name,x,hobbies=None): if hobbies is None: hobbies=[] hobbies.append(x) print('%s 的愛好有 %s' %(name,hobbies))add_hobby('egon練習','read',)add_hobby('wxx','eat',)add_hobby('alex','piao')4. 可變長參數:可變長實參:指的是在調用階段,實參值個數是不固定的,實參無非兩種形式(位置,關鍵字實參), 對應着形參也必須有兩種解決方案來分別接收溢出位置實參或者關鍵字實參*--->溢出的位置實參**--->溢出的關鍵字實參4.1 *的用法在形參前加*:*會將溢出的位置實參存成元組的形式,而後賦值給*後的形參名def func(x,y,*z): #z=(3,4,5) print(x,y,z)func(1,2,3,4,5)在實參前加*:但凡碰到實參中帶*的,先將實參打散成位置實參再與形參作對應func(*[1,2,3,4,5]) #func(1,2,3,4,5)func(*[1,2,3]) #func(1,2,3)func(1111,2222,*[1,2,3,4,5]) #func(1111,2222,1,2,3,4,5)4.2 **的用法在形參前加**:**會將溢出的關鍵字實參存成字典的形式,而後賦值給**後的形參名def func(x,y,**z): #z={'c':3,'b':2,'a':1} print(x,y,z)func(1,y=2,a=1,b=2,c=3)在實參前加**:但凡碰到實參中帶**的,先將實參打散成關鍵字實參再與形參作對應def func(x,y,z): print(x,y,z)func(1,**{'y':2,'z':3}) #func(1,z=3,y=2)func(1,**{'a':2,'y':333,'z':3}) #func(1,a=2,y=333,z=3) # a錯誤,位置形參必須被傳值def func(x,y,**z): print(x,y,z)func(**{'y':1,'x':2,'a':1111,'b':2222}) #func(y=1,x=2,a=1111,b=2222)形參中:*args,**kwargsdef func(x,*args): print(x) print(args)def func(x,**kwargs): print(x) print(kwargs)*與**的應用:見練習四種形參的順序:位置形參---默認形參---*args---**kwargs命名關鍵字參數: 在定義函數時,*與**之間參數稱之爲命名關鍵字參數特色:在調用函數時,命名關鍵字參數必須按照key=value的形式傳值