1. 程式人生 > >Python基礎【day04】:函數介紹、參數調用

Python基礎【day04】:函數介紹、參數調用

位置 方式 tab 端口 調用 alt 調用函數 一次 參數調用

本節內容

函數介紹

函數參數及調用

函數的非固定參數

函數介紹

一、介紹  

在我們以往的學習編程的過程當中,碰到的最多的兩張編程方式或者說編程方法:面向過程和面向對象。其實不管是哪一種,其實都是編程的方法論而已。但是現在有一種更古老的編程方式:函數式編程,以它的不保存的狀態,不修改變量等特性,重新進入我們的視野。

面向對象 --->類 ---->class
面向過程 --->過程--->def
函數式編程-->函數--->def

二、函數定義  

我們上初中那會也學過函數,即:y=2x,說白了,這裏面總共就兩個變量x和y,x是自變量,y是因變量(因為x變而變),y是x的函數。自變量的取值範圍,叫做這個函數的定義域。

  說了這麽多,我們還是來講講,編程中的函數定義吧!!!

1、函數定義:
2、過程定義:
3、兩者比較:
小結:不難看出,函數和過程其實在python中沒有過多的界限,當有return時,則輸出返回值,當沒有return,則返回None

三、使用函數原因

 至此、我們已經了解了函數,但是我們為啥要用函數啊,我覺的我們以前的那種寫法挺好的呀!其實不然,我給使用函數總結 了兩點好處:

代碼重復利用
可擴展性
保持一致性

1、代碼重復利用

  我們平時寫代碼的時候,最討厭的就是寫重復代碼,這個無疑是增加我們的工作量,所以代碼重用性是非常有必要的。下面我們就舉個簡單的例子吧,使用函數和不使用函數的區別。

①優化前
那麽假設有n個函數,我們是不是也要拷貝n次吶?於是,我們就誕生了下面的方法

②優化後

2、可擴展,代碼保持一致性

註:如果遇到代碼邏輯變了,用以前拷貝n次的方法,那什麽時候拷貝完啊,而且中間有遺漏怎麽辦,如果用了函數,我們只需要改這個函數的邏輯即可,不用改其他任何地方。

函數參數及調用

一、返回值


之前在day3-函數介紹中提到了return關鍵字,但是那個只是提到,並沒有詳細的介紹的return關鍵字的用法,下面我們就來詳細的闡述一下。

1、return作用

  return其實有兩個作用:

需要用一個變量來接受程序結束後返回的結果
它是作為一個結束符,終止程序運行
註:從上面的代碼可以看出,return 0後面的代碼就不執行了,只執行return前面的代碼;變量x接受了test()函數結束後的返回結果

2、返回多個值

  上面我們試了返回一個常量值,或者說一個對象值,下面我們來試試,不返回值,或者說返回多個值得情況
從上面的例子可以看出:

沒有定義,返回值數=0,返回:None
只定義了1個返回值,返回值=1 ,返回:定義的那個值,或者說定義的那個object
定義了2個以上,返回值 > 1,返回:1個元組(tuple)
提問:這邊我們不經意的要問,為什麽要有返回值?

因為我們想要想要這個函數的執行結果,這個執行結果會在後面的程序運行過程中需要用到。

二、有參數函數調用


 在此之前,我們演示的函數都是沒有帶參數的,下面我們就來說說帶參數的函數。在講之前,我們先來說一下,什麽是形參,什麽是實參吧!

形參:指的是形式參數,是虛擬的,不占用內存空間,形參單元只有被調用的時才分配內存單元
實參:指的是實際參數,是一個變量,占用內存空間,數據傳遞單向,實參傳給形參,形參不能傳給實參
代碼如下:

1、位置參數

從上面的例子可以看出,實際參數和形式參數是一一對應的,如果調換位置,x和y被調用的時,位置也會互換,代碼如下:
那有些同學會說,那我多一個或者少一個參數,總歸沒事了吧!那我看看行不行呢?

①多一個參數
②少一個參數

2、關鍵字參數

 到這邊有些小夥伴不經意的要說,像這種位置參數,有點死,我不想這麽幹,萬一我傳錯了咋辦,對吧!OK,沒有問題,下面我們就來講講關鍵字傳參。

 關鍵字傳參不需要一一對應,只需要你指定你的哪個形參調用哪一個實參即可,代碼如下:

但是,這是又有小夥伴要問了,那我可不可以位置參數和關鍵字參數結合起來用吶?接下來,我們就來探討一下。

①位置參數在前,關鍵字參數在後
我擦這樣是可以的,那我試試這種情況,我把後面關鍵字不傳給y,我傳給x,代碼如下:

報錯的意思是:給形參x傳的值過多。這種報錯的原因是:實參1已經傳給了形參x,後面的x=2又傳了一次,所以報錯。

②關鍵字在前,位置參數在後
我去,看來這樣不行。那我位置參數放前面,中間放關鍵字參數總行了吧!代碼如下:

還是一樣的錯誤,我去,那我只能把關鍵字參數放最後試試!

那我最後兩個用關鍵字參數吶?

總結:

既有關鍵字,又有位置參數時,是按位置參數的順序來
關鍵字參數是不能寫在位置參數的前面的

函數的非固定參數

一、概述

