函數
- 1 函數定義
- 2 函數調用
- 3 函數注釋文檔
- 4 函數參數
- 4.1 參數列表,默認參數,任意參數
- 4.1.1 無缺省值參數
- 4.1.2(部分)缺省值參數
- 4.1.3 數量不定形參數
- 4.2 可變對象和不可變對象
- 4.3 作用域
- 4.3.1 globals()函數
- 4.3.2 global 聲明變量為全局變量
- 5 函數返回值
- 5.1返回單個值
- 5.2返回多個值
- 6 函數的嵌套調用
- 7 函數的遞歸
- 8 lambda語句
函數:有獨立功能的代碼塊,組織(封裝)成為小模塊,有需要的時候調用。
自己編寫第三方庫:封裝,修改功能代碼塊,增加函數定義,在其他程序中導入自己寫的函數,來使用函數中的功能。
1 函數定義
定義一個函數的語法:
def 函數名():
函數封裝的代碼
def test1():
print(‘hello world’)
函數中變量的命名規則與變量命名的規則相同
2 函數調用
定義好一個函數之后只是表明封裝了一段代碼,如果不調用函數函數是無法主動執行的。在函數名之后加一個小括號就能夠完成函數調用工作。
帶參數函數調用: 在函數名后按照定義變量的順序依次填寫實際要計算的參數。
Python不能在函數定義之前用函數名調用函數
3 函數注釋文檔
給Python中的函數添加注釋 函數上方保留兩個空行,函數的注釋在函數定義下方第一行,三個引號,填寫注釋內容。
在函數調用出:View-》quick document快速文檔(ctrl+q)->查看函數的注釋說明信息。
在pycharm 文檔注釋解釋函數功能基礎上,要求同時顯示參數說明
文檔注釋的模板:在“”“后面寫 函數作用,在每個參數后寫參數的含義
4 函數參數
參數:函數內部需要處理函數外部數據時,可以通過參數傳遞
函數的參數用以增加函數的通用性。
函數的參數類型:形參和實參
定義函數時的參數:形參,告訴使用者,要傳兩個參數,在函數內部當變量使用。
調用函數時的參數:實參,實實在在的參數。
示例函數:Sum_2_num() -實現兩個數字求和,把需要計算的數字,通過參數的形式傳遞給函數。在括號里填寫參數,多個參數之間用逗號分隔。
4.1 參數列表,默認參數,任意參數
4.1.1 無缺省值參數
def sum_2_num(num1,num2):…
4.1.2(部分)缺省值參數
(參數帶默認值)
def sum_2_num(num1,num2=1):…
函數定義時,給參數設定默認值,當函數有外部參數傳入時,使用傳入的實參,沒有參數傳入時使用缺省值
好處: 簡化常用情況下的參數傳遞
使用情況: 常見的值設為參數的默認值,不傳遞參數就能會調用默認值
定義參數的缺省值:在參數名后面加=加默認值就可以了。在指定缺省參數的默認值時,應該使用最常見的值作為默認值
注意事項:
a).定義位置:缺省參數應該放在參數列表的末尾,
b).調用多個缺省參數的函數:利用變量名=變量值來傳遞參數,避免傳遞位置錯誤
gl_list=[6,3,9]
#默認按升序排序,日常升序多
#gl_list.sort()
#如果需要降序排列,要指定reverse參數
gl_list.sort(reverse=True)
print(gl_list)
4.1.3 數量不定形參數
一個函數需要處理的參數個數是不確定的,這個時候可以使用多值參數來定義該函數。
多值參數好處:調用函數會比較方便。兩種方式定義多值參數的方法:
a).參數名前面+*
b).參數名前面+**
*args
**kwargs
def sum_numbers(num1, *numbers):print(num1, numbers) # 1 (2, 3, 4)s = num1for val in numbers:s += valprint(s) # s = 10sum_numbers(1,2,3,4)
使用元組和字典傳遞數量不定的參數,拆包操作
def demo(*args,**kwargs):print(args)print(kwargs)gl_nums=(1,2,3)
gl_dict={"name":"xiaoming","age":18}demo(gl_nums,gl_dict)
#輸出:
#((1, 2, 3), {'age': 18, 'name': 'xiaoming'})
#{}#拆包,
demo(*gl_nums,**gl_dict)
#等價于
demo(1,2,3,name="xiaoming",age=18)
注意:在函數中,參數在使用前必須被賦值。
4.2 可變對象和不可變對象
python 中的所有對象分為可變對象和不可變對象。所謂可變對象指的是,對象的內容可變,而不可變對象的內容不可變化。
不可變對象 | 數值類型,字符串,元組 |
---|---|
可變對象 | 字典,列表 |
Python 參數都是對對象引用。如果在函數內部,嘗試修改不可變對象,程序會在函數中生成新的對象,函數外被引用的對象則不會被改變。
1.函數內部,使用賦值語句操作不可變類型的實參,不會改變函數外的相對應的參數值
def demo(num,num_list):print("內部的代碼")# 函數內部,對參數的賦值語句num = 100num_list=[1,2,3]print(num)print(num_list)print("函數執行完成")
gl_num=99
gl_list=[4,5,6]
demo(gl_num,gl_list)
print(gl_num)
print(gl_list)
輸出
內部的代碼
100
[1, 2, 3]
函數執行完成
99
[4, 5, 6]
2.函數內部,使用賦值語句操作可變類型的實參,會改變函數外的相對應的參數值
def changeable(list):list[0] = 2print(list)
lis = [1, 2, 3]
print(lis)
changeable(lis)
print(lis)
輸出:
[1, 2, 3]
[2, 2, 3]
[2, 2, 3]
3.在函數內部使用可變類型的數據的方法,會改變外部實參。
def demo(num_list):print("函數內部的代碼")#使用方法修改列表的內容,在函數內部使用方法是沒有智能提示的num_list.append(9)print(num_list)print("函數執行完成")
gl_list=[1,2,3]
demo(gl_list)
print(gl_list)
輸出:
函數內部的代碼
[1, 2, 3, 9]
函數執行完成
[1, 2, 3, 9]
4.列表使用+=本質上是調用extend方法:可以把另外一個列表的內容加到當前列表下。
數字、字符串,使用+=先相加再賦值,列表+=會改變函數外面的變量:
def demo(num,num_list):print("函數開始")# num=num+num,不會改變外面實參num+=num# 調用方法,會改變外面是實參num_list+=num_listprint(num)print(num_list)print("函數完成")gl_num=9
gl_list=[1,2,3]
demo(gl_num,gl_list)print(gl_num)
print(gl_list)
使用等價的語句則不會:
def demo(num,num_list):print("函數開始")# num=num+num,不會改變外面實參num+=num# 賦值語句,不會改變外面實參#num_list=num_list+num_listprint(num)print(num_list)print("函數完成")
4.3 作用域
python在創建、改變、查找變量名時都是在命名空間中進行的,即在相應的作用域下進行的。Python不能聲明變量,當變量初始化處就決定了這個變量存在于哪個作用域中。
默認情況下:函數中定義局部變量,主程序中定義全局變量。函數內部可以使用全局變量。
4.3.1 globals()函數
在函數內部,也可以使用globals函數訪問全局變量。
x = 1
def print_x():x = 2print(globals()["x"])print(x)
print_x()
輸出
1
2
4.3.2 global 聲明變量為全局變量
def defin_gx():global gx # 注意啦注意啦,下面使用的gx 使用的是全局變量哈gx = 3
gx = 1
defin_gx()
print(gx)
輸出
3
5 函數返回值
一個函數執行結束后,告訴調用者執行的結果。使用 return關鍵字返回執行結果,可以使用一個變量來接受返回的結果。
在return語句后的函數語句是無法到達的,所以,return語句應該作為函數的最后一句話
5.1返回單個值
return num
5.2返回多個值
返回多個結果(函數返回當前的溫度和濕度)
def measure():#測量溫度和濕度print("測量開始")temp=39wetness=50print("測量結束")# 元組-可以多個數據,因此可以使用元組讓函數一次性返回多個值# 如果返回的數據類型是元組,小括號可以省略,否則有小括號提示#return (temp,wetness)return temp,wetness#元組。從元組中拿到單獨的數據
result=measure()
#需要拿到溫度和濕度,
print(result[0])
print(result[1])#如果函數返回的類型是元組,同時希望單獨處理元組中的元素
#可以使用多個變量,一次性接受函數 的返回值
#注意使用多個變量接受結果時,變量的個數應該和元組中元素的個數保持一致
gl_temp,gl_wetness=measure()
print(gl_temp)
print(gl_wetness)
6 函數的嵌套調用
一個函數中嵌套另外一個函數
def test1():print('1' * 50)def test2():print("-" * 50)test1()print("+" * 50)test2()
**溫馨提示:**項目出現新的需求時,不要急著改變已經測試好的程序,另求他法,盡可能不要在原有的函數或者模塊中改動,因為要求可能還會變回去。
7 函數的遞歸
一個函數數的遞歸:自己調用自己
特點:
1.要傳入參數,是會根據參數的不同做不同處理,
2.遞歸一定要有一個出口,沒有出口會出現死循環
遞歸執行流程:每次遞歸調用的核心就是處理的參數會改變。
案例演練:接收數字num,完成1+2+num用遞歸完成。遍歷整個文件目錄,遞歸算法編寫出來的十分有效果
def sum_num(num):# 出口if num==1:return 1# 數字累加#假設sum_number能夠完成1...num-1之間的累加temp=sum_num(num-1)return num+tempresult=sum_num(5)
print(result)
8 lambda語句
lambda用于創建匿名函數。對于一些抽象的、不會在其他地方復用的函數,可以使用lambda語句使代碼變得精簡。
# lambda表達式
g = lambda x : x + 1
print(g(1))
冒號左邊是函數的參數,有多個參數使用逗號分割開。
冒號右邊是返回值,只能有一個返回值,包含實際計算操作
注意lambda語句只有一個返回值一個表達式,不能含有命令。
demo: lambda語句實現任意底數的函數
from math import log
def make_logarithmic_function(base):return lambda x:log(x, base)
my_lf = make_logarithmic_function(base=3)print(my_lf(9))
輸出
2.0