python的函數介紹 位置參數 關鍵字參數 默認參數 參數組 *args **kwargs


1、數學意義的函數與python中的函數

數學意義的函數

y = 2*3+1

x =3

y =7

x是自變量,y是因變量

2、python中定義函數的方法

一個函數往往都是為了完成一個特定的功能而存在的,所以注釋信息加上是個好習慣

def atest(x):
    "The  function definitions"
    x += 1
    return x

def:     定義函數的關鍵字

atest:     函數名

():     內可定義形參

"":    文檔描述(非必要,但是強烈建議為你的函數添加描述信息)

x+=1:   泛指代碼塊或程序處理邏輯

return: 定義返回值

沒有return也是可以的,一個函數里面只要運行到return就會退出整個函數,不在繼續往下走

 

調用運行:可以帶參數也可以不帶

函數名()

 

3、寫一個函數

def atest(x):
    """
    2*x+1
   
:param x: 整形數字
   
:return: 返回計算結果
    """
   
y=2*x+1
    return y
print (atest)

打印出來的是函數的內存地址

<function test at 0x0000000001556D90>

 

調用下函數

def atest(x):
    """
    2*x+1
    :param x: 整形數字
    :return: 返回計算結果
    """
    y = 2 * x + 1
    return y
a = atest(3)
print(a)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

7

4.什么情況下調用函數的時候不用加參數呢,就是定義函數的時候括號里面為空

def atest():
    """
    2*x+1
    :param x: 整形數字
    :return: 返回計算結果
    """
    x = 3
    y = 2 * x + 1
    return y
a = atest()
print(a)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

7

5、同一個文件里面的函數名不能有相同的函數名,如果有2個相同的函數名,在下面調用代碼的時候會先最終調用最下面的函數,因為python執行順序是從上到下的,上面的函數會被下面的函數覆蓋掉

6.函數的好處 

函數的好處:

代碼重用

保持一致性,易維護

可擴展性

 

7.過程定義

過程就是簡單特殊沒有返回值的函數

下面這atest01就是過程,atest02就是函數

def atest01():
    msg="hello the little green frog"
    print (msg)

def atest02():
    msg="hello beiye"
    print (msg)
    return msg
t1=atest01()
t2=atest02()

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

hello the little green frog

hello beiye

8.return可以返回多個值,其實也是一個值,是一個元組

def atest01():
    msg="test01"
    print (msg)
def atest02():
    msg="test02"
    print (msg)
    return msg
def atest03():
    msg="test03"
    print (msg)
    return 1,2,3,"gou",["beiye"],None,{"name":"gou"}
t1=atest01()
t2=atest02()
t3=atest03()
print (t1)
print (t2)
print (t3)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

test01

test02

test03

None

test02

(1, 2, 3, 'gou', ['beiye'], None, {'name': 'gou'})

 

總結:

返回參數=0:返回None

返回參數=1:返回object

返回值數>1:返回tuple    元組

 

9.函數的參數

分為2種,形參   實參

(1)形參變量只有在被調用的時候才分配內存單元。因此形參只在函數內部有效。函數調用結束返回主調用函數后則不能再使用該形參變量

(2)實參可以是常量、變量、表達式、函數等,無論實參是何種類型的變量,在進行函數調用時,他們都必須有確定的值,以便把這些值傳送給形參,因此預先賦值,輸入等辦法使參數獲得確定值

上面的說法聽不懂,我自己說下,

形參就是定義函數的時候()里面的定義的參數,還沒有被使用,只是定義好

實參就是函數定義完成了,在下面進行調用的時候傳進去的參數

 

def cacl(x, y):  #定義了一個函數cacl  形參是x y
    reus = x ** y   #reus = x的y次方
    return reus
reus = cacl(2, 5)   #把2傳值給x,把5傳值給y
print(reus) 

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

32

 

(3)位置參數,形參和實參位置必須一一對應,多傳參數和少傳參數都不行

這個函數的功能就是傳入什么參數就打印出來什么

def reus(x,y,z): #x y z是3個形參
    print(x)
    print(y)
    print(z)
reus(1,2,3)#因為形參是三個,所以實參也得是3個,得一一對應,不然就會報錯

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

2

3

 

我們試下形參是3個,實參傳2個試試(直接報錯了,也就是說少傳參數是不行的)

def reus(x,y,z):
    print(x)
    print(y)
    print(z)
reus(1,2)

TypeError: reus() missing 1 required positional argument: 'z'

 

