目錄
? 1. 函數(shù)的返回值
? 2. 文檔字符串
? 3. 函數(shù)的作用域
? 4. 命名空間
? 5. 遞歸函數(shù)
1. 函數(shù)的返回值
? 返回值就是函數(shù)執(zhí)行以后返回的結(jié)果
? 通過(guò)return來(lái)指定函數(shù)的返回值
? return后面可以跟任意對(duì)象,返回值甚至可以是一個(gè)函數(shù)
def fn():
# return 100
# return 'python'
# return [1,2,3]
# return {'name':'張三'}
def fn2():
print('hello')
return fn2 #返回函數(shù)本身
r = fn()
print(r)
#<function fn.<locals>.fn2 at 0x000001D3338ACBF8>
print(fn())
#<function fn.<locals>.fn2 at 0x0000025DCF53CB70>
r()
# hello
- 如果僅僅寫(xiě)一個(gè)return,或者不寫(xiě)return,則相當(dāng)于return None
def fn2():
return
r = fn2()
print(r)
# None
- 在函數(shù)中 return后面的代碼都不會(huì)執(zhí)行,return一旦執(zhí)行函數(shù)自動(dòng)結(jié)束
#沒(méi)講return什么喳整,還是返回none
def fn3():
print('hello')
return
print('123')
r = fn3()
print(r)
# hello
# None
def fn3():
print('hello')
return
print('123')
r = fn3()
# print(r)
r
# hello
return v.s. break
def fn4():
for b in range(5):
if b == 3:
# break
return # 用來(lái)結(jié)束函數(shù)
print(b)
print('循環(huán)執(zhí)行完畢')
fn4()
# 0
# 1
# 2
def fn4():
for b in range(5):
if b == 3:
break
# return # 用來(lái)結(jié)束函數(shù)
print(b)
print('循環(huán)執(zhí)行完畢')
fn4()
# 0
# 1
# 2
# 循環(huán)執(zhí)行完畢
- fn5和fn5()的區(qū)別
fn5是函數(shù)對(duì)象 #print結(jié)果:func of f5...
fn5()是在調(diào)用函數(shù)
2. 文檔字符串
? help()是Python中內(nèi)置函數(shù)该园,通過(guò)help()函數(shù)可以查詢(xún)Python中函數(shù)的用法每篷。
? 在定義函數(shù)時(shí)篇裁,可以在函數(shù)內(nèi)部編寫(xiě)文檔字符串菲饼,文檔字符串(```)就是對(duì)函數(shù)的說(shuō)明让腹。
def fn(a:bool,b:int,c:str)->int: #對(duì)傳參&返回值格式有要求
'''
這個(gè)函數(shù)式一個(gè)文檔字符串的實(shí)例
參數(shù)
a:作用 類(lèi)型 默認(rèn)值......
b:作用 類(lèi)型 默認(rèn)值......
c:作用 類(lèi)型 默認(rèn)值......
'''
return 100
help(fn)
3. 函數(shù)的作用域
? 作用域(scope):變量生效的區(qū)域
- 在Python中一共有兩種作用域
全局作用域
? 全局作用域在程序執(zhí)行時(shí)創(chuàng)建远剩,在程序執(zhí)行結(jié)束時(shí)銷(xiāo)毀
? 所有函數(shù)以外的區(qū)域都是全局作用域
? 在全局作用域中定義的變量,都是全局變量骇窍,全局變量可以在程序的任意位置進(jìn)行訪問(wèn)
函數(shù)作用域
? 函數(shù)作用域在函數(shù)調(diào)用時(shí)創(chuàng)建民宿,在調(diào)用結(jié)束時(shí)銷(xiāo)毀
? 函數(shù)每調(diào)用一次就會(huì)產(chǎn)生一個(gè)新的函數(shù)作用域
? 在函數(shù)作用域中定義的變量,都是局部變量像鸡,它只能在函數(shù)內(nèi)部被訪問(wèn)
函數(shù)作用域可以從內(nèi)往外看活鹰,不能從外網(wǎng)內(nèi)調(diào)用
在函數(shù)內(nèi)部修改全局作用域 global 變量
def fn3():
# global a
a = 50
print('函數(shù)內(nèi)部:','a =',a)
fn3()
print('函數(shù)外部:','a =',a)
# 函數(shù)內(nèi)部: a = 50
# 函數(shù)外部: a = 20
def fn3():
# 如果希望在函數(shù)內(nèi)部修改全局變量,則使用global關(guān)鍵字,來(lái)聲明變量
# 聲明在函數(shù)內(nèi)部使用的變量a是全局變量,則此時(shí)在去修改a時(shí)只估,就是在修改全局變量
global a
a = 50
print('函數(shù)內(nèi)部:','a =',a)
fn3()
print('函數(shù)外部:','a =',a)
# 函數(shù)內(nèi)部: a = 50
# 函數(shù)外部: a = 50
4. 命名空間
? 命名空間實(shí)際上就是一個(gè)字典志群,是一個(gè)專(zhuān)門(mén)用來(lái)存儲(chǔ)變量的字典
? locals()用來(lái)獲取當(dāng)前作用域(函數(shù)/全局)的命名空間
? 如果在全局作用域中調(diào)用locals()則獲取全局命名空間,如果在函數(shù)作用域中調(diào)用locals()則獲取函數(shù)命名空間蛔钙。
def fn3():
global a
a = 50
print('函數(shù)內(nèi)部:','a =',a)
s = locals()
print(s)
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002179630B240>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/DELL/Desktop/基礎(chǔ)資料-第十講/課堂源碼/命名空間.py', '__cached__': None, 'a': 20, 'fn3': <function fn3 at 0x00000217946E1EA0>, 's': {...}}
s['c']=100 #在空間里新增一個(gè)鍵值對(duì)‘c’:100
print(c)
#100
- 在函數(shù)中用globals()獲取全局命名空間
def fn4():
# a = 10
# s = locals() # 獲取函數(shù)內(nèi)部的命名空間
# s['b'] = 20
# print(s)
global_s = globals()
global_s['a'] = 30 #修改全局變量
print(global_s)
fn4()
#{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000208D86AB240>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/DELL/Desktop/基礎(chǔ)資料-第十講/課堂源碼/命名空間.py', '__cached__': None, 'a': 30, 'fn4': <function fn4 at 0x00000208D85A1EA0>}
? 返回值是一個(gè)字典
5. 遞歸函數(shù)
? 遞歸是解決問(wèn)題的一種方式锌云,它的整體思想,是將一個(gè)大問(wèn)題分解為一個(gè)個(gè)的小問(wèn)題吁脱,直到問(wèn)題無(wú)法分解時(shí)桑涎,在去解決問(wèn)題。
e.g.求任意數(shù)的階乘
# 求任意數(shù)的階乘
def fn(n):
# 定義一個(gè)函數(shù)兼贡,儲(chǔ)存結(jié)果
result=n
for i in range(1,n):
n*=i
return result
print(fn(3))
- 遞歸簡(jiǎn)單理解就是自己去引用自己
- 遞歸式函數(shù)攻冷,在函數(shù)中自己調(diào)用自己
? 遞歸式函數(shù)有2個(gè)條件
? 1. 基線(xiàn)條件 問(wèn)題可以被分解為最小問(wèn)題,當(dāng)滿(mǎn)足基線(xiàn)條件時(shí)遍希,遞歸就不執(zhí)行了
? 2. 遞歸條件 可以將問(wèn)題繼續(xù)分解的條件
def fn2(n):
# 參數(shù) n要求階乘的數(shù)字
# 1.基線(xiàn)條件
if n == 1:
# 1的階乘就是1 直接返回結(jié)果
return 1
# 2.遞歸條件
return n * fn2(n-1)
print(fn2(10))
#3628800
# 10**6=10*10**5
def fn(i,k):
# 基數(shù)條件
if k==1:
return i
# 遞歸運(yùn)算
return i*fn(i,k-1) #i**(k-1)
print(fn(2,2))
找回文字符
def fn2(s):
# 參數(shù)s就是要檢查的字符串
# 1.基線(xiàn)條件
# 字符串的長(zhǎng)度小于2 則字符串一定是個(gè)回文
if len(s)<2:
return True
# # 第一個(gè)字符和最后一個(gè)字符不相同等曼,則一定不是回文字符串
elif s[0] != s[-1]:
return False
# 2.遞歸條件
return fn2(s[1:-1])
print(fn2('abcdefgfedcba'))