2019-07-09 函數的基本使用和參數

1、函數app

  1、什麼是函數函數

    函數就是具備某個具體功能的工具工具

  2、爲何要用函數spa

    減小代碼冗餘code

    提供開發效率blog

    提升程序的擴展性開發

  3、定義一個函數字符串

    def是定義函數的關鍵字class

    函數名:函數名的命名規則與變量名的命名規則同樣效率

        1.不能以關鍵字命名

        2.函數名也要作到見名之意

    函數在定義的時候只檢測語法,不會執行代碼

    調用函數的固定格式 :

      函數名+括號

      函數名只要遇到括號會當即執行函數代碼

      代碼中遇到函數名加括號  優先級最高

      先去執行函數  再去看下面的代碼

2、函數的返回值    return

  函數內要想返回給調用者,必須用return

  有五種狀況:

    1.不寫return :函數默認返回None

def func():
    print(1+2)    #3

res1 = func()
print(res1)   #None

    2.只寫return:也是返回None,除了有返回值,還能夠直接結束整個函數運行,無論嵌套了幾層循環都會被結束。

    print(1+2)不會執行,由於在它前面有個return,以後的全部代碼都不會執行,最終結果只返回None

def func():
    return
    print(1+2)

res1 = func()
print(res1)     #None

    3.寫return None:也是返回None,和只寫return同樣也會結束函數運行

def func():
    return None
    print(1+2)

res1 = func()
print(res1)      #None 

    4.寫return 返回一個值:這個值能夠是任何數據類型

def func():
    return '1234'
def func1():
    return [1,2,3]
def func2():
    return (1,2,3,4)
def func3():
    return {'name':'aaa'}

print(func(),func1(),func2(),func3())    #1234 [1, 2, 3] (1, 2, 3, 4) {'name': 'aaa'}

    5.寫return 返回多個值:return 會自動將多個值以元組的形式返回給調用者

def func():
    return '1','2','3'
def func1():
    return [1,2,3],[4,5,6],[7,8,9]
def func2():
    return (1,2,3,4),(1,2,3)
def func3():
    return {'name':'aaa'},{'age':18}

print(func(),func1(),func2(),func3())   #('1', '2', '3') ([1, 2, 3], [4, 5, 6], [7, 8, 9]) ((1, 2, 3, 4), (1, 2, 3)) ({'name': 'aaa'}, {'age': 18})

    若是不想以元組的方式返回,那就手動加上你想返回的數據類型的符號

def func4():
    return [(1,2,3,4),(1,2,3)]

print(func4())    #[(1, 2, 3, 4), (1, 2, 3)]

  總結:1.全部函數都有返回值,不寫return返回值是None

     2.光寫return 或者return None不是考慮函數返回值,而是函數結束運行

3、函數參數    四種:位置參數、關鍵字參數、默認值參數、可變長參數(不定長參數)

  函數參數的兩大類型:

    形參:在函數定義階段  括號內寫的變量名,叫作該函數的形式參數

    實參:在函數調用階段  括號內傳入的實際值,叫作實際參數

  形參與實參的關係:

    形參就至關於變量名,實參就至關於變量名的值

    函數調用傳參的過程,就是給形參賦值的過程

  注意:形參和實參的綁定關係只在函數的調用階段有效,函數運行結束關係自動解除,只有在函數內部有效,函數外部無任何影響

  如今咱們能夠得出函數的簡易結構:

    def   函數名(形參1,形參2。。。):

      '''函數註釋'''

      函數代碼體1

      函數代碼體2

      。。。

      return  函數的返回值

  1.位置參數:在函數定義階段按照位置從左往右依次書寫的變量名,叫作位置形參

  位置形參在調用的時候  必須爲其傳值

def func(x,y):
    return x+y

res = func(1,2)
print(res)      #3

   位置實參:在調用函數的時候,多一個參數,少一個參數都不行,傳入的參數要按照位置一一對應傳給形參

  2.關鍵字參數:在函數調用階段,給變量名賦值

def func(x,y):
    return x+y

