一.返回值的作用:
(1)返回值的作用,函數(shù)里面的數(shù)據(jù)傳遞到外面。
(2)要不要返回值:
就看產(chǎn)生了新的數(shù)據(jù)沒(méi)有,函數(shù)里面產(chǎn)生新的值,就需要返回值。
(3)初學(xué)著怎么確定需不需要返回值:
實(shí)現(xiàn)函數(shù)的功能完成后會(huì)不會(huì)產(chǎn)生新的數(shù)據(jù)。
(4)怎么確定返回值:
聲明函數(shù)的時(shí)候哦,return后面的值就是函數(shù)的返回值。默認(rèn)值是None
(5)return 是關(guān)鍵值,只能出現(xiàn)在函數(shù)體中,
(6)return 作用:確定函數(shù)的返回值,結(jié)束函數(shù)。執(zhí)行函數(shù)體的時(shí)候,如果遇到return函數(shù)直接結(jié)束,同時(shí)將return后面的值作為返回值。
(7)實(shí)例:
def pr():
print(111)
print(2222)
return #這個(gè)返回了值,函數(shù)結(jié)束,后面就不執(zhí)行了。
print(333)
(8)怎么獲取函數(shù)的返回值:
獲取函數(shù)調(diào)用的表達(dá)式就是函數(shù)的返回值。
函數(shù)調(diào)用的語(yǔ)句就叫函數(shù)表達(dá)式。
普通數(shù)據(jù)能做的事情,函數(shù)調(diào)用表達(dá)式都是可以做的。
(9)獲取函數(shù)的返回值
函數(shù)調(diào)用的表達(dá)式可以把值賦給變量。
(10)完整的函數(shù)的調(diào)用的過(guò)程:
執(zhí)行的過(guò)程:
1.先回到函數(shù)聲明的位置,
2.傳參,保證每個(gè)參數(shù)都有值,
3.執(zhí)行函數(shù)體,
4.確定返回值:執(zhí)行完函數(shù)體后有沒(méi)有遇到return,如果遇到了后面就是返回值,沒(méi)有遇到都是None
5.回到函數(shù)調(diào)用表達(dá)式的值才是返回值。
(11)內(nèi)存的變化:函數(shù)的調(diào)用的過(guò)程中系統(tǒng)會(huì)在棧中開辟一個(gè)獨(dú)立的內(nèi)存區(qū)間,專門用來(lái)保存在函數(shù)中聲明的變量和數(shù)據(jù),形參也是保存在棧的專用區(qū)間,單函數(shù)結(jié)束的時(shí)候內(nèi)存的空間會(huì)銷毀。
銷毀之前返回,返回值。
def hanshu(a, b):
c = a + b
return c
value_sum = hanshu(12, 13)
print(value_sum)
def hanshu(b):
print(b)
return b*2
a=hanshu(3)#這個(gè)函數(shù)會(huì)調(diào)用函數(shù)這種打印3,在打印返回值6
print(a)
def hanshu(a):
b=a
return b
print(hanshu([12].copy()))#copy這個(gè)函數(shù)就是有返回值的,而append()是沒(méi)有返回值的。如果是.append()就沒(méi)有返回值。
print(hanshu([12].append(12)))#copy這個(gè)函數(shù)就是有返回值的,而append()是沒(méi)有返回值的。如果是.append()就沒(méi)有返回值None
函數(shù)對(duì)列表,字典,字符串進(jìn)行操作的時(shí)候,如果這個(gè)函數(shù)本身是有返回值的,那么就是有返值
二。
1.變量的作用域,變量可以使用的范圍。
2根據(jù)變量聲明后使用的。范圍不一樣,分為全局,和局部。
(1)全局變量
沒(méi)有聲明在函數(shù)中的和列中的變量都是全局變量。
作用域:從聲明開始到文件結(jié)束任何地方都是可以使用的。
聲明在函數(shù)和類外面的都是全局變量。
a = 10
for x in range(a):
print(a)
def hanshu():
print(a)
hanshu()
for b in range(4): # b也是全局變量。
pass
(2)局部變量:聲明在函數(shù)中的變量就是局部變量。
作用域:聲明開始到函數(shù)結(jié)束(形參,聲明在函數(shù)中的變量)
(3)global和nonlocal
注意:這兩個(gè)關(guān)鍵字只能用于函數(shù)體中。
1.global 用于全局
如果在外面定義一個(gè)變量,在函數(shù)更改后,使用后,再出函數(shù)使用還是原來(lái)的變量
原因是:函數(shù)中那個(gè)并沒(méi)有改變外面的而是創(chuàng)建了一個(gè)和外面那個(gè)一樣的變量。
使用:在函數(shù)中給變量賦值前加: global 變量名 (然后 換行) 變量=值
作用:在函數(shù)聲明全局變量。
a1=100
def func():
a1=200
print(a1)----這個(gè)打印的是200
func()
print(a1)---這個(gè)打印的是100
```python
a1 = 100
def func():
global a1
a1 = 200
print(a1) #- ---這個(gè)時(shí)候是200
func()
print(a1) #- --這個(gè)也是200,global使用后就是全局的了。
a1 = 100
def func():
global a1
a1 = 200
print(a1) # - ---這個(gè)時(shí)候是200
func()
print(a1) # - --這個(gè)也是200,global使用后就是全局的了。
(2)nonlocal
使用的方法:在函數(shù)中變量賦值前加:nonlocal 變量名
作用:在函數(shù)的局部中修改局部的變量的值。
def func5():
a2=200
def func6():
#這里的a2必須在上層聲明過(guò)的
# nonlocal a2
a2=100
print(a2)#---這個(gè)還是打印的是
func6()
print(a2)
func5()
def outer():
num = 10
def inner():
nonlocal num # nonlocal關(guān)鍵字聲明
num = 100
print(num)
inner()
print(num)
outer()
三。匿名函數(shù)
匿名函數(shù)還是函數(shù),除了聲明的語(yǔ)法以外其他語(yǔ)法基本都適用于匿名函數(shù)
(1)聲明匿名函數(shù)
就相當(dāng)于
lambda 參數(shù)列表 :返回值
def (參數(shù)列表):
return 返回值
(2)說(shuō)明
lambda-關(guān)鍵字,固定的寫法
--形參:參數(shù)名1,參數(shù)名2
:---不產(chǎn)生縮進(jìn)。
返回值--相當(dāng)于普通函數(shù)中的return語(yǔ)句。
(3)用處 -- 功能簡(jiǎn)單就用
匿名函數(shù)的調(diào)用和普通的沒(méi)有區(qū)別。
func1 = lambda num1, num2: num2 + num1
print(func1(12, 23))
func2 = lambda a, b, c: print(a, b, c)
fun3 = lambda *nums: sum(nums)
print(fun3(4))
注意不支持類型的說(shuō)明。
練習(xí):寫一個(gè)匿名函數(shù)判斷的是否是閏年
func5 = lambda year: (year % 400 == 0) or (year % 400 == 0 and year % 100 != 0)
print(func5(2018))
四。
聲明函數(shù)的時(shí)候調(diào)用函數(shù)本身,這樣的函數(shù)就是遞歸函數(shù)
遞歸可以使用循環(huán)的效果。
原則上除了死循環(huán),其他的循環(huán)遞歸都可以實(shí)現(xiàn)
ef func1():
print("=========")
func1()
func1()
2.遞歸怎么用:
"""
遞歸的套路:
a.設(shè)置臨界值--循環(huán)結(jié)束的條件(保證函數(shù)結(jié)束)
b.找關(guān)系-----找f(n)和f(n-1)的關(guān)系。
c.假設(shè)函數(shù)的功能已經(jīng)實(shí)現(xiàn),通過(guò)f(n-1)去實(shí)現(xiàn)f(n)的功能。
"""
遞歸函數(shù)計(jì)算1+2+3..100
def ytsum(n):
if n==1:
return 1
# 找關(guān)系
#用f(n-1)實(shí)現(xiàn)f(n)的功能。
# f(n)1+2+3....100
# f(n-1)1+2+3+....(n-1)
return ytsum(n-1)+n
print(ytsum(900))
遞歸求斐波那契:
def fibo(n):
"""遞歸函數(shù)
輸出斐波那契數(shù)列"""
if n == 1 or n==2 :
return n
else:
return(fibo(n-1) + fibo(n-2))
print(fibo(9))
練習(xí)
def f(n):
if n==1:
print("*")
return
#關(guān)系:實(shí)現(xiàn)f(n-1)的功能后再打印N顆星
else:
f(n-1)
print(n*"*")