函數(shù)的返回值
1. 函數(shù)的返回值:
- a. 函數(shù)返回給調(diào)用者的值
- b. return關(guān)鍵字后面的表達式的值
- c. 函數(shù)調(diào)用表達式的值
python每個函數(shù)都有返回值,返回值就是return后面的值,如果沒有返回值,那么返回值就是None
1. return關(guān)鍵字
- a.將return后面的值返回給表達式
- b.結(jié)束函數(shù)
2. 函數(shù)調(diào)用表達式:
python中每個函數(shù)調(diào)用表達式都有值
def fun1():
print('aaa')
a = fun1() # 函數(shù)調(diào)用表達式
print(a, fun1())
def fun2(x, y):
print('bbb')
return x + y
num = fun2(1, 3)
print(fun2(1, 5))
case: 寫個函數(shù),判斷指定的年齡是否屬于成年人,返回結(jié)果
def isAdult(n):
:type n: int
:rtype: bool
if n >= 18:
return True
return False
if isAdult(20):
print('成年')
else:
print('未成年')
3. 函數(shù)的結(jié)束
- a.函數(shù)體執(zhí)行完
- b.遇到return
def fun3():
print('123')
return 1
print('666')
fun3()
case:寫一個函數(shù),下載指定地址敵營的數(shù)據(jù)
def download(url):
判斷是否有網(wǎng)絡
if 沒有網(wǎng):
return None
網(wǎng)絡請求
請求數(shù)據(jù)
保存數(shù)據(jù)
case: 一個函數(shù) 求1+2+3+...,和不能大于10000
def getSum():
i = 0
sum1 = 0
while True:
if sum1 + i >= 10000: # 如果sum1 下一次加上i大于10000,則返回 i-1
return i - 1, sum1 # python中函數(shù)可以有多個返回值,用逗號隔開,以元組類型返回
sum1 += i
i += 1
print(getSum())
函數(shù)的作用域
- 作用域:一個變量可以使用的范圍,就是這個變量的作用域(函數(shù)和類可以影響變量的作用域)
- 全局變量:從聲明開始,到文件結(jié)束都可以使用
- 局部變量:在函數(shù)(類)中聲明的變量是局部變量.作用域是聲明開始到函數(shù)結(jié)束
1.全局變量
a = 10 # 全局變量
print(a)
def fun1(a):
print(a)
for _ in range(3):
b = 20 # 全局變量
print(a)
print(b)
def fun2():
print(b)
fun2()
2.局部變量
def fun3():
aaa = 2 # 局部變量
# print(aaa) # 不可調(diào)用,報錯 NameError: name 'aaa' is not defined
3.global / nonlocal
- global: 在函數(shù)中創(chuàng)建全局變量或者聲明使用的是全局變量
- 格式:
global 變量名
變量名 = value
abc = 'abc' # 全局變量
bbb = 'bbb'
def fun4():
abc = 'aaa' # 聲明了一個局部變量叫abc,不會互相影響,函數(shù)體內(nèi)優(yōu)先使用局部變量
global bbb # 聲明使用全局變量 bbb 如果前面沒有聲明則新聲明一個
bbb = 100
print(abc, bbb)
fun4()
print(abc, bbb)
case: 聲明一個變量統(tǒng)計函數(shù)調(diào)用的次數(shù)
# global
count = 0
def fun5():
global count
count += 1
fun5()
fun5()
print(count)
# nonlocal
def fun6():
a1 = 10
print(a1)
# python中函數(shù)里面可以聲明函數(shù) 只能在該函數(shù)體中調(diào)用 外部無法調(diào)用
def fun61():
nonlocal a1
a1 = 100
print('333')
fun61()
print(a1)
fun6()
匿名函數(shù)
- 匿名函數(shù): 本質(zhì)還是函數(shù),以另一種簡單方式來聲明
- 匿名函數(shù)的聲明:
函數(shù)名 = lambda 參數(shù)列表 : 返回值 → 結(jié)果是一個函數(shù)變量
- lambda: 聲明匿名函數(shù)的關(guān)鍵字
case: 寫一個函數(shù)計算兩個數(shù)的和
def sum1(x, y):
return x + y
print(sum1(3, 6))
sum2 = lambda x, y: x + y
print(sum2(6, 3))
函數(shù)變量
聲明一個函數(shù)就是再聲明一個變量.函數(shù)名可以當成變量來使用,可以打印 可以賦值/查看類型/作為參數(shù)/作為返回值
a = 'a'
print(a)
# 函數(shù)名fun1可以當成變量使用
def fun1(a):
print(a)
return 10
print(fun1, type(fun1))
# 將函數(shù)fun1賦給變量a,這個時候a就是一個函數(shù)
a = fun1
b = fun1(10) + 100
a('aaa')
# 將函數(shù)fun1作為列表的元素
fun2 = [fun1]
fun2[0]('aaaa')
1.將函數(shù)作為參數(shù)
def getSum(num):
sum1 = 0
for i in num:
sum1 += i
return sum1
def getMul(*num):
mul = 1
for i in num:
mul *= i
return mul
def operation(method, *num):
return method(num)
相當于三目運算符
- 值1 if 條件 else 值2 → 判斷表達式是否為true,為true整個表達式的結(jié)果是'值1',否則是'值2'
res = operation(getSum, 1, 2, 3, 4, 5, 6)
# 判斷10是否大于20
# res = operation(lambda x, y: x > y, 10, 20)
# 判斷兩個數(shù)誰大
# res = operation(lambda x, y: x if x > y else y, 10, 20)
print(res)
3.將函數(shù)作為函數(shù)的返回值
case: 一個函數(shù)有個參數(shù),要求傳入一個運算符號(+,-,*,/,<,>),返回符號對應的功能 + → 求和功能
def getMethod(char):
if char == '+':
return lambda x, y: x + y
elif char == '-':
return lambda x, y: x - y
elif char == '*':
return lambda x, y: x * y
elif char == '/':
return lambda x, y: x / y
elif char == '<':
def fun(x, y):
return x < y
return fun
elif char == '>':
def fun(x, y):
return x > y
return fun
else:
def fun(*num):
return None
return fun
print(getMethod('-')(10, 20))
print(getMethod('+')(10, 20))
print(getMethod('*')(10, 20))
print(getMethod('/')(10, 20))
print(getMethod('<')(10, 20))
print(getMethod('>')(10, 20))
print(getMethod('?')(10, 20))
遞歸
1.什么是遞歸
- 遞歸函數(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.找出臨界值(跳出遞歸 → return)
- b.找關(guān)系:假設當前函數(shù)對應的功能已經(jīng)實現(xiàn),找到f(n)和f(n-1)的關(guān)系
- c.使用f(n-1)與f(n)的關(guān)系來實現(xiàn)f(n)的功能
# 遞歸示例
def fun1():
fun1()
fun1()
case: 寫一個遞歸實現(xiàn)1+2+3...+n
def getSum(n):
if n == 1:
return 1
else:
return getSum(n - 1) + n
print(getSum(10))
'''
getSum(n)
getSum(5): getSUm(4) + 5
getSum(4): getSUm(3) + 4
getSum(3): getSUm(2) + 3
getSum(2): getSUm(1) + 2
getSum(1): return 1
'''
case: 遞歸求246...n(n是偶數(shù))
def getMul(n):
if not n % 2:
if n == 2:
return 2
else:
return getMul(n - 2) * n
print(getMul(5))
case: 遞歸實現(xiàn)以下
'''
n = 3
***
**
*
n = 4
****
***
**
*
'''
def printStar(a):
if a == 1:
print('*')
return 0
else:
print('*'*a)
printStar(a-1)
# printStar(3)
def printStar2(a):
if a == 1:
print('*')
return 0
else:
printStar2(a-1)
print('*'*a)
printStar2(3)
作業(yè)
1.寫?個函數(shù)將?個指定的列表中的元素逆序(例如[1, 2, 3] -> [3, 2, 1])(注意:不要使?列表?帶的逆序函數(shù))
def backdrop(list1):
list2 = []
for i in range(0 - len(list1), 0):
list2.append(list1[i])
return list2
2.寫?個函數(shù),提取出字符串中所有奇數(shù)位上的字符
def getOddAlpht(str1):
str2 = 2
for i in range(len(str1)):
if i % 2:
str2 += str1[i]
return str2
3.寫?個匿名函數(shù),判斷指定的年是否是閏年
a = lambda n: bool(((not n % 4) and (n % 100))or(not n % 400))
print(lambda n: bool(((not n % 4) and (n % 100))or(not n % 400))(2011))
4.使?遞歸打印:

1.png
def printSign(n, space=0):
'''
:type n:int
:type space:int
:rtype:None
print(' ' * ? + '@' * (2 * n - 1))
n = 5 時
print(' ' * 0 + '@' * (2 * 5 - 1))
print(' ' * 1 + '@' * (2 * 4 - 1))
print(' ' * 2 + '@' * (2 * 3 - 1))
print(' ' * 3 + '@' * (2 * 2 - 1))
print(' ' * 4 + '@' * (2 * 1 - 1))
所以考慮增加一個默認值為0的參數(shù)
'''
if n == 1:
print(' ' * (space) + '@' * (2 * n - 1))
else:
printSign(n - 1, space + 1)
print(' ' * (space) + '@' * (2 * n - 1))
printSign(3)
5.寫函數(shù),檢查傳?列表的?度,如果?于2,那么僅保留前兩個?度的內(nèi)容,并將新內(nèi)容返回給調(diào)?者。
def getBoth(list1):
'''
:type list1:list
:rtype:list
'''
if len(list1) <= 2:
return list1
else:
del list1[len(list1) - 1]
getBoth(list1)
return list1
print(getBoth([1, 2, 3, 4, 5, 6]))
6.寫函數(shù),利?遞歸獲取斐波那契數(shù)列中的第 10 個數(shù),并將該值返回給調(diào)?者。
def getFibonacci10th(n1=1, n2=0, count=0):
'''
rtype:int
1 1 n1 = 1 n2 = 0 fn = n1+n2
2 1 n1 = n2 n2 = fn fn = n1+n2
3 2 n1 = n2 n2 = fn fn = n1+n2
4 3 n1 = n2 n2 = fn fn = n1+n2
5 5 n1 = n2 n2 = fn fn = n1+n2
6 8 n1 = n2 n2 = fn fn = n1+n2
7 13 n1 = n2 n2 = fn fn = n1+n2
8 21 n1 = n2 n2 = fn fn = n1+n2
9 34 n1 = n2 n2 = fn fn = n1+n2
10 55 n1 = n2 n2 = fn fn = n1+n2
'''
if count == 9:
n1 = 1
n2 = 0
fn = n1 + n2
return n1, n2, fn
else:
count += 1
n1, n2, fn = getFibonacci10th(n1, n2, count)
n1 = n2
n2 = fn
fn = n1 + n2
return n1, n2, fn
_, _, fn = getFibonacci10th()
print(fn)
7.寫?個函數(shù),獲取列表中的成績的平均值,和最?分
"""遞歸版調(diào)試中
def getScore(list2, i=0):
'''
0 4
1 5
2 6
3 1
4 2
5 3
'''
max1 = list2[0]
if i == len(list2) - 1:
return list2[i]
else:
sum1 = 0
i += 1
if max1 > list2[i]:
max1 = list2[i]
sum1 += getScore(list2, i)
return sum1 / len(list2), max1
avg, max1 = getScore([4, 5, 6, 1, 2, 3])
"""
def getScore(list2):
max1 = list2[0]
sum1 = 0
for i in list2:
sum1 += i
if max1 < i:
max1 = i
return max1, sum1 / len(list2)
max1, avg = getScore([4, 5, 6, 1, 2, 3])
print('平均值:', avg, '最大值:', max1)
8.寫函數(shù),檢查獲取傳?列表或元組對象的所有奇數(shù)位索引對應的元素,并將其作為新的列表返回給調(diào)用者
def getNewList(kwargs):
'''
:type kwargs:tuple/list
:rtype:list
'''
list3 = []
for index in range(len(kwargs)):
if index % 2:
list3.append(kwargs[index])
return list3
print(getNewList([1, 2, 3, 4, 5, 6]))