res = func(3,y=2)
print(res)        #5

  總結:

    注意:在函數調用階段,位置參數和關鍵字參數能夠混合使用

    但必須保證:

        1.位置關鍵字參數必須在關鍵字參數前面(越短的越靠前,越長的越複雜的越靠後),在函數定義階段這個也適用

        2.同一個參數不能被屢次賦值

  3.默認值參數:在函數定義階段,給變量名賦值

    在調用函數階段,若是不給該參數(變量名)傳值,就默認使用在定義階段賦值的值。

    在調用函數階段,若是給該參數(變量名)傳值,就使用你傳的值。

       在定義階段也是位置參數放在前面,默認值參數放在後面(越短的越在前面,越長的越在後面)

#在調用的時候,不給y傳值
def func(x,y=3):
    return x+y

res = func(3)
print(res)     #6

#在調用的時候,給y傳值
def func(x,y=3):
    return x+y

res = func(3,y=6)
print(res)      #9

  易錯題分析(這裏一直是在使用惟一一個列表,因此會一直往一個列表裏面添加)

def info(username,hobby,l=[]):
    
    l.append(hobby)
    print('%s 的愛好是 %s'%(username,l))
info('jason','study')
info('tank','生蠔')
info('kevin','喝腰子湯')
info('egon','女教練')

#結果
#jason 的愛好是 ['study']
#tank 的愛好是 ['study', '生蠔']
#kevin 的愛好是 ['study', '生蠔', '喝腰子湯']
#egon 的愛好是 ['study', '生蠔', '喝腰子湯', '女教練']

  糾正(在調用info的時候,默認傳值l = None,函數體裏面if判斷若是l == None,就會變成l = [],每一次調用都會生成一個)

def info(username,hobby,l=None):
    if l == None:
        l = []
    l.append(hobby)
    print('%s 的愛好是 %s'%(username,l))
info('jason','study')
info('tank','生蠔')
info('kevin','喝腰子湯')
info('egon','女教練')

#結果
#jason 的愛好是 ['study']
#tank 的愛好是 ['生蠔']
#kevin 的愛好是 ['喝腰子湯']
#egon 的愛好是 ['女教練']

  總結:函數不管在什麼地方被調用,都會到函數定義階段去執行代碼,所須要值都是往函數定義階段上面找

     函數在定義階段,內部所使用的的變量都已經所有初始化完畢了,不會由於後面調用位置的改變而影響到內部的值

   4.可變長參數:在調用的時候,實參傳遞的個數不固定,可能會傳遞多了,也可能會傳遞少了,在定義的時候,形參也可能會這樣,咱們用*和**來接收多餘的參數

    1.站在形參的角度看  *

      形參中的*會將實參中的多餘位置參數統一放在元組中,而後傳遞給後面的形參名

      *在形參中只能接受多餘的位置參數,其餘的類型參數不行

def func(x,y,*z):
    print(x,y,z)
  
func(1,2,3,4,5,6)    #1 2 (3, 4, 5, 6)

    2.站在實參的角度看  *

      實參中的*會將元組、列表、集合、字符串打散,而後一一傳入到形參中,打散以後的實參個數要和形參個數一致,否則就會報錯 

      func(*(1,2,3)) 等價於   func(1,2,3)

def func(x,y,z):
    print(x,y,z)

func(*(1,2,3))   #1 2 3

    3.站在形參角度看 **

      形參中的 **會將多餘的實參統一放在一個字典中,而後傳遞給後面的形參名

      **在形參中只接受多餘的關鍵字參數,其他類型參數不行

def func(x,y,**z):
    print(x,y,z)

func(1,2,a=3,b=4)   #1 2 {'a': 3, 'b': 4}

    4.站在實參的角度看 **      將實參中傳入的字典轉換成  key = value

      func(**{'x':1,'y':2,'z':3})   等價於func(x=1,y=2,z=3)      

      特別重要的一點:在實參中傳參的時候這個字典的key要和形參中的變量名取名一致

def func(x,y,z):
    print(x,y,z)

func(**{'x':1,'y':2,'z':333})   #1 2 333

  總結 *和**

    *在形參中可以接受實參中多餘的位置參數,而且把他們統一放在一個元組中並賦值給*後面的變量名

    **在形參中可以接受實參中多餘的關鍵字參數,而且把他們統一成一個字典並賦值給**後面的變量名

    

    *在實參中可以將列表,元組,字符串,集合打散成位置參數形式傳遞給形參

    **在實參中可以將字典打散成key = value 的形式  ,以關鍵字參數傳遞給形參

   

本節總結:

    1.關鍵字參數是在實參中設定

    2.默認參數是在形參中設定   

相關文章
相關標籤/搜索