函數(shù)的返回值
a.就是返回給使用者的值
b.就是return后面的值
c.就是函數(shù)調(diào)用表達式的值
python中每個函數(shù)都有返回值,返回值就是return后面的值,如果函數(shù)中沒有return,那么函數(shù)的返回值為None
1.函數(shù)調(diào)用
在存在return時在執(zhí)行完函數(shù)體后,將返回值返回給函數(shù)調(diào)用表達式,然后回到函數(shù)調(diào)用的位置
2.return關(guān)鍵字
將renturn后面的值返回給函數(shù)調(diào)用表達式
函數(shù)調(diào)用表達式:python中每個函數(shù)調(diào)用表達式都有值
def f1(a):
print(a)
f1('a')
print(f1('a'))
# 練習(xí):寫個函數(shù),判斷指定的年齡是否屬于成年人(結(jié)果返回)
def is_adult(age):
if age >= 18:
return True
return False
print(is_adult(30))
if is_adult(10):
print('可以進網(wǎng)吧')
else:
print('未成年人禁止進入')
person = {'name':'jack','is_adult':is_adult(30)}
print(person)
3.函數(shù)的結(jié)束
a.函數(shù)執(zhí)行完
b.遇到return
def fun2():
print('123')
return 10
print('333')
print(fun2())
# 練習(xí) 寫一個函數(shù),求1+2+3+......,和不能大于10000
def sum_limit(a):
sum1 = 0
x = 1
while True:
if sum1 + x >= a:
return sum1,x-1
sum1 += x
x += 1
print(sum_limit(10000),type(sum_limit(10000)))
注:python中函數(shù)可以由多個返回值,在return后面返回多個字,每個值之間用逗號隔開,返回為元組
作用域
全局變量:文件開始到結(jié)束都能使用
局部變量:開始于函數(shù)聲明,結(jié)束于函數(shù)聲明
1.全局變量
a=10 #這是一個全局變量
print(a)
def func1():
print(a)
for x in range(10):
b=100#這是一個全局變量
print(a)
print(b)
2.局部變量
def func3():
aaa=100#局部變量
print(aaa)
3.global和nonlocal
- global:在函數(shù)中創(chuàng)建一個全局變量
格式:
global 變量名
變量名=值
bcd='bcd'
abc='abc'#全局變量
def func4():
abc='aaa'#局部變量,如果全局變量名和全局變量名相同,在函數(shù)中使用的是局部變量
print(abc)
global bcd #說明bcd是一個全局變量
bcd=200
print(bcd)
func4()
print(abc)
print(bcd)
#聲明一個變量 統(tǒng)計一個函數(shù)調(diào)用的次數(shù)
count=0
def my_func():
global count
count+=1
print('==========')
my_func()
my_func()
my_func()
print(count)
- nonlocal :在函數(shù)中聲明函數(shù)的時候才需要使用
def func11():
a_11=10
print(a)
#python中函數(shù)中可以聲明函數(shù)
def func12():
nonlocal a_11
a_11=100
print('內(nèi)部',a_11)
print('內(nèi)部函數(shù)')
func12()
print('外部',a_11)
匿名函數(shù)
本質(zhì)還是函數(shù),以另外一種簡單的方式來聲明
匿名函數(shù)的聲明:
函數(shù)名 = lambda 參數(shù)列表:返回值 --> 結(jié)果是一個函數(shù)變量
lambda 是聲明匿名函數(shù)的關(guān)鍵字
# 寫一個函數(shù),計算2個數(shù)的和
my_sum1 = lambda a,b:a+b
print(my_sum1(1,2))
funcs = []
for i in range(5):
funcs.append(lambda x:x*i)
print(funcs[2](2)) # 8
print(funcs[4](2)) # 8
函數(shù)作為變量
聲明一個函數(shù)就是在聲明一個變量
1.函數(shù)名可以當成變量來使用
2.可以打印,可以賦值,可以查看,一般對于變量的操作都能對函數(shù)進行
# 函數(shù)名func1可以當做變量使用
def func1(a):
print(a)
return 10
print(func1,type(func1))
a = func1
b = func1(10) + 100
a('aaa')
# 將函數(shù)func1作為列表的元素
functions = [func1,func1(10)]
functions[0]('abc')
1.將函數(shù)作為參數(shù)
def my_sum(*number):
sum1 = 0
for item in number:
sum1 += item
return sum1
def my_mul(*number):
sum1 = 1
for item in number:
sum1 *= item
return sum1
def operation(x,y,method = ''):
try:
return method(x,y)
except:
return False
print(operation(3,6,my_sum))
python中的三目運算符
值1 if 判斷表達式 else 值2--> 判斷表達式是否為True,為True整個表達式的結(jié)果是'值1',否則是'值2'
a = 10 if 10 > 20 else 20
result1 = operation(10,20,my_sum)
result2 = operation(10,20,my_mul)
result3 = operation(10,20,lambda x,y:x<y)
result4 = operation(10,20,lambda x,y:x if x>y else y)
print(result1,result2,result3,result4)
2.將函數(shù)作為函數(shù)的返回值
# 寫一個函數(shù)有一個參數(shù),要求傳入一個運算符號(+,-,*,>,<),返回符號對應(yīng)的功能
# + --> 求和功能
def sum1(*number):
sumx = 0
for item in number:
sumx += item
return sumx
# - --> 求差功能
def sum2(*number):
sumx = number[0]*2
for item in number:
sumx -= item
return sumx
# * --> 求乘功能
def sum3(*number):
sumx = 1
for item in number:
sumx *= item
return sumx
# 程序編碼:
def operation_char(char):
if char == '+':
return sum1
elif char == '-':
return sum2
elif char == '*':
return sum3
else:
return lambda *number:None
print(operation_char('+')(10,20))
print(operation_char('-')(10,20))
print(operation_char('*')(10,20))
print(operation_char('i')(10,20))
遞歸函數(shù)
1.什么是函數(shù)
在函數(shù)的函數(shù)體中調(diào)用函數(shù)本身
循環(huán)能做的事情理論上遞歸都可以做
2.怎么寫一個遞歸函數(shù)
a.找臨界值(跳出循環(huán) -> return)
b.找關(guān)系:假設(shè)當前函數(shù)對應(yīng)的功能已經(jīng)實現(xiàn),找到f(n)和f(n-1)的關(guān)系
c.使用f(n-1)與前面找到的關(guān)系去實現(xiàn)f(n)的功能
# 計算1+...+n:
def sum1(n):
if n == 1:
return 1
return n+sum1(n-1)
print(sum1(10))
# 用遞歸求2*4*6...n:
def sum2(n):
if n == 2:
return 2
return n*sum2(n-2)
print(sum2(8))
# 遞歸打印圖案
'''n=3
***
**
*
'''
def gh(n):
if n < 1:
return
print('*'*n)
gh(n-1)
gh(4)
注:1.對遞歸的要求:能不用就不用。2.函數(shù)調(diào)用的過程是一個壓棧的過程(沒調(diào)用一次函數(shù),系統(tǒng)都要為其分配內(nèi)存空間,用來存儲函數(shù)中聲明變量和參數(shù)等,這個內(nèi)存在函數(shù)調(diào)用結(jié)束后會自動銷毀)