函數、參數1

一、函數的定義方式數組

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]

不可變參數: string、tuple、數字都是不可變的,它們不能被修改,只能替換

 

>>> 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]

相關文章
相關標籤/搜索