在上一篇博客中我已經寫了,位置參數和關鍵字參數,下面我們來談談默認參數和參數組

二、默認參數

默認參數指的是,我們在傳參之前,先給參數制定一個默認的值。當我們調用函數時,默認參數是非必須傳遞的。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def test(x,y=2): print(x) print(y) print("-----data1----") test(1) #沒有給默認參數傳值 print("-----data2----") test(1,3) #給默認參數傳位置參數 print("-----data3----") test(1,y=3) #給默認參數傳關鍵字參數 #輸出 -----data1---- 1 2 -----data2---- 1 3 -----data3---- 1 3

默認參數用途:

  • 安裝默認軟件(def test(x,soft=True))
  • 傳遞一下默認的值(定義mysql的默認端口號:def count(host,port=3306))

三、參數組

之前我們傳參數,都是傳一個固定參數,不能多也不能少,但是如果說我們需要非固定參數怎麽辦呢?好吧,於是就衍生出了,以下兩種傳參方式:

  1. 非固定位置參數傳參(*args)
  2. 非固定關鍵字傳參(**kwargs)

下面我們就來說說這兩種方式傳參:

1、非固定位置參數傳參

①功能:接收N個位置參數,轉換成元組的形式。

②定義,代碼如下:

1 2 3 4 5 6 7 def test(*args): #形參必須以*開頭,args參數名隨便定義,但是最好按規範來,定義成args print(args) test(1,2,3,4,5) #輸入多個位置參數 #輸出 (1, 2, 3, 4, 5) #多個參數轉換成元組

這邊不禁的有個疑問,你這是傳入的都是N個位置參數,那我要傳入一整個列表咋辦,我要完全的獲取這個列表的值。

③傳入列表

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def test(*args): print(args) print("-------data1-----") test() #如果什麽都不傳入的話,則輸出空元組 print("-------data2-----") test(*[1,2,3,4,5]) #如果在傳入的列表的前面加*,輸出的args = tuple([1,2,3,4,5]) print("-------data3-----") test([1,2,3,4,5]) #如果再傳入的列表前不加*,則列表被當做單個位置參數,所以輸出的結果是元組中的一個元素 #輸出 -------data1----- () -------data2----- (1, 2, 3, 4, 5) -------data3----- ([1, 2, 3, 4, 5],)

④位置參數和非固定位置參數

1 2 3 4 5 6 7 8 9 def test(x,*args): print(x) #位置參數 print(args) #非固定參數 test(1,2,3,4,5,6) #輸出 1 (2, 3, 4, 5, 6)

從上面看出,第1個參數,被當做位置參數,剩下的被當做非固定位置參數。

⑤關鍵字和非固定位置參數

1 2 3 4 5 6 7 8 9 10 11 def test(x,*args): print(x) print(args) test(x=1,2,3,4,5,6) #輸出 File "D:/PycharmProjects/pyhomework/day3/非固定參數/非關鍵字參數.py", line 21 test(x=1,2,3,4,5,6) ^ SyntaxError: positional argument follows keyword argument #位置參數在關鍵字參數後面

很顯然報錯了,因為x=1是關鍵字參數,*args是位置參數,而關鍵字參數不能再位置參數前面的,所以報錯。

2、非固定關鍵字傳參

功能:把N個關鍵字參數,轉換成字典形式

②定義,代碼如下:

③傳入字典
然而,有些小夥伴說,我就不信,難道不加**,就會報錯,那為啥非固定位置參數不加*,為啥就不報錯吶?下面我們就用事實說話,代碼如下:
因為傳入的字典被當做位置參數,所以被報類型錯誤,所以小夥伴們千萬要記住:傳字典,加**

④配合位置參數使用
⑤位置參數、關鍵字和非固定關鍵字參數

提示:參數組一定要往最後放
註:就是說,如果遇到一個關鍵字傳參和非固定關鍵字傳參,前後放的位置是不影響傳參的,但是我們一般還是按順序來。

⑥位置參數、關鍵字參數、非固定位置參數和非固定關鍵字參數

那麽問題來了,上面的age傳參傳的是位置參數,那我能不能傳關鍵字參數吶?現在我們就來看看,代碼如下:
看來是不可以的,為什麽?因為age=19是關鍵字參數,而後面的*args是非固定位置參數,說白了不管*args傳入幾個字,它的本質都是位置參數,上面我們提到關鍵字參數是不能再位置參數的前面,所以報錯了。

  看來上面的情況是不可以的,那能不能非固定關鍵字參數在非固定位置參數前面呢?來,我們帶著疑問一起來試一下。代碼如下:

我擦咧,也是不可以的,經我仔細研究發現,非固定關鍵字參數,本質也是關鍵字參數,是不能放在非固定位置參數的前面的。

四、總結

  1. 參數分為位置參數、關鍵字參數、默認參數、非固定位置參數和非固定關鍵字參數
  2. 位置參數之前傳參,位置是不能調換的,多一個或者少一個參數都是不可以的。
  3. 關鍵字參數是不能放在位置參數前面的。
  4. 函數傳參的位置一次是,位置參數,默認參數、非固定位置參數、非固定關鍵字參數(def test(name,age=18,*args,**kwargs))
  5. 關鍵字傳參,可以不用考慮位置的前後問題

Python基礎【day04】:函數介紹、參數調用