1. 程式人生 > >函數相關知識匯總

函數相關知識匯總

打印 調用函數 計算 傳參 inf red one 中大 散列

一.函數的定義

定義函數的規則:

1.定義:def 關鍵詞開頭,空格之後接函數名稱和圓括號()。
2.參數:圓括號用來接收參數。若傳入多個參數,參數之間用逗號分割。
    參數可以定義多個,也可以不定義。
    參數有很多種,如果涉及到多種參數的定義,應始終遵循位置參數、*args、默認參數、**kwargs順序定義。
    如上述定義過程中某參數類型缺省,其他參數依舊遵循上述排序
3.註釋:函數的第一行語句應該添加註釋。
4.函數體:函數內容以冒號起始,並且縮進。
5.返回值:return [表達式] 結束函數。不帶表達式的return相當於返回 None

def 函數名(參數1,參數2,
*args,默認參數,**kwargs): """註釋:函數功能和參數說明""" 函數體 …… return 返回值

二.函數的調用規則

1.函數名()
    函數名後面+圓括號就是函數的調用。
2.參數:
    圓括號用來接收參數。
    若傳入多個參數:
        應按先位置傳值,再按關鍵字傳值
        具體的傳入順序應按照函數定義的參數情況而定
3.返回值
    如果函數有返回值,還應該定義“變量”接收返回值
    如果返回值有多個,也可以用多個變量來接收,變量數應和返回值數目一致

無返回值的情況:
函數名()

有返回值的情況:
變量 
= 函數名() 多個變量接收多返回值: 變量1,變量2,... = 函數名()

三.函數的返回值

返回值為None即沒有返回值:有以下三種情況

技術分享
#函數定義
def mylen():
    """計算s1的長度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)

#函數調用
str_len = mylen()
#因為沒有返回值,此時的str_len為None
print(str_len : %s%str_len)
不寫return

不寫return的情況下,會默認返回一個None

技術分享
def ret_demo():
    print(111)
    return
    print(222)

ret = ret_demo()
print(ret)
只寫return

只寫return,後面不寫其他內容,也會返回None,有人會奇怪,既然沒有要返回的值,完全可以不寫return,為什麽還要寫個return呢?這裏我們要說一下return的其他用法,就是一旦遇到return,結束整個函數

技術分享
def ret_demo():
    print(111)
    return None
    print(222)

ret = ret_demo()
print(ret)
return None

return None:和上面的兩種情況一樣,我們一般不這樣寫。

返回一個值

只需在return後面寫上要返回的內容即可

技術分享
#函數定義
def mylen():
    """計算s1的長度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    return length

#函數調用
str_len = mylen()
print(str_len : %s%str_len)
返回一個值

註意:return和返回值之間要有空格,可以返回任意數據類型的值

返回多個值

  可以返回任意多個、任意數據類型的值

技術分享
def ret_demo1():
    ‘‘‘返回多個值‘‘‘ 
    return 1,2,3,4


def ret_demo2():
    ‘‘‘返回多個任意類型的值‘‘‘
    return 1,[a,b],3,4

ret1 = ret_demo1()
print(ret1)
ret2 = ret_demo2()
print(ret2)
返回多個值

返回的多個值會被組織成元組被返回,也可以用多個值來接收

技術分享
def ret_demo2():
    return 1,[a,b],3,4

#返回多個值,用一個變量接收
ret2 = ret_demo2()
print(ret2)

#返回多個值,用多個變量接收
a,b,c,d = ret_demo2()
print(a,b,c,d)

#用多個值接收返回值:返回幾個值,就用幾個變量接收
a,b,c,d = ret_demo2()
print(a,b,c,d)
多個返回值的接收

原因:

>>> 1,2  #python中把用逗號分割的多個值就認為是一個元組。
(1, 2)
>>> 1,2,3,4
(1, 2, 3, 4)
>>> (1,2,3,4)
(1, 2, 3, 4)
技術分享
#序列解壓一
>>> a,b,c,d = (1,2,3,4)
>>> a
1
>>> b
2
>>> c
3
>>> d
4
#序列解壓二
>>> a,_,_,d=(1,2,3,4)
>>> a
1
>>> d
4
>>> a,*_=(1,2,3,4)
>>> *_,d=(1,2,3,4)
>>> a
1
>>> d
4
#也適用於字符串、列表、字典、集合
>>> a,b = {name:eva,age:18} 
>>> a
name
>>> b
age
系列解壓擴展