required   [rɪ'kwaɪəd] 必須的

positional  [pəˈzɪʃənəl]  位置

 

(4)關鍵字參數,傳參數的時候給指定的形參賦值,並不需要考慮位置的先后順序,只要形參和實參的個數是一一對應的就可以,多傳參數和少傳參數都不行

 

def reus(x,y,z):
    print(x)
    print(y)
    print(z)
reus(y=5,x=4,z=6)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py
4
5
6

(5)位置參數和關鍵字參數混合使用

位置參數必須在關鍵字參數左邊
def reus(x,y,z):
    print(x)
    print(y)
    print(z)
reus(4,y=5,z=6) #4就是位置參數,y=5,z=6就是關鍵字參數

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py
4
5
6 

這個位置參數也是在關鍵字參數左邊,為什么報錯呢?

因為傳參數的時候,第一個參數4賦值給了x,第二個參數6賦值給了y,第三個又傳給了y的值等於5, 我們翻譯下報錯信息就是,這個reus函數的y參數被賦了多個值,所以這里就知道了,一個形參是不能被傳參多次的

def reus(x,y,z):
    print(x)
    print(y)
    print(z)
reus(4,6,y=5)

TypeError: reus() got multiple values for argument 'y'

multiple  [ˈmʌltɪpl]  多個

 

(6)默認參數

 y="linux"就是默認參數,如果傳參的時候不傳這個參數就使用默認的,如果傳入的話就使用傳入的值

def reus(x,y="linux"):
    print(x)
    print(y)
reus(4)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

4

linux

 

這里為什么把66也括起來呢,因為上面的默認參數就是一個字符串,下面實參也要是字符串

def reus(x,y="linux"):
    print(x)
    print(y)
reus(4,"66")

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

4

66

 

(7)參數組   **字典   *列表   (也叫可變長參數)

 

def atest(x,*args):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print (args)
atest(1,2,3,4,5,6) #1傳入x,剩下的都傳給args了當成一個元組的方式打印出來了

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

(2, 3, 4, 5, 6)

 

(7).1還能按照索引的方式打印,這就是非固定長度的參數

def atest(x,*args):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print (args)
    print(args[0])
atest(1,2,3,4,5,6)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

(2, 3, 4, 5, 6)

2

 

(7).2也可以傳入多個值給args,但是函數中並不處理這個args,也是可以的

def atest(x,*args):  #args 是第二個形參 *是一個特殊用法
    print (x)
atest(1,2,3,4,5,6)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

 

 

也可不傳

def atest(x,*args):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print(args)
atest(1)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

()

 

(7).3如果給args傳入的是2個列表呢

他會把這2個列表作為2個整體傳給args,然后以元組的方式打印出來,這2個列表作為這個元組的2個元素

a=[22,33,44,55,66]
b=["heh","beiye"]
def atest(x,*args):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print(args)
atest(1,(a),(b))

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

([22, 33, 44, 55, 66], ['heh', 'beiye'])

 

傳入2個字典也是一樣的

他會把這2個字典作為2個整體傳給args,然后以元組的方式打印出來,這2個字典作為這個元組的2個元素

a={"name":"gou"}
b={"age":28}
def atest(x,*args):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print(args)
atest(1,(a),(b))

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

({'name': 'gou'}, {'age': 28})

 

(7).4問題來了,如果我不想讓列表和字典作為一個整體傳給args呢,而是遍歷一下傳給args

列表的時候應該怎么遍歷呢

 

傳入參數是列表的時候用1個*(傳參數是元組也是用一個*就不舉例子了)

下面的第一個實參 "哈哈"傳給了x,

a和b這2個參數是2個列表傳給了args,傳列表用一個*  這是固定用法,傳字典用2個

a=[1,2,3]
b=[4,5,6]
def atest(x,*args):  #args 是第二個形參 *是一個特殊用法
     print (x)
     print(args)
atest("哈哈",*(a),*(b))

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

哈哈

(1, 2, 3, 4, 5, 6)

 

要想取到列表中的6這個元素該怎么取(索引方式就可以取到了)

a=[1,2,3]
b=[4,5,6]
def atest(x,*args):  #args 是第二個形參 *是一個特殊用法
     print (x)
     print(args[5])
atest("哈哈",*(a),*(b))

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

哈哈

6

 

(7).5傳入參數是字典的時候用2個*     **kwargs

a={"name":"gou"}
b={"age":28}
def atest(x,**kwargs):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print(kwargs)
atest(1,**(a),**(b))

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

{'name': 'gou', 'age': 28}

 

要想取到字典里面的28這個value應該怎么取呢

a={"name":"gou"}
b={"age":28}
def atest(x,**kwargs):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print(kwargs["age"])
atest(1,**(a),**(b))

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

28

 

a={"name":"gou"}
b={"age":28}
def atest(x,**kwargs):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print(kwargs.get("age"))
atest(1,**(a),**(b))

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

28

 

 

要想取到字典里面所有的value呢,就可以用字典的方法了

a={"name":"gou"}
b={"age":28}
def atest(x,**kwargs):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print(kwargs.values())
atest(1,**(a),**(b))

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

dict_values([28, 'gou'])

 

也可以這樣寫,最后也會以字典的方式打印出來

def atest(x,**args):  #args 是第二個形參 *是一個特殊用法
    print (x)
    print(args)
atest(1,y=2,z=3)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

{'z': 3, 'y': 2}

 

(7).6   *args   **kwargs  兩者連接起來使用,無所不能,可以接受任意長度的參數

 

def atest(x,*args,**kwargs):
    print (x)
    print(args)
    print (kwargs)
atest(1,11,22,33,44,y=2,z=3)

C:\python35\python3.exe D:/pyproject/day14函數/hanshu.py

1

(11, 22, 33, 44)

{'y': 2, 'z': 3}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM