1.函數(shù)的返回值
第一個(gè)案例:
# 求任意數(shù)的和
# 可以通過(guò)return 來(lái)指定函數(shù)的返回值
def fn(*nums):
# 定義一個(gè)變量來(lái)保存結(jié)果
result = 0
# 遍歷元組 并將元組中的元素累加
for n in nums:
result += n
# print(result)
return result
r = fn(1,2,3)
print(r+6)
- 返回值可以直接使用,也可以通過(guò)一個(gè)變量來(lái)接收函數(shù)返回值的結(jié)果。
第二個(gè)案例:
def fn():
# return 100
# return [1,2,3]
# return 1+1
def fn2():
print('python')
return fn2
r = fn()
r()
print(r)
- return后面可以跟任意的對(duì)象,甚至可以是一個(gè)函數(shù)。
第三個(gè)案例:
def fn2():
return
a = 10
r = fn2()
print(r)
- 如果僅僅寫一個(gè)return 或者 不寫return 則相當(dāng)于return None
第四個(gè)案例:
def fn3():
print('hello')
return
print('abc')
r = fn3()
- 在函數(shù)中 return后面的代碼都不會(huì)執(zhí)行, return 一旦執(zhí)行函數(shù)將自動(dòng)結(jié)束
第五個(gè)案例:return,break,continue 區(qū)別
def fn4():
for i in range(5):
if i == 3:
#break # 用來(lái)退出當(dāng)前循環(huán)
# continue # 用來(lái)跳過(guò)當(dāng)次循環(huán)
return # 用來(lái)結(jié)束函數(shù)
print(i)
print('循環(huán)結(jié)束')
fn4()
由結(jié)果我們看出:
- break 用來(lái)退出當(dāng)前循環(huán)
- continue 用來(lái)跳過(guò)當(dāng)次循環(huán)
- return 用來(lái)結(jié)束函數(shù)
第六個(gè)案例:fn 和 fn() 的 區(qū)別
def fn():
return 10
print(fn)
print(fn())
執(zhí)行結(jié)果分別是:
<function fn at 0x0000016C54C51268>
10
- fn 是函數(shù)對(duì)象 實(shí)際上在打印函數(shù)對(duì)象
- fn() 是在調(diào)用函數(shù) 實(shí)際上在打印fn()函數(shù)的返回值
2. 文檔字符串
- help() 可以查詢python 函數(shù)中的用法
- 語(yǔ)法 help(函數(shù)對(duì)象)
help(print)
def fn(a:int,b:str,c:bool) -> int:
'''
函數(shù)的參數(shù)
:param a: 作用 ....
:param b: 作用 ....
:param c: 作用 ....
:return: int
'''
return 10
help(fn)
3. 函數(shù)的作用域
作用域指的是變量生效的區(qū)域
- 在Python中有2種作用域
- 1 全局作用域
全局作用域在程序執(zhí)行時(shí)創(chuàng)建,在程序結(jié)束時(shí)銷毀;
所以函數(shù)以為的區(qū)域都是全局作用域;
在全局作用域中定義的變量,都屬于全局變量,全局變量可以在程序匯總的任意位置訪問(wèn);- 2 函數(shù)作用域
函數(shù)作用域在函數(shù)調(diào)用時(shí)創(chuàng)建,在調(diào)用結(jié)束時(shí)銷毀;
函數(shù)每調(diào)用一次就會(huì)產(chǎn)生一個(gè)新函數(shù)的作用域;
在函數(shù)作用域中定義的變量 都是局部變量,它只能在函數(shù)內(nèi)部被訪問(wèn);
示例代碼:
a = 20
b = 20
def fn():
a = 10 #a定義在函數(shù)內(nèi)部,所以它的作用域就是函數(shù)內(nèi)部,函數(shù)外部是無(wú)法訪問(wèn)的
print('函數(shù)內(nèi)部:','a =',a)
print('函數(shù)內(nèi)部:', 'b =', b)
fn()
# print('函數(shù)外部:','a =',a)
print('函數(shù)內(nèi)部:','b =',b)
3.1 通過(guò)global 關(guān)鍵字改變變量的作用域
a = 20
def fn2():
# 如果希望在函數(shù)內(nèi)部修改全局變量,則需要使用global關(guān)鍵字,來(lái)聲明變量
global a # 聲明在函數(shù)內(nèi)部的使用a是全局變量,此時(shí)在去修改a時(shí),就是修改全局變量
a = 10
print('函數(shù)內(nèi)部:','a =',a)
fn2()
print('函數(shù)外部:','a =',a)
4.命名空間
命名空間實(shí)際上就是一個(gè)字典,是一個(gè)專門用來(lái)存儲(chǔ)變量的字典
- 使用locals()來(lái)獲取當(dāng)前作用域的命名空間
- 如果在全局作用域中調(diào)用locals()函數(shù)則獲取全局作用域命名空間;
如果在函數(shù)作用域中調(diào)用locals()則獲取函數(shù)命名空間;
locals() 返回的就是一個(gè)字典
a = 1
b = 2
c = 3
s = locals() # 獲取當(dāng)前的命名空間
print(s)
print(a)
print(s['a']) # 就是s中一個(gè)一個(gè)的鍵值對(duì)
s['c'] = 200 #增加一個(gè)c的變量
print(s)
def fn4():
a = 10
s = locals() #在函數(shù)內(nèi)部調(diào)用locals()會(huì)獲取函數(shù)的命名空間
s['b'] = 20 # 可以通過(guò)s來(lái)操作函數(shù)的命名空間,但是不建議這么做
print(s['b'])
print(s)
fn4()
一般不建議用這種方法來(lái)定義和操作變量
5. 遞歸
遞歸式的函數(shù)
遞歸簡(jiǎn)單理解就是自己去調(diào)用自己
遞歸式函數(shù)就是在函數(shù)中調(diào)用自己
5.1 遞歸的作用
遞歸式解決問(wèn)題的一種方式
遞歸式函數(shù)的兩個(gè)條件
1.基線條件
問(wèn)題可以被分解成最小的問(wèn)題,當(dāng)滿足基線條件時(shí),遞歸不在執(zhí)行了
2.遞歸條件
將問(wèn)題繼續(xù)分解的條件
看個(gè)例子:
def fn2(n):
# 基線條件
if n == 1:
# 1的階乘是它本身
return 1
# 遞歸條件
return n * fn2(n-1)
print(fn2(10))
5.2 遞歸練習(xí)
- 1 創(chuàng)建一個(gè)函數(shù) 來(lái)為任意數(shù)做任意冪運(yùn)算
def fn4(n,i):
# 定義了一個(gè)函數(shù) 其中有2個(gè)參數(shù) n 要做冪運(yùn)算的數(shù)字 i 做冪運(yùn)算的次數(shù)
# 基線條件 冪為1
if i == 1:
return n
# 遞歸條件 2*2*2*2 = 16 2**4 2**3 2 ** 2
return n * fn4(n,i-1)
print(fn4(2,4))
- 練習(xí)二 創(chuàng)建一個(gè)函數(shù) 用來(lái)檢查任意的字符串是否是回文字符串,如果是返回True,不是返回False
# 回文字符串 字符串從后往前念和從前往后念是一樣的 abcba
# abcdefgfedcba
# 先檢查第一個(gè)字符和最后一個(gè)字符是否一致,如果不一致不是回文字符串
# 如果一致,則看剩余部分是否是回文字符串
# 檢查bcdefgfedcb 是不是回文
# 檢查cdefgfedc 是不是回文
# 檢查defgfed 是不是回文
# 檢查 efgfe是不是回文
# 檢查 fgf 是不是回文
# 檢查 g 是不是回文
def fn5(s):
# 這個(gè)函數(shù)就是檢查任意一個(gè)字符串是否是回文
# 參數(shù)s 就是我們要檢查的字符串
# 基線條件
if len(s) < 2:
# 字符串的長(zhǎng)度小于2 則這個(gè)字符串一定是回文
return True
elif s[0] != s[-1]:
# 第一個(gè)字符和最后一個(gè)字符不相等,不是回文
return False
# 遞歸條件
return fn5(s[1:-1])
print(fn5('abcdefgfedcba'))
6.高級(jí)函數(shù)
特點(diǎn):
1.接收一個(gè)或多個(gè)函數(shù)作為參數(shù)
2.將函數(shù)作為返回值返回
滿足任意一個(gè)特點(diǎn)就是高級(jí)函數(shù)
def fn(func,lst):
for n in lst:
if func(n):
new_list.append(n)
# 返回新的列表
return new_list
print(fn(fn4,l))
當(dāng)我們使用一個(gè)函數(shù)作為參數(shù)時(shí),實(shí)際上是將指定的代碼傳遞進(jìn)了目標(biāo)函數(shù),根據(jù)傳入的不同的函數(shù),就改變了實(shí)現(xiàn)的規(guī)則。