總結:


函數的返回值為None有三種情況
1.不寫返回值
2.只寫一個return
3.return None (幾乎不用)
return的作用:結束一個函數的執行,返回要返回的值

函數的返回值不為None,有返回值
return xxx 返回一個值(一個變量)
return a,b 返回多個值(多個變量),多個值之間用逗號區分
接收:可以用一個變量接收,以元組的形式返回
也可以用多個變量接收,返回幾個就用幾個變量去接收

四.函數的參數

函數的參數
     實參和形參
     實參:函數調用的時候傳入的參數值
     形參:是函數定義的時候定義的參數名
     參數可以是任意的數據類型
     可以傳遞0個或多個參數
     位置參數:按順序定義參數
     默認參數:首先,不要設置可變數據類型的默認參數
                對於變化小的參數可以設置默認參數
                默認參數可以不傳,不傳的時候用的就是默認值
                如果傳,會覆蓋默認值
                默認的值是在定義函數的時候就已經確定了的
     調用函數時傳參數:
         按照位置傳參
         按照關鍵字傳參

位置參數

站在實參角度

1.按照位置傳值

技術分享
def mymax(x,y):
    #此時x=10,y=20
    the_max = x if x > y else y
    return the_max

ma = mymax(10,20)
print(ma)
按位置傳參

2.按照關鍵字傳值

技術分享
def mymax(x,y):
    #此時x = 20,y = 10
    print(x,y)
    the_max = x if x > y else y
    return the_max

ma = mymax(y = 10,x = 20)
print(ma)
按關鍵字傳參

3.位置、關鍵字形式混著用

技術分享
def mymax(x,y):
    #此時x = 10,y = 20
    print(x,y)
    the_max = x if x > y else y
    return the_max

ma = mymax(10,y = 20)
print(ma)
位置、關鍵字混用傳參

  正確用法

      問題一:位置參數必須在關鍵字參數的前面

      問題二:對於一個形參只能賦值一次      

站在形參角度

位置參數必須傳值

技術分享
def mymax(x,y):
    #此時x = 10,y = 20
    print(x,y)
    the_max = x if x > y else y
    return the_max

#調用mymax不傳遞參數
ma = mymax()
print(ma)

#結果
TypeError: mymax() missing 2 required positional arguments: x and y
位置參數必須傳參

默認參數

    1.正常使用

      使用方法

      為什麽要有默認參數:將變化比較小的值設置成默認參數

    2.默認參數的定義

技術分享
def stu_info(name,sex = "male"):
    """打印學生信息函數,由於班中大部分學生都是男生,
        所以設置默認參數sex的默認值為‘male‘
    """
    print(name,sex)


stu_info(alex)
stu_info(eva,female)
默認參數

    3.參數陷阱:默認參數是一個可變數據類型

技術分享
def defult_param(a,l = []):
    l.append(a)
    print(l)

defult_param(alex)
defult_param(egon)
參數陷阱

註:不要設置可變數據類型的默認參數

動態參數

  按位置傳值多余的參數都由args統一接收,保存成一個元組的形式;**kwargs代表把按關鍵字傳來的參數拼成字典

技術分享
def mysum(*args):
    the_sum = 0
    for i in args:
        the_sum+=i
    return the_sum

the_sum = mysum(1,2,3,4)
print(the_sum)
*args求和函數應用 技術分享
def stu_info(**kwargs):
    print(kwargs)
    print(kwargs[name],kwargs[sex])

stu_info(name = alex,sex = male)
**kwargs應用 技術分享
def fun2(*args):#*args代表把散列的元素拼成元組
    print(args)
t = (1,2,3,4)
l = [1,2,3,4]
# fun2(t[0],t[1],t[2],t[3])
fun2(*t)  #*代表把一個元組、列表拆了
fun2(*l)  #*代表把一個元組、列表拆了

def fun3(**kwargs):#*args代表把按關鍵字傳來的參數拼成字典
    print(kwargs)
fun3(a = 10, b = 20)
d = {a: 10, b: 20}
fun3(**d)  #*代表把一個字典拆了
*的意義

五.作用域、閉包函數、裝飾器

http://www.cnblogs.com/Eva-J/articles/7156261.html

http://www.cnblogs.com/Eva-J/articles/7194277.html

http://www.cnblogs.com/vipchenwei/p/6991203.html


  
          
          

函數相關知識匯總