python 函数递归一次增加一次变量_python3--函数(函数,全局变量和局部变量,递归函数)...
1.1函數(shù)
1.1.1什么是函數(shù)
函數(shù)就是程序?qū)崿F(xiàn)模塊化的基本單元,一般實現(xiàn)某一功能的集合。
函數(shù)名:就相當于是程序代碼集合的名稱
參數(shù):就是函數(shù)運算時需要參與運算的值被稱作為參數(shù)
函數(shù)體:程序的某個功能,進行一系列的邏輯運算
return 返回值:函數(shù)的返回值能表示函數(shù)的運行結(jié)果或運行狀態(tài)。
1.1.2函數(shù)的作用
函數(shù)是組織好的,可重復(fù)使用的,用來實現(xiàn)單一,或者相關(guān)功能的代碼。
函數(shù)能夠提高應(yīng)用的模塊性,和代碼的重復(fù)利用率
我們已近知道python提供了許多內(nèi)置函數(shù),比如print(),我們自已創(chuàng)建的函數(shù)稱為內(nèi)置函數(shù)
1.1.3定義函數(shù)的語法
def函數(shù)名(參數(shù)):
函數(shù)體return 返回值內(nèi)容
1.1.4函數(shù)定義規(guī)則
函數(shù)代碼以def關(guān)鍵詞開頭,后接定義函數(shù)的名稱和圓括號,冒號():
函數(shù)內(nèi)容以冒號":"開始,并且縮進
函數(shù)內(nèi)容的第一行內(nèi)容可選擇性使用文檔字符串---用來定義該函數(shù)的說明
函數(shù)的返回值: return ?[返回值內(nèi)容] ?用于結(jié)束函數(shù),返回一個值,表示程序執(zhí)行的結(jié)果。
函數(shù)不帶return 默認返回None ? 返回值可以是任何類型的數(shù)據(jù)(數(shù)字,字符串,函數(shù),列表,元祖,字典等),也可以是一個表達式
函數(shù)參數(shù):任何傳入?yún)?shù)和自變量必須放在圓括號中間,圓括號之間用于定義參數(shù)。
1.1.5函數(shù)調(diào)用
定義函數(shù)語法
defprintinfo():print("hello world")return
調(diào)用函數(shù)
printinfo()#函數(shù)執(zhí)行結(jié)果
hello world
查看函數(shù)返回值
print(printinfo())#結(jié)果
hello world
None#默認函數(shù)值返回類容
其他返回值示例
defprintinfo():print("hello world")return [111+222]print(printinfo())#結(jié)果
hello world
[333] #返回值內(nèi)容
1.1.5函數(shù)參數(shù)
注:形參和實參(定義函數(shù)時,圓括號(參數(shù))中的所有參數(shù)都是形式參數(shù)也稱為形參,調(diào)用函數(shù)中,圓括號(參數(shù))中的參數(shù)稱為實際參數(shù),也叫實參)
1)必須參數(shù)::
2)關(guān)鍵字參數(shù):
3)默認參數(shù):
4)可變參數(shù)(*args,**kwargs):
1.必須參數(shù):
從字面理解:必須要傳入?yún)?shù)
傳入的參數(shù):與定義的形參順序一一對應(yīng)
defstuinfo(name,age):print(name,age)return
#在不傳入?yún)?shù)
stuinfo() #調(diào)用函數(shù)
#函數(shù)執(zhí)行結(jié)果
TypeError: stuinfo() missing 2 required positional arguments: 'name' and 'age'
#報錯,提示類型錯誤,該函數(shù),缺少兩個位置參數(shù)
不傳入?yún)?shù)
defstuinfo(name,age):print(name,age)returnstuinfo("zhangsan",18)#函數(shù)執(zhí)行結(jié)果
zhangsan 18
傳入?yún)?shù)
2.關(guān)鍵字參數(shù)
defstuinfo(name,age,hobby):print(name,age,hobby)return
#參數(shù)位置匹配,關(guān)鍵字參數(shù),與形參的位置順序無關(guān),
stuinfo(age=19,name="lisi",hobby="run")#name= age= hobby=就是關(guān)鍵字參數(shù)
#函數(shù)執(zhí)行結(jié)果
lisi 19 run
關(guān)鍵字參數(shù)
3.默認參數(shù)
默認參數(shù)必須指向不變的對象
當函數(shù)有多個參數(shù),把變化大的參數(shù)反正前面,變化小的參數(shù)放在后面。變化小的參數(shù)就作為默認參數(shù)。
默認參數(shù)好處:降低調(diào)用函數(shù)的難度
#默認參數(shù),可以直接使用用,也可以修改默認參數(shù)值
def grade(name,age,city="BeiJing"): #city="BeiJing" 就是默認參數(shù)
print(name,age,city)#grade("yangjian",age=18)
grade("lala",age=18,city="shanghai")#grade函數(shù)執(zhí)行結(jié)果
lala 18 shanghai
默認參數(shù)
4.可變參數(shù)
*args ?**args
用途:在定義函數(shù)需要,每個定義函數(shù)功能的都可以繼續(xù)優(yōu)化,所以我們需要用動態(tài)參數(shù)
如果把參數(shù)寫死了,后期繼續(xù)修改完善的功能的,修改該函數(shù)功能則會相當麻煩
*args ?結(jié)果類型是元祖,傳遞值是任意類型
def test(*args):print(args)
test(123456,[12,45,88],{"name":"qw","age":15}) #可以傳遞任意參數(shù)的類型#函數(shù)執(zhí)行結(jié)果
(123456, [12, 45, 88], {'name': 'qw', 'age': 15})
**kwargs結(jié)果類型是字典,傳遞值是以key=value方式傳入
def test1(**kwargs):print(kwargs)
test1(name="xiha",age="12")#執(zhí)行結(jié)果
{'age': '12', 'name': 'xiha'}
函數(shù)* 和 ** 解包
#*
def test(*args):print(args)
test(*[1,2,3,4,5,6,7,8,9]) #*參數(shù)解包,把【元素】 循環(huán)出來,添加到元祖中#結(jié)果
(1, 2, 3, 4, 5, 6, 7, 8, 9)
*
def test1(**kwargs):print(kwargs)
test1(**{"hobby":456,"number":789}) #**參數(shù)解包,把key:value 循環(huán)出來,添加到字典中#結(jié)果
{'number': 789, 'hobby': 456}
**
函數(shù)參數(shù)組合
def f2(a, b, c=0,*args,**kwargs):print('a =', a, 'b =', b, 'c =', c, args,kwargs)
f2(12,b=12,c=89,aa="as",bb="xxx")#結(jié)果
a = 12 b = 12 c = 89 () {'bb': 'xxx', 'aa': 'as'}
函數(shù)參數(shù)總結(jié):
1.形參的位置順序,必須與實參的順序一一對應(yīng),缺一不行,多一不行
2.關(guān)鍵字參數(shù),無須一一對應(yīng),缺一不行,多一不行
3.位置參數(shù)必須在關(guān)鍵字參數(shù)左邊
4.默認參數(shù)一定要用不可變對象,如果是可變對象,程序運行時會有邏輯錯誤
1.2全局變量和局部變量
在子程序中定義的變量稱為局部變量,只在子程序內(nèi)部生效,
在程序一開始定義的變量稱為全局變量
全局變量作用域是整個程序,局部變量作用域是定義該變量的子程序。
當全局變量與局部變量同名時:在定義局部變量的子程序內(nèi),局部變量起作用,在其他地方全局變量起作用
name = "xixi" #全局變量
defchange_name():
name= "haha" #局部變量只在函數(shù)局部作用域內(nèi)生效
print("我的名字",name)returnchange_name()print(name)defme():global name #聲明name是全局變量 global
name = "yj" #修改name全局變量的值
print(name)returnme()
如果全局變量是可變的數(shù)據(jù)類型,函數(shù)可以對全局變量內(nèi)部直接進行修改
eng = ["merry","jack","petter"]defchang():
eng.append("mali")print(eng)returnchang()
總結(jié):
一般寫程序變量的命名規(guī)則
###全局變量變量名大寫
###局部變量變量名小寫
函數(shù)優(yōu)先讀取局部變量,能讀全局變量,無法對全局變量重新賦值操作,#全局變量是不可變的類型
全局變量是可變類型,函數(shù)可以對全局變量進行操作
函數(shù)中有g(shù)lobal關(guān)鍵字,變量本質(zhì)就是全局變量,可讀取全局變量,也可操作全局變量
1.3函數(shù)之間嵌套
name = "YangJIan" #最外層
def change_name(): #第二層
name = "YangJIan2"
def change_name2(): #第三層
name = "YangJIan3"
print("第3層打印", name)
change_name2()#調(diào)用內(nèi)層函數(shù)
print("第2層打印", name)
change_name()#先執(zhí)行局部函數(shù)的打印,
print("最外層打印", name)#第3層打印 YangJIan3#第2層打印 YangJIan2#最外層打印 YangJIan
注:多層函數(shù)嵌套,子級函數(shù),只在子級函數(shù)內(nèi)部生效。父級函數(shù)能調(diào)用子級函數(shù)的功能
1.4遞歸函數(shù)
1.在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù),如果一個函數(shù)在內(nèi)部調(diào)用自身本身,這個函數(shù)就是遞歸函數(shù)。
2.在使用遞歸策越是,必須有一個明確的敵對結(jié)束條件,稱為遞歸出口
函數(shù)調(diào)用的時候,每次調(diào)用時要做地址保存,參數(shù)傳遞等。
如果函數(shù)包含了對其自身函數(shù)的調(diào)用,該函數(shù)就是遞歸。如下
deffoo(n):#實現(xiàn)階乘
if n == 1:return n #當滿種條件n==1才執(zhí)行return 操作
res = n*foo(n-1) #調(diào)用自已本身的函數(shù)的結(jié)果(再判斷條件是否滿足條件)給res ,
returnresprint(foo(5))#120
遞歸算法所所體現(xiàn)的重復(fù)一般有的要求:
1.每次調(diào)用在上次規(guī)模上都有有所減小:
2.每次遞歸調(diào)用都是有明確條件的。
3.相領(lǐng)兩次的重復(fù)之間有緊密的聯(lián)系,前一次要為后一次做準備(通常前一次的輸出(返回值結(jié)果))就作為后一次的輸入;
4.在問題的規(guī)模得到滿足條件時,而不再進行遞歸調(diào)用。
總結(jié)
以上是生活随笔為你收集整理的python 函数递归一次增加一次变量_python3--函数(函数,全局变量和局部变量,递归函数)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python深度神经网络量化_基于Pyt
- 下一篇: 平台允许同时在线人数 显示_糖豆人:终极