1、函數的返回值
python 中每個函數都有返回值。
a.有return:return后面的值
b.沒有return:返回值為None
注:python中每個函數調用表達式的都是有值
return:關鍵字
作用:
a.將return后面的值,返回給函數調用表達式
b.結束函數
函數的調用:
a. 先回到函數調用的位置
b. 用實參給形參賦值(傳參)
c. 執(zhí)行函數體
d. 執(zhí)行完函數體,將返回值返回給函數調用表達式
c. 回到函數調用的位置
練習:寫一個函數,求1+2+3+...+N,和不能大于10000
def my_sum2():
sum1 = 0
number = 1
while True:
if sum1 + number >= 10000:
return sum1, number-1
# python中函數可以有多個返回值,在return后面返回多個值,每個值之間用逗號隔開。返回值是一個元祖
sum1 += number
number += 1
print(my_sum2())
2、作用域
作用域:一個變量可以使用的范圍,就是這個變量的作用域(函數和類可以影響變量的作用域)
全局變量: 從聲明開始,到文件結束都可以使用
局部變量: 在函數(類)中聲明的變量是局部變量。作用域是從聲明開始到函數結束
global: 在函數中聲明一個全局變量
格式:
global 變量名
變量名 = 值
練習:聲明一個變量,統(tǒng)計一個函數調用的次數
count = 0
def my_func():
global count
count += 1
print('====')
my_func()
my_func()
print('0----')
a = 10
my_func()
print(count)
輸出:====
====
0----
====
3
nonlocal:在函數中聲明函數的時候,才需要使用
def func11():
a_11 = 10
print('外部:', a_11)
# python中函數里面可以聲明函數
def func12():
nonlocal a_11 # 使用nonlocal修飾后的變量還是局部變量
a_11 = 100
print('內部:', a_11)
print('內部函數')
func12()
print('外部:', a_11)
輸出:
外部: 10
內部: 100
內部函數
外部: 100
3、匿名函數
匿名函數:本質是函數,以另外一種簡單的方式來聲明
匿名函數的聲明:
函數名 = lambda 參數列表:返回值 ---> 結果是一個函數變量
lambda:關鍵字
寫一個函數計算兩個數的和
my_sum2 = lambda x, y=10: x+y
print(my_sum2(10, 20))
輸出:30
調用函數表達式才會執(zhí)行函數體
for i in range(5):
funcs.append(lambda x: x*i)
"""
i = (0, 1, 2, 3, 4)
i = 0
[lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i,lambda x:x*i]
"""
# 4? 8?
# 6? 10?
# lambda 2:2*4
print(funcs[2](2))
print(funcs[4](2))
print(i)
輸出:8
8
4
4、函數作為變量
聲明一個函數就是在聲明一個變量。
函數名可以當成變量來使用。類型是:function
可以打印,可以賦值,可以查看類型,可以作為函數的參數,可以作為函數的返回值。
函數名func1可以當成變量使用
def func1(a):
print(a)
return 10
print(func1, type(func1))
輸出:<function func1 at 0x0074BAE0> <class 'function'>
python中三目運算符(?:)
值1 if 表達式 else 值2 ---> 判斷表達式是否為True,為True整個表達式的結果是'值1',否則是'值2'
5.遞歸函數
1.什么是遞歸
遞歸函數:在函數的函數體中調用函數本身
理論上循環(huán)能做的事情,遞歸都可以
對遞歸的要求: 能不用就不用
函數調用的過程是一個壓棧的過程(沒調用一次函數,系統(tǒng)都要為其分配內存空間,
用來存儲函數中聲明變量和參數等,這個內存在函數調用結束后會自動銷毀)
2.怎么寫一個遞歸函數
a.找臨界值(跳出循環(huán) -> return)
b.找關系:假設當前函數對應的功能已經實現(xiàn),找到f(n)和f(n-1)的關系
c.使用f(n-1)與前面找到關系去實現(xiàn)f(n)的功能
寫一個遞歸函數實現(xiàn):1+2+3+...n
def my_sum2(n):
# 1.找到臨界值
if n == 1:
return 1
# 2.找my_sum2(n)和my_sum2(n-1)的關系:
"""
my_sum2(n): 1+2+3+...+n-1+n
my_sum2(n-1): 1+2+3+...+n-1
關系: my_sum2(n) = my_sum2(n-1)+n
"""
# 3.使用my_sum2(n-1)去實現(xiàn)my_sum2(n)的功能
return my_sum2(n-1)+n
print(my_sum2(5))
"""
my_sum2(5)
my_sum2(5) n = 5 return 1+2+3+4+5
my_sum2(4) n = 4 return 1+2+3+4
my_sum2(3) n = 3 return 1+2+3
my_sum2(2) n = 2 return 1+2
my_sum2(1) n = 1 return 1
"""