一、函數的定義方式數組
def 函數名([參數]):##參數可選數據結構
語句體app
例:定義一個斐波那契數據的函數函數
>>> def fibs(num):
result = [0,1]
for i in range(int(num)-2):
result = result.append(result[-2]+result[-1])
return resultspa
二、函數中的return,通常狀況下,函數處理完後會返回值給調用的對象,也有的函數是不返回值的這種函數裏的return就是用來終止函數的;全部的函數運行到return語句後就會終止對象
>>> def hello():
print('你好')
return
print('Hello')ip
>>> hello ###這裏hello並非調用函數hello
<function hello at 0x000002691AD89BF8>
>>> hello() ###調用函數hello(),打印你好,遇到return 函數終止運行,因此第二個打印Hello不執行;
你好作用域
三、沒有返回值的函數,實際返回的是None;函數在使用if條件語句時,最好每一個條件都有返回值字符串
>>> x = hello()
你好 ###這個不是返回值,返回值是賦值給了x的,你好是函數體內的打印string
>>> x
>>> print(x) ###打印返回值,顯示None
None
四、參數;大多數狀況下咱們使用函數都是有參數的,參數就是函數要處理的值;函數(參數)裏的參數咱們成爲形參,咱們調用函數時,實際傳遞的參數稱爲實參;函數處理時,由於不肯定會傳入什麼參數,因此用形參表示實參,函數對形參進行處理;當咱們調用函數時,將實參傳遞給形參,函數根據咱們傳入的實參,處理咱們的數據;參數存儲在局部做用域;
###這個函數fibs的形參是num,接收用戶輸入的值來生成須要的斐波那契額數據
>>> def fibs(num):
result = [0,1]
for i in range(int(num)-2):
result = result.append(result[-2]+result[-1])
return result
>>> x = fibs(8) ###調用fibs函數,8就是實參就是咱們想要處理的數據,實參傳遞給形參相似給形參賦值;num=8
>>> print(x)
[0, 1, 1, 2, 3, 5, 8, 13]
>>> def change_to_name(name):
name = 'Mr.Smith'
return name
>>> name = 'Bob Gumby' ###外部元素name
>>> x = change_to_name(name) ####change_to_name(name)函數體內運行邏輯:name = name 內部變量和外部變量name都指向了 'Bob Gumby';name='Mr.Smith' 內部變量name重綁定了 'Mr.Smith' ;這時函數體內變量name是指向的‘Mr.Smith’,因此外部name指向的仍是 'Bob Gumby';就是說函數體內部對外部變量進行重綁定(賦值),外部變量的值是不會變的(參數是list也是這樣的)
>>> x
'Mr.Smith'
>>> name
'Bob Gumby'
可變參數:list,dict
>>> def change(n):
n[0] = 'Mr.Gumby'
>>> names = ['Mr.Bob','Mr.Morse']
>>> change(names) ###內部運轉:n=names 指向同一個列表,n[0]='Mr.Gumby',修改列表內的值,列表也被修改,這時n和names仍是指向同一個列表的因此 names輸出也是修改後的列表
>>> names
['Mr.Gumby', 'Mr.Morse']
若是想對list類型參數進行修改而不改變原列表,能夠用分片賦值法[:]賦值一個副本的list參數,對副本進行處理
>>> def change(n):
n[0]= ['Mr.Gumby']
>>> names = ['Mr.Bob','Mr.Morse']
>>> names_fu = names[:]
>>> change(names_fu)
>>> names_fu
[['Mr.Gumby'], 'Mr.Morse']
>>> names
['Mr.Bob', 'Mr.Morse']
五、可變參數,實例:須要編寫一個存儲名字而且能用名字、中間名或姓查找聯繫人的程序
》用名字查找聯繫人----根據key查找value 數據類型dict{}
》用名、中間名、姓查找聯繫人 初始化dict裏面應該有三個key,考慮到多人狀況,每一個key再對應{} 裏面爲名:聯繫人,中間名:聯繫人,姓:聯繫人的方式
》查找模式 dict[first/middle/last][名/中間名/姓]
初始化數據結構 {「first」:{},'middle':{},'last':{}}
>>> def init(data):
data['first']={}
data['middle']={}
data['last']={}
return data
>>> mynames = {}
>>> mynames = init(mynames)
>>> mynames
{'first': {}, 'middle': {}, 'last': {}}
定義存儲數據的函數:
>>> def store(data,full_name):
names = full_name.split()
if len(names)==2:
names.insert(1,'')
labels = ['first','middle','last']
for label,name in zip(labels,names):
data[label][name]=[full_name]
return data
>>> full_name = 'liang yang yang'
>>> mynames = store(mynames,full_name)
>>> mynames
{'first': {'liang': ['liang yang yang']}, 'middle': {'yang': ['liang yang yang']}, 'last': {'yang': ['liang yang yang']}}
定義查找函數:
>>> def lookup(data,label,name):
return data[label][name]
>>> print(lookup(mynames,'middle','yang'))
['liang yang yang']
目前看這三個函數組合已經可使用,可是還不完善,若是名字中(名、中間名、姓)某一項有重複的值呢
>>> def store(data,full_name):
names = full_name.split()###拆分full_names爲一個列表,split()默認使用空格拆分
if len(names)==2:
names.insert(1,'') ### 若是名字長度爲2,則在中間插入一個空的字符串做爲中間名
labels = ['first','middle','last']
for label,name in zip(labels,names): ###zip聯合labels和names,每項爲(label,name)格式
try:
people = lookup(data,label,name) ###查看一下輸入的名字裏 data[label][name]
except KeyError as err: ###若是data裏不存在data[label][name]會拋出KeyError
print('KeyError:%s'%str(err)) ###打印錯誤信息
people = None ###data裏不存在data[label][name]不存在,則people=None
finally:
if people: ###根據people的值,選擇是添加到已有的列表中,仍是建立新的項
data[label][name].append(full_name)
else:
data[label][name]=[full_name]
return data
六、不可變參數
函數是不能改變(不可變參數)的,只能從函數返回值,對參數從新處理
>>> def inc(x):
return x+1
>>> foo = 100
>>> inc(foo)
101
>>> foo ###函數並無改變參數foo
100
>>> foo = inc(foo) ###對foo進行了賦值,改變了foo,並非inc函數改變了foo
>>> foo
101
###若是想要用函數改變不可變參數,能夠用可變參數替換
>>> def inc(x):
x[0]=1
return x
>>> foo = [10]>>> inc(foo)[1]>>> foo[1]