1、函數的創建與調用
函數出了python中的內置函數外,我們也也可以根據需求,自己創建函數
創建函數語法格式
def functionname([parameterlist])
['''comments''']
[functionbody]
調用函數語法格式
functionname([parameterlist])
小技巧:
在調用函數時,如果指定了“comment(註釋)”參數,那麼在調用函數時,輸入函數名及其左側小括號時,就會顯示該函數的幫助信息(註釋的內容)
例子:
def filterchar(string):
'''
功能:過濾危險字符,並將過濾後的結果輸出
about:要過濾的字符串
沒有返回值
'''
import re
pattern = r'(黑客)|(抓包)|(監聽)|(trojan)'
sub = re.sub(pattern, "@_@", string)
print(sub)
filterchar("黑客")
2、參數傳遞
2.1、形式參數與實際參數(形參與實參)
形式參數(形參):在定義函數時,函數名後括號內的參數爲形參
實際參數(實參):在調用一個函數時,函數名後括號內的參數爲實參,也就是調用函數時,我們給函數傳入的參數。
根據實踐參數類型的不同,可以分爲值傳遞和應用傳遞。當實際參數爲不可變對象時,就是值傳遞:當實際參數爲可變對象時就是引用傳遞。
例子:
定義函數
def demo(obj):
print(“元值:”, obj)
obj += obj
調用函數
print("========值傳遞========")
mot = "唯有在被追趕的時候,你才能真正的奔跑。"
print("函數調用前:", mot)
demo(mot) # 採用不可變量字符串
print("函數調用後:", mot)
print("========引用傳遞========")
list1 = ['apple', 'banana', 'orange', 'pear']
print("函數調用前:", list1)
demo(list1) # 採用可對象列表
print("函數調用後:", list1)
輸出
========值傳遞========
函數調用前: 唯有在被追趕的時候,你才能真正的奔跑。
元值: 唯有在被追趕的時候,你才能真正的奔跑。
函數調用後: 唯有在被追趕的時候,你才能真正的奔跑。
========引用傳遞========
函數調用前: ['apple', 'banana', 'orange', 'pear']
元值: ['apple', 'banana', 'orange', 'pear']
函數調用後: ['apple', 'banana', 'orange', 'pear', 'apple', 'banana', 'orange', 'pear']
可以看出,值傳遞改變形參的值,但是不改變實參的值。
引用傳遞改變形參的值,同時也改變實參的值。
2.2、位置參數
位置參數也稱必備參數,必須按照正確的順序傳入函數中
1、數量必須與定義時的一樣
在調用函數時,指定的實際參數的數量必須與形式參數一樣一樣,否則會拋出TypeError異常,提示缺少的位置參數
2、位置必須與定義時的一致
不一致會產生下面2種異常
(1)、拋出TypeErro異常
該種異常主要是實參與形參類型不一致,且在函數中,2種類型無法轉換
(2)、產生的結果與預期的不符
就是位置錯了,但是他們的類型一致,比如身高和體重的參數位置反了。
這其實是一種bug
2.3、關鍵字參數
關鍵字參數是指使用形參的名字來確定輸入的參數值,使用該方法,實參的位置不需要一致。
如調用fun_bmi(persion,height,weight)函數,可以通過關鍵字參數
fun_mbi(height = 1.58, persion = 'john', weight = '50')
2.4、爲參數設置默認值
語法格式:
def functionname(…,[parameter1 = defaultvaluel]):
[functionbody]
查看函數的默認值參數的語法
函數名.__defaults__
使用可以變量作爲參數的默認值時,多次調用,可能會產生意料之外的結果。
爲了防止這種情況的產生,我們可以使用None作爲可變對象的默認值,還要加上檢驗代碼。
在定義函數時,爲形式參數設置默認值時,默認參數必須指向不可變對象
2.5、可變參數
可變參數也稱不定長參數。即傳入函數的參數可以是0個,1個,2個等等。
主要有*parameter和**parameter 2種形式
1、*parameter
這種形式表示接收任意多個實際參數並將其放入一個元組中。
如
def printfruit(*fruitname):
print('\n我喜歡的水果有:')
for i in fruitname:
print(i) # 輸出水果名稱
printfruit('apple')
printfruit('apple', 'banana', 'pear')
輸出
我喜歡的水果有:
apple
我喜歡的水果有:
apple
banana
pear
如果想要用一個已經存在的列表作爲函數的可變參數,可以在列表名稱前加個’*‘。
如
a = ['apple', 'banana', 'pear']
printfruit(*a)
2、**parameter
這種形式表示可以接收任意多個類似關鍵字一樣的顯示賦值的實際參數
如
def printsign(**sign):
print()
for key, value in sign.items(): # 遍歷字典
print(key + "的星座是:" + value)
printsign(a='水瓶')
printsign(a='水瓶', b='獅子')
輸出
a的星座是:水瓶
a的星座是:水瓶
b的星座是:獅子
如果想要用一個已經存在的字典作爲函數的可變參數,可以在字典名稱前加個’**‘。
3、返回值
在python中無論return語句在什麼位置,只有得到執行,就會直接結束函數的執行
語法格式:
result =return [value]
說明
value爲一個可選參數,用於指定要返回的值(可以是一個值,也可以是多個值,值可以是任意類型)
當函數中沒有return語句,,或者省略return語句的參數時,將返回None(空值)
4、變量的作用域
4.1、局部變量
局部變量就是在函數內部定義並使用的變量。(在函數外部使用會拋出NameError異常)
4.2、全部變量
1、在函數外部定義
值得注意的事,當全局變量與局部變量重名時,對函數體內的變量進行賦值後,不影響函數體外的變量。
2、在函數內定義
在函數體內定義全局變量,需要使用global關鍵字
語法格式
global 變量
5、匿名函數
匿名函數就是沒有名字的函數,一般只使用一次。使用lambda關鍵字
語法格式
result = lambda [arg1 [,arg2,...,argn]]:expression
參數說明:
result:用於調用lambda表達式
[arg1 [,arg2,…,argn]]:可選參數,用於指定的要傳遞的參數列表
expression: 必選參數,用於指定一個實現具體功能的表達式。
注意:使用lambda關鍵字只能有一個返回值和出現其他非表達式語句(如for或while)
如:
import math
r = 10
result = lambda r: math.pi*r*r
print("半徑爲", r, "的圓的面積爲", result(r))
lambda的首頁用途是指定短小的回調函數。
6、牛刀小試
6.1、輸出第幾天
請編寫一個程序,實現輸入任意的年月日就可以計算出是這一年的第幾天,如輸入20190203,就可以輸出這是2019年的第34天。
def data(y, m, d):
if m <= 2:
return "這是"+str(y)+"年的第"+str((m-1)*31+d)+"天"
elif m in (3, 5, 7, 9, 10, 11, 12):
return "這是" + str(y) + "年的第" + str((m - 1) * 31 + d - m//2 - 1 + y % 4 - 1) + "天"
elif m in (4, 6, 8):
return "這是" + str(y) + "年的第" + str((m - 1) * 31 + d - m//2 - 1 + y % 4) + "天"
if __name__ == '__main__':
a = data(2017, 1, 1)
print(a)
6.2、找出重複IP
下面list 中提供了幾組IP地址,編寫一個函數,將list中重複出現的IP地址找出來。
list=[‘192.168.1.1’,‘10.192.66.72’,‘10.199.88.132’, ‘192.168.1.1’,‘1.192.168.163’]
def main():
a=['192.168.1.1','10.192.66.72','10.199.88.132', '192.168.1.1','192.168.163']
b=[]
c=[]
for i in range (0,len(a)):
if a[i] not in b:
b.append(a[i])
else:
c.append(a[i])
print (c)
if __name__ == '__main__':
main()
6.3、大寫模式
編寫-一個函數,把輸入的字母統一成大寫模式, 如輸入“go big or go home",輸出爲“60BIG OR G0 HOME"。
def demo(a):
a = a.upper()
return a
if __name__ == '__main__':
b = demo('go big or go home')
print(b)