文章目錄
思維導圖
一、函數的基本概念
1.函數用法和底層分析
函數是可更用的程序代碼塊。函數的作用,不僅可以實現代碼的複用,更能實現代碼的一致性。一致性指的是,只要修改函數代碼,則所有調用該函數的地方都能得到體現。
(在編寫函數時,函數體中的代碼寫法和我們的面達的基本一致,只是對代碼實現了封裝,並增加了函故調用、傳遞參數、返回計算結果等內容。)
2.函數簡介
①函數的基本概念
1.由一個個程序一個個任務組成;函數就是代表一個任務或一個功能
2.函數是代碼複用的通用機制。
②Python 函數的分類
Python 中函技分爲如下幾類:
- 內置函數
str().list(). len()等都是內置函數,可以拿來真接使用,
- 標準庫函數
可以通確過 import 語句導入庫,然後使用其中定義的函教
- 第三方庫函數
Python社區也提供了很多高質量的庫。下安裝這些後,通過 import 語句導入,然後可以使用這些第三方庫的函數
- 用戶自定義函數
用戶自己義的函數,顯然也是開發中話應用戶自身需求定義的函數。
二、函數的定義和調用
1.核心要點
①語法
Python 中,定義函數的語法如下:
def 函數名([參數列表]):
“文檔字符串”
函數體
②要點
- 我們使用def來定義函數,然後就星一個空格和函教名稱;
(1) Python執行def 時,會創一個函數對象,並綁定到函數名變量上。
- 參數列表
(1) 圈括號內是形式參數列表,有多個參技數則使用逗號隔開
(2) 形式參數不需要聲明類型,也不需要指定函數返回值類型
(3)無參數,也必須保留空的括號
(4實參列表必須與形參列表一一對應
- return返回值
(1) 如果函數體中包含return語句,則略束函教執行井返回值
(2)如果函數體中不包含return語句,則回None 值。
- 調用函數之前,必須先定義函數,即先調def 創建函數對象
(1) 內置函數對象會自動創建
(2 標準庫和第三方庫函數,通過 import導入模塊時,會執行模塊中的def 語句
- 試驗:
def test():
print('*'*5)
print(id(test))
print(type(test))
print(test) #打印對象的value
print(test()) #執行函數體,返回None
test()
>>>
2523548717416
<class 'function'>
<function test at 0x0000024B8F399168>
*****
None
*****
2.形參和實參
(1) 括號內是形式參數列表,有多個參數則使用逗號隔開
(2) 形式參數不需要聲明類型,也不需要指定函數返回值類型
(3)無參數,也必須保留空的括號
(4)調用函數時,傳遞的參數爲“實際參數”,實參列表必須與形參列表一一對應
(5)形式參數命名規則要符合“標識符”命名規則
- 試驗:定義一個函數,實現比較功能,返回較大值
def compare(a,b): #a和b爲形式參數
if a>b:
return a
else:
return b print(compare(2,3)) #2和3爲實際參數
三、文檔字符串(函數的註釋)
程序的可讀性晨理要,一般建議在函數體開始的部分附上函數定義說明,這就是“文檔字符串”,也有人成爲“函數的註釋”。可以通過三個單引導或者三個雙引號來實現,中間可以加入多行文字進行說明。
- 試驗:
def star(n):
"根據傳入的n,打印多個星號"
print("*"*n)
help(star)
>>>
Help on function star in module __main__:
star(n)
根據傳入的n,打印多個星號
help(star.__doc__)
>>>
No Python documentation found for '根據傳入的n,打印多個星號'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
調用help(函數名.doc), 可以打印函數的文檔符串。
四、返回值
return返回值要點
1.如果函數體中包return 語句,則結束函數執行並返回值
2.如果函數體中不包含return 語句,則返回None 值。
3.要返回多個返回值,使用表,元組,字典、集合將多個值 “存起來”。
- 試驗:定義一個返回兩個數平均值的函數
def ave(m,n):
'''計算傳入的m,n的平均值'''
a=(m+n)/2
return a
print(ave(9,10))
>>> 9.5
五、變量的作用域(全局變量、局部變量)
變量起作用的範圍稱爲變量的作用域,不同作用域內同名變量之間互不影響。變量分爲:全局變量、局部變量。
1.全局變量
- 在函數和類定義之外聲明的變量。作用域爲定義的模塊,從定義位置開始到模塊結束
- 全局變量降低了函數的通用性和可讀性。應儘量免全同變量的使用。
- 全局變量一般做常量使用。
- 函數內要改變全局變量的值,使用global 聲明一下
2.局部變量
-
在函數體中(包合形式參數)聲明的變量。
-
局部變量的引用比全局變量快,優先考慮使用。
-
如果局部變量和全局變量同名,則在函數內隱藏全局變量,只使用同名的局部變量
-
試驗:全局變量作用域;局部變量與全局變量同名
a=100 #全局變量 def f1():
global a #函數內要改變全局變量的值,使用global 聲明一下
print(a) #打印全局變量a
a=300 #局部變量與全局變量同名
f1() print(a)
>>> 100 300
- 試驗:輸出全局變量和局部變量
a=100
def f1(a,b,c):
print(a,b,c)
print(locals())
print("*"*10)
print(globals())
f1(2,3,4)
>>>
2 3 4
{'a': 2, 'b': 3, 'c': 4}
**********
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001B4120B5A08>,
'__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/PycharmProjects/untitled4/shiyan.py',
'__cached__': None, 'a': 100, 'f1': <function f1 at 0x000001B4122C9168>}
3.局部變量和全局變量的效率測試
局部量的查詢訪問速度比全局變量快,優先考慮使用,尤其是在循環的時候。
在特別強調效率的地方或循環次數較多的地方 可以通過將全局變量轉爲局部交量提高運行速度
import math
import time
def test1():
start=time.time()
for i in range(10000000):
math.sqrt(30)
end=time.time()
print("用時{0}".format((end-start)))
def test2():
b=math.sqrt
start=time.time()
for i in range(10000000):
b(30)
end=time.time()
print("用時{0}".format((end-start)))
test1()
test2()
結果爲:
用時2.8063881397247314
用時1.975881814956665