python 函数递归一次增加一次变量_python基础之函数、返回值,局部变量、全局变量,递归(继续补充不定长参数)...
1.python中函數定義:函數是邏輯結構化和過程化的一種編程方法。(完成某一種特定的功能)
def test02():
#""
msg = 'hello WuDaLang'
return msg
test02()
t1 = test02()
print(t1)
def:在python中定義函數的關鍵字。
test02:函數名
():內可定義形參(可以傳參也可以不傳參)
"":文檔描述(非必要,但是強烈建議為你的函數添加描述信息)
泛指代碼塊或程序處理邏輯
return:定義返回值
return語句用于表示函數執行到此結束,并且返回return后面的對象;
有時候,函數不需要返回任何值,此時可以不需要return語句,它在后臺默認給你返回個None,并且不給任何提示;
但是更多的時候我們還是需要return一些東西。一旦函數執行過程遇到return語句,那么之后函數體內的所有代碼都會被忽略,直接跳出函數體;
那怕你現在正在一個循環內。
return可以返回些什么?
return可以返回什么?
什么都不返回,僅僅return:return數字/字符串/任意數據類型: return 'hello'一個表達式:return 1+2一個判斷語句:return 100 > 99一個變量:returna
一個函數調用:returnfunc()
甚至是返回自己!:returnself
多個返回值,以逗號分隔:return a, 1+2, "hello"簡而言之,函數可以return幾乎任意Python對象。
View Code
怎么接受函數的返回值?
在調用函數的時候,可以將函數的返回值保存在變量中;所以如果有多個函數返回值的時候需要用多個變量接收,變量之間用逗號連接。
調用運行:可以帶參數也可以不帶
函數名()
函數的優點:減少代碼的重復率,利于修改,可擴展。2.函數和過程
過程:就是沒有返回值的函數
def test01():
pass
def test02():
return 1
def test03():
return 1,2,3,"df",[12,"sd"],{"name":"小明"}
t1 = test01()
t2 = test02()
t3 = test03()
print(t1)
print(t2)
print(t3)
#None
#1
#(1, 2, 3, 'df', [12, 'sd'], {'name': '小明'})
總結:返回值=0,返回None;
返回值=1,返回該object;
返回值>1,返回元祖。
3.參數的傳遞
Python的函數參數傳遞的是實際對象的內存地址。
Python的數據類型分可變數據類型和不可變數據類型。
形參和實參
(1)形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數后則不能再使用該形參變量;
(2)實參可以是常量、變量、表達式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值。
def test01():
a=1
b=2
return a+b
def test02(x,y):
return x+y
t1 = test01()
t2 = test02(3,8)
print(t1)
print(t2)
#3
#11
【注意:要確認函數調用時候實參的順序和函數定義中形參的順序一致】
(2)關鍵字實參——明確指出實參相對應的形參,指出之后順序任意。
defpet(pet_type,name,age):print("我養的寵物是"+pet_type+",他叫"+name+",有"+age+"歲了!")
pet(pet_type="烏克蘭小乳豬",age="30",name="彭昌云")############################
我養的寵物是烏克蘭小乳豬,他叫彭昌云,有30歲了!
View Code
(3)默認值——-———————————————在編寫函數的時候給每個形參指定默認值。
使用默認值時,先要列出沒有默認值的形參,然后再列出有默認值的形參。
def pet(name,age,pet_type="烏克蘭小乳豬"):print("我養的寵物是"+pet_type+",他叫"+name+",有"+age+"歲了!")
pet(age="30",name="彭昌云")#####################
我養的寵物是烏克蘭小乳豬,他叫彭昌云,有30歲了!
View Code
(4)傳遞任意數量的實參和認識數量的關鍵字實參
*x中的*創建的是一個名為x的空元祖,并將所有收到的值都存在這個元祖中;
**x——在需要接受任意數量的實參,但是預先不知道傳遞給函數的是什么樣的值,可將函數編寫成能夠接受任意數量的鍵—值對
def pet(*pet_features):for item inpet_features:print("小豬豬的特征:"+item)
pet("name","age","high","wegth")def build_profile(first,last,**user_info):
profile={}
profile["first_name"]=first
profile["last_name"]=lastfor key,value inuser_info.items():
profile[key]=valuereturnprofile
user_profile=build_profile("彭","昌云",another_name="傻逼",feather="二貨")print(user_profile)#########################
小豬豬的特征:name
小豬豬的特征:age
小豬豬的特征:high
小豬豬的特征:wegth
{'first_name': '彭', 'feather': '二貨', 'last_name': '昌云', 'another_name': '傻逼'}
View Code
4、變量
a=1 #看到賦值語句,首先把注意力放在等號的右側
在python中
變量和數據是分開存放的;
數據保存在內存中的一個位置;
變量中保存著數據在內存中的地址;
變量中記錄著數據的地址,就叫做引用;
使用id()函數可以查看變量中保存數據所在的內存地址;
如果變量已經被定義,當給一個變量賦值的時候,本質上是修改了數據的引用;
變量不在對之前的數據引用,變量改為對新賦值的數據引用。
局部變量和全局變量
(1)在子程序中定義的變量稱為局部變量,局部變量作用域是定義該變量的子程序。
(2)在程序的一開始定義的變量稱為全局變量,全局變量作用域是整個程序,頂頭寫。
(3)當全局變量與局部變量同名時:
在定義局部變量的子程序內,局部變量起作用;在其它地方全局變量起作用。
(4)首先在自己的作用域找,找不到的話往外面找,直到找到為止,找不到的話就編紅。
######## 全局變量變量名大寫
######## 局部變量變量名小寫
# 如果函數中無global關鍵字,優先讀取局部變量,能讀取全局變量,無法對全局變量重新賦值,
但是對于可變類型(列表,字典),可以對內部元素進行操作(增刪改)
# 如果函數中有global關鍵字,變量本質上就是全局的那個變量,可讀取可賦值
(5)nonlocal,指定上一級變量,如果沒有就繼續往上直到找到為止
name = "阿薩德"
def weihou():
name = "共和國"
print(name)
def weiweihou():
nonlocal name # nonlocal,指定上一級變量,如果沒有就繼續往上直到找到為止
name = "云集" # 該處則是對上一級name = "共和國"重新賦值為name = "云集"
print(name)
weiweihou()
print(name) # 所以在該處name為"云集"
print(name)
weihou()
print(name)
#阿薩德
共和國
云集
云集
阿薩德
5.總結
(1)變量查找順序: LEGB,作用域局部>外層作用域>當前模塊中的全局>python內置作用域;
(2)只有模塊、類、及函數才能引入新作用域;
(3)對于一一個變量,內部作用域先聲明就會覆蓋外部變量,不聲明直接使用,就會使用外部作用域的變量;
(4)內部作用域要修改外部作用域變量的值時,全局變量要使用global關鍵字,嵌套作用域變量要使用nonlocal關鍵字。nonlocal是python3新增的關鍵字,
有了這個關鍵字,就能完美的實現閉包了。
使用nonlocal關鍵字!它可以修改嵌套作用域(enclosing 作用域,外層非全局作用域)中的變量。
a=1
print('————a1————',id(a))defouter():
a=2
print('————a2————',id(a))definner():
a=3
print('————a3————',id(a))
inner()print("————a2————", id(a))
outer()print("————a1————", id(a))
————a1————1503749216————a2————1503749232————a3————1503749248————a2————1503749232————a1————1503749216
View Code
a = 10
deftest():
a+= 1
print(a)
test()
Traceback (most recent call last):
File"E:/NewPython/demo1_base.py", line 227, in test()
File"E:/NewPython/demo1_base.py", line 225, intest
a+= 1UnboundLocalError: local variable'a'referenced before assignment
為什么呢?
a+= 1相當于a = a + 1,按照賦值運算符的規則是先計算右邊的a+1。但是,Python的規則是,如果在函數內部要修改一個變量,那么這個變量需要是內部變量,除非你用global聲明了它是外部變量。很明顯,我們沒有在函數內部定義變量a,所以會彈出局部變量在未定義之前就引用的錯誤。
View Code
a=1
print('————a1————',id(a))defouter():
a=2
print('————a2————',id(a))definner():globala
a=3
print('————a3————',id(a))print('把最外面的全局變量的a改變了')
inner()print("————a2————", id(a))
outer()print("————a1是最外面的變量————", id(a))
————a1————1503749216————a2————1503749232————a3————1503749248把最外面的全局變量的a改變了
————a2————1503749232————a1是最外面的變量————1503749248
View Code
a=1
print('————a1————',id(a))defouter():
a=2
print('————a2————',id(a))definner():
nonlocal a
a=3
print('————a3————',id(a))
inner()print("————a2————", id(a))
outer()print("————a1是最外面的變量————", id(a))
————a1————1503749216————a2————1503749232————a3————1503749248————a2————1503749248————a1是最外面的變量————1503749216
View Code
6.遞歸調用
在python中,在函數內部,可以調用其他函數。如果在調用一個函數的過程中直接或間接調用自身本身,那其為遞歸調用。
注意:必須要有一個結束條件,不然就是死循環。
遞歸效率不高。
7.返回值————————————return
返回一個結果,當調用函數的時候就會返回return后面表達式的結果,那么就可以對這個返回結果進行任意的操作;
函數可返回任何類型的值,包括列表和字典等較復雜的數據結構;
return在函數里面相當于一個結束符號,代表函數到此為止;
小豬豬的特征:name
小豬豬的特征:age
小豬豬的特征:high
小豬豬的特征:wegth
{'first_name': '彭', 'feather': '二貨', 'last_name': '昌云', 'another_name': '傻逼'}################
{'last': '彭', 'age': '100', 'first': '小豬豬'}
{'last': '小哥哥', 'first': '烏克蘭小乳豬x'}
View Code
總結
以上是生活随笔為你收集整理的python 函数递归一次增加一次变量_python基础之函数、返回值,局部变量、全局变量,递归(继续补充不定长参数)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql安装报错 1130_关于Lin
- 下一篇: ubutun安装MySQL hive配置