目錄
- 函數(shù)返回值
- 文檔字符串和help()
- 函數(shù)的作用域
- 命名空間
- 遞歸函數(shù)
1. 函數(shù)返回值
返回值就是函數(shù)執(zhí)行以后返回的結果
通過return來指定函數(shù)的返回值
return后面可以跟任意且不限于一個的對象,返回值甚至可以是一個函數(shù)
# 求任意數(shù)的和
def fn(*nums):
result = 0
for n in nums:
result += n
# print(result)
return result
print('我不會執(zhí)行')
r = fn(1,2)
在函數(shù)中 return后面的代碼都不會執(zhí)行,return一旦執(zhí)行函數(shù)自動結束
注意調用函數(shù)和函數(shù)對象的區(qū)別
def fn1():
return 100
print(fn1)
print(fn1())
-
fn1和fn1()的區(qū)別:
fn1是函數(shù)對象
fn1()是在調用函數(shù)
2. 文檔字符串和help()
- help()是Python中內置函數(shù),通過help()函數(shù)可以查詢Python中函數(shù)的用法
可以試著打印help(print)
摔认,即可查看print()
函數(shù)的更多神奇操作秘车。 - 在定義函數(shù)時蚌卤,可以在函數(shù)內部編寫文檔字符串(三個引號包圍的字符串)末早,文檔字符串就是對函數(shù)的說明
# 自定義函數(shù)
def fn(a, b, c):
"""
這個函數(shù)式一個文檔字符串的實例
參數(shù)
a:作用 類型 默認值......
b:作用 類型 默認值......
c:作用 類型 默認值......
"""
return 100
help(fn)
- 函數(shù)的作用域
Python 中啊片,程序的變量并不是在哪個位置都可以訪問的赎婚,訪問權限決定于這個變量是在哪里賦值的刘绣。
變量的作用域決定了在哪一部分程序可以訪問哪個特定的變量名稱。
所以作用域指的就是變量生效的區(qū)域
- Python的作用域一共有4種挣输,分別是:
? L(local):局部作用域纬凤,即函數(shù)中定義的變量;
? E(enclosing):嵌套的父級函數(shù)的局部作用域,即包含此函數(shù)的上級函數(shù)的局部作用域撩嚼,但不是全局的;
? G(global):全局變量停士,就是模塊級別定義的變量;
? B(build-in):內建作用域挖帘,系統(tǒng)固定模塊里面的變量,比如:int()等;
簡單介紹兩種:
- 全局作用域
? 全局作用域在程序執(zhí)行時創(chuàng)建恋技,在程序執(zhí)行結束時銷毀
? 所有函數(shù)以外的區(qū)域都是全局作用域
? 在全局作用域中定義的變量拇舀,都是全局變量,全局變量可以在程序的任意位置進行訪問 - 函數(shù)作用域
? 函數(shù)作用域在函數(shù)調用時創(chuàng)建蜻底,在調用結束時銷毀
? 函數(shù)每調用一次就會產生一個新的函數(shù)作用域
? 在函數(shù)作用域中定義的變量骄崩,都是局部變量,它只能在函數(shù)內部被訪問 - 函數(shù)作用域優(yōu)先級
局部作用域(L)>父級函數(shù)作用域(E)>全局作用域(G)>系統(tǒng)模塊(B)
注意:
? 如果在函數(shù)中修改全局變量薄辅,那么就需要使用global
進行聲明要拂,否則出錯
? 如果全局變量的名字和局部變量的名字相同,那么使用的是局部變量的站楚,小技巧強龍不壓地頭蛇
global
的本質:
1.在函數(shù)中不使用global聲明全局變量時不能修改全局變量的本質是不能修改全局變量的指向脱惰,即不能將全局變量指向新的數(shù)據(jù)。
2.對于不可變類型的全局變量來說窿春,因其指向的數(shù)據(jù)不能修改拉一,所以不使用global時無法修改全局變量。
3.對于可變類型的全局變量來說旧乞,因其指向的數(shù)據(jù)可以修改舅踪,所以不使用global時也可修改全局變量。
4. 命名空間
命名空間實際上就是一個字典良蛮,是一個專門用來存儲變量的字典
locals()用來獲取當前作用域的命名空間
如果在全局作用域中調用locals()則獲取全局命名空間,如果在函數(shù)作用域中調用locals()則獲取函數(shù)命名空間
返回值是一個字典
a = 20
def fn3():
global a
a = 50
print('函數(shù)內部:','a =',a)
s = locals()
print(s)
print(a)
print(s['a'])
5. 遞歸函數(shù)
遞歸是解決問題的一種方式悍赢,它的整體思想决瞳,是將一個大問題分解為一個個的小問題,直到問題無法分解時左权,在去解決問題
- 遞歸式函數(shù)有2個條件
1.基線條件 問題可以被分解為最小問題皮胡,當滿足基線條件時,遞歸就不執(zhí)行了
2.遞歸條件 可以將問題繼續(xù)分解的條件
遞歸簡單理解就是自己去引用自己
遞歸式函數(shù)即在函數(shù)中自己調用自己
無窮遞歸 類似于死循環(huán)
- eg:用遞歸的方式求任意數(shù)的階乘
# 用遞歸的方式求任意數(shù)的階乘
# 10赏迟!= 10 * 9屡贺!
# 9! = 9 * 8锌杀!
# 8甩栈! = 8 * 7!
# ....
# 1! = 1
def fn2(n):
# 參數(shù) n要求階乘的數(shù)字
# 1.基線條件
if n == 1:
# 1的階乘就是1 直接返回結果
return 1
# 2.遞歸條件
return n * fn2(n-1)
print(fn2(10))
- Q.思考一下,按照遞歸的特性,在編程中有沒有不得不使用遞歸的情況?
A:有糕再。例如漢諾塔,目錄索引(因為你永遠不知道這個目錄里邊是否還有目錄) , 快速排序(二十世紀十大算法之一)量没,樹結構的定義等如果使用遞歸,會事半功倍,否則會導致程序無法實現(xiàn)或相當難以理解突想。