一叉谜、函數(shù)的返回值
1.函數(shù)的返回值:
a.就是函數(shù)返回給調(diào)用者的值
b.就是return關(guān)鍵字后面的表達式的值
c.就是函數(shù)調(diào)用表達式的值
python中每個函數(shù)都是有返回值的旗吁,返回值就是return后面的值,如果函數(shù)中沒有return停局,name函數(shù)返回值就是None很钓。
函數(shù)的調(diào)用:
a.先回到函數(shù)調(diào)用的位置
b.用實參給形參賦值(傳參)
c.執(zhí)行函數(shù)體
d.執(zhí)行完函數(shù)體,將返回值返回給函數(shù)調(diào)用表達式
e.回到函數(shù)調(diào)用的位置
2.return關(guān)鍵字
a.將return后面的值返回給函數(shù)調(diào)用表達式
b.結(jié)束函數(shù)
3.函數(shù)調(diào)用表達式
python中每個函數(shù)調(diào)用表達式都是有值的()
def func1():
print('aaaa')
a = func1() #函數(shù)調(diào)用表達式
print(a,func1())
def my_sum(a,b):
#a=11,b=22
return a+b #return 33
print(my_sum(11,22))
結(jié)果
aaaa
aaaa
None None
33
練習:寫一個函數(shù) 判斷指定的年齡是否成年
def is_age(age):
if age>=18:
return True
else:
return False
if is_age(10):
print('可以去網(wǎng)吧')
else:
print('未成年人禁止進入')
結(jié)果
未成年人禁止進入
3.函數(shù)的結(jié)束
函數(shù)體執(zhí)行完
遇到return
def func2():
print('213')
return 10
print('321')
print(func2())
結(jié)果
213
10
寫一個函數(shù)董栽,下載指定地址對應的數(shù)據(jù)
def download(ur1):
判斷有沒有網(wǎng):
if 沒有網(wǎng)
return
寫網(wǎng)絡(luò)請求
請求數(shù)據(jù)
保存數(shù)據(jù)
練習:寫一個函數(shù)码倦,功能是求1+2+...和不能大于10000
def my_sum():
sum1 = 0
number = 1
while True:
if sum1+number> 10000:
return sum1,number-1 #python中函數(shù)可以<br/>
#有多個返回值,每個值用逗號隔開锭碳,返回值是一個元組
sum1 += number
number += 1
print(my_sum())
結(jié)果
(9870, 140)
二袁稽、函數(shù)的作用域
作用域:一個變量可以使用的范圍,就是這個變量的作用域
全局變量:從聲明開始擒抛,到文件結(jié)束都可以使用
局部變量:在函數(shù)(類)中聲明的變量是局部變量推汽。作用域是從聲明開始到函數(shù)結(jié)束
1.全局變量
a = 10 #這是一個函數(shù)變量
print(a)
def func1():
print(a)
for x in range(2):
b= 100 #這個變量是全局變量
print(a)
2.局部變量
def func3():
aaa = 100 #局部變量
print(aaa)
func3()
#print(aaa) 報錯NameError:
結(jié)果
100
3.global和nonlocal
global:在函數(shù)中創(chuàng)建一個全局變量
格式:
gloabl 變量名
變量名 = 值
print('===========')
abc = 'abc' #全局變量
bcd = 'bcd'
def func4():
abc = 'aaa' #局部變量,如果全局變量名和局部變量相同歧沪,函數(shù)中使用的是局部變量
print(abc)
global bcd #說明bcd是一個全局變量
bcd = 200
print(bcd)
func4()
print(abc)
print(bcd)
結(jié)果
===========
aaa
200
abc
200
聲明一個變量歹撒,統(tǒng)計一個函數(shù)調(diào)用的次數(shù)
count =0
def my_func():
global count
count +=1
print('===')
my_func()
my_func()
print(count)
結(jié)果
===
===
2
nonlocal在函數(shù)中聲明函數(shù)的時候,才需要使用
def func4():
a1 =10
print(a1)
#python中函數(shù)里面可以聲明函數(shù)
def func5():
nonlocal a1
a1 = 100
print('內(nèi)部',a1)
print('內(nèi)部函數(shù)')
func5()
print('外部',a1)
func4()
結(jié)果
10
內(nèi)部 100
內(nèi)部函數(shù)
外部 100
三诊胞、匿名函數(shù)
匿名函數(shù):本質(zhì)還是函數(shù)暖夭,以另外一種簡單的方式來聲明
匿名函數(shù)的聲明:
lambda 參數(shù)列表:返回值 --->結(jié)果是一個函數(shù)
lambda:聲明匿名函數(shù)的關(guān)鍵字
寫一個函數(shù)計算兩個數(shù)的和
def my_sum1(x,y):
return x+y
print(my_sum1(10,20))
my_sum2 = lambda x,y:x+y
print(my_sum2(15,25))
結(jié)果
30
40
funcs =[]
for i in range(5):
funcs.append(lambda x:x*i)
print(funcs[2](2))
print(funcs[4](2))
結(jié)果
8
8
四、函數(shù)作為變量
聲明一個函數(shù)就是在聲明一個變量厢钧。函數(shù)名可以當成變量來使用鳞尔。.類型為function(函數(shù))
可以打印、可以賦值早直、可以查看類型寥假、可以作為函數(shù)的參數(shù)、可以作為函數(shù)的返回值
a = 10
a = 'a'
print(a)
#函數(shù)名func1可以當成變量使用
def func1(a):
print(a)
return 10
print(func1,type(func1))
#將函數(shù)func1賦給變量a霞扬,這個時候a就是一個函數(shù)
a = func1
b = func1(10)+100
a('===')
#將函數(shù)func1作為列表的元素
functions = [func1]
functions[0]('abc')
結(jié)果
10
===
abc
1.將函數(shù)作為參數(shù)
def my_sum(*number):
sum1 = 0
for item in number:
sum1 += item
return sum1
def my_mu1(*numbers):
sum1 = 1
for item in numbers:
sum1 *= item
return sum1
def operation(method,x,y):
return method(x,y)
#求10和20的和
result = operation(my_sum,10,20)
result1 = operation(my_mu1,10,20)
#判斷10是否大于20
result2 = operation(lambda x,y:x>y,10,20)
#找出兩個數(shù)中的最大值
result3 = operation(lambda x,y:x if x>y else y,10,20)
print(result,result1,result2,result3)
結(jié)果
30 200 False 20
python中三目運算符
值1 if 表達式 else 值2 --->判斷表達式是否為True糕韧,為True整個表達式的結(jié)果是’值1‘枫振,否則是值2
3.將函數(shù)作為函數(shù)的返回值
寫一個函數(shù)有一個參數(shù)要求傳入一個運算符號(+、-萤彩,>)粪滤,返回符號對應的功能
print('===========')
def my_sum(*number):
sum1 = 0
for item in number:
sum1 += item
return sum1
def my_mu1(*numbers):
sum1 = 1
for item in numbers:
sum1 *= item
return sum1
def get_method(way,*numbers):
if way == '+':
return my_sum
elif way == '-':
return lambda x,y:x-y
elif way == '*':
return my_mu1
elif way == '>':
return lambda x,y:x>y
elif way == '<':
return lambda x,y:x<y
else:
def func(x,y):
return None
return func
print(get_method('+')(10,20))
print(get_method('*')(10,20))
結(jié)果
30
200
五遞歸函數(shù)
1.什么是遞歸
遞歸函數(shù):在函數(shù)的函數(shù)體中調(diào)用函數(shù)本身
理論上循環(huán)能做的事情,遞歸都可以做
對遞歸的要求:能不用就不用
函數(shù)調(diào)用的過程是一個壓棧的過程(每調(diào)用一次函數(shù)雀扶,系統(tǒng)都要為其分配內(nèi)存空間杖小,
用來存儲函數(shù)中聲明變量和參數(shù),這個內(nèi)存在函數(shù)調(diào)用結(jié)束后自動銷毀)
2.怎么寫一個遞歸函數(shù)
a.找臨界值(跳出循環(huán)-->return)
b.找關(guān)系:假設(shè)當前函數(shù)對應的功能已經(jīng)實現(xiàn)愚墓,找到f(n)和f(n-1)的關(guān)系
c.使用f(n-1)與前面找到的關(guān)系去實現(xiàn)f(n)的功能
#這個函數(shù)就是遞歸函數(shù)
# def func1():
# print('====')
# func1()
# func1()
寫一個遞歸函數(shù):1+2+3+4+予权。。+n
def my_sum1(n):
#第一步找臨界值
if n == 1:
return 1
#第二步找my_sum1(n)和my_sum1(n-1)d的關(guān)系
#3.使用my_sum1(n-1)去實現(xiàn)my_sum1(n)的功能
return my_sum1(n-1)+n
print(my_sum1(10))
結(jié)果
55
用遞歸求246*...
def my_sum2(n):
if n == 2:
return 2
return my_sum2(n-2)*n
print(my_sum2(4))
結(jié)果
8
def copy(n):
if n == 1:
print('*')
return None
#先打印n個*浪册,然后f(n-1)
print('*'*n)
copy(n-1)
copy(4)
def copy(n):
if n == 1:
print('*')
return None
#先打印n個*扫腺,然后f(n-1)
copy(n - 1)
print('*'*n)
copy(4)
結(jié)果
****
***
**
*
*
**
***
****