天天看點

複習 函數

1.1 函數定義

函數

(1)函數就是完成特定功能的一個語句組,這組語句可以作為一個機關使用,并且給他取一個名字。

(2)可以通過函數名在程式的不同地方多次執行(即,函數的調用)

(3)預定義函數,可以直接使用

(4)自定義函數,使用者自己編寫

(5)為社麼使用函數:

         ① 降低程式設計難度

                - 通常将一個複雜的大問題分解成一系列小問題,然後将小問題劃分成更小的問題,當問題細化為足夠簡單時,就可以分而治之,各個小問題解決了,大問題就迎刃而解了。

         ② 代碼重用

                - 避免重複勞動,提升效率

定義函數:

函數的定義和調用:

<code>    </code><code>- def 函數名([參數清單]):        </code><code>//</code> <code>定義</code>

<code>    </code><code>- 函數名([參數清單])         </code><code>//</code> <code>調用</code>

函數名的命名規則:

    函數名可以是以字母,數字,下劃線命名的,但是不能以數字開頭

    函數名在定義的時候跟變量有點差別

        "變量"都是定義成 小寫 的;

        "函數名" 如果是由兩個單詞組成,第二個單詞首字母要大寫,也就是說,如果由多個單詞組成,除了開頭第一個單詞首字母不要大寫,其餘單詞首字母都要大寫;兩個單詞之間可以通過下劃線連接配接;

        "類"的命名:每個單詞首字母都要大寫;

    要養成這樣的規範習慣。

定義函數例子:

<code>def</code> <code>fun():</code>

<code>    </code><code>print</code> <code>"hello world"</code>

函數調用:

<code>fun()</code>

<code>hello world</code>

舉例:

當我執行腳本的時候,提示我從鍵盤讀取輸入:

結果:

1.2 函數的參數

形參和實參:

- 在定義函數的時候,函數名後面括号中的變量名稱叫做“形式參數”,或者稱為“形參”

- 在調用函數時,函數名後面括号中的變量名稱叫做“實際參數”,或者稱為“實參”

形參:

<code>    </code><code>def</code>  <code>fun(x, y):</code>

<code>        </code><code>print</code> <code>x </code><code>+</code> <code>y</code>

x , y 是2個形式參數

調用(傳參):

<code>fun(</code><code>2</code><code>, </code><code>3</code><code>)</code>

<code>5</code>

判斷并列印最大的數

調用

實際參數:

<code>import</code> <code>sys</code>

<code>print</code> <code>sys.argv[</code><code>1</code><code>]</code>

列印參數

<code>python </code><code>test</code><code>.py 1 2</code>

<code>1</code>

判斷是否是數字

1.3 函數的預設參數

練習

列印系統所有的PID

    要求從 /proc 讀取

    os.listdir()

<code>import</code> <code>os </code>

<code>os.listdir()</code>

os.listdir() 幫助資訊

用法:

<code>os.listdir(</code><code>'/proc'</code><code>)</code>

腳本:

<code>import</code> <code>os</code>

<code>def</code> <code>isNum(s):</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>s:</code>

<code>        </code><code>if</code> <code>i </code><code>in</code> <code>'0123456789'</code><code>:</code>

<code>            </code><code>pass</code>

<code>        </code><code>else</code><code>:</code>

<code>            </code><code>break</code>

<code>    </code><code>else</code><code>:</code>

<code>            </code><code>print</code> <code>s</code>

<code>for</code> <code>i </code><code>in</code> <code>os.listdir(</code><code>'/proc'</code><code>):</code>

<code>    </code><code>isNum(i)</code>

預設參數

預設參數(預設參數)

<code>def</code> <code>fun(x, y </code><code>=</code> <code>100</code><code>):</code>

<code>    </code><code>print</code> <code>x, y</code>

調用:

<code>fun(</code><code>1</code><code>, </code><code>2</code><code>)</code>

<code>fun(</code><code>1</code><code>)</code>

結果自然不同

舉例解釋:

調用的時候,實參會代替100

隻有一個參數的時候,y使用預設的值

若指定參數,則

錯誤舉例:

<code>def</code> <code>fun(x</code><code>=</code><code>2</code><code>, y):</code>

<code>    </code><code>print</code> <code>x </code><code>+</code> <code>y</code>

報錯:

結論:

    預設參數隻能在最後的形參上,不能在前面或中間,隻能在最後,方向從右到左,比如有3個參數,定義預設參數可以是"最後一個參數" ,或"第二個和最後一個",或"第一和第二和第三個參數"都定義。

預設參數主要看位置

本節總結:

預設參數就是我們在調用函數的時候,如果沒有給函數傳值得話,會使用預設參數給函數傳值

1.4 函數的變量

局部變量和全局變量

- python中的任何變量都有特定的作用域

- 在函數中定義的變量一般隻能在該函數内部使用,這些隻能在程式特定部分使用的變量,稱之為局部變量;

- 在一個檔案頂部定義的變量可以供檔案中的任何函數調用,這些可以為整個程式所使用的變量稱之為全局變量。

局部變量:

<code>    </code><code>x </code><code>=</code> <code>100</code> 

<code>    </code><code>print</code> <code>x</code>

全局變量:

<code>x </code><code>=</code> <code>"global var"</code>

<code>    </code><code>x </code><code>=</code> <code>100</code>

<code>print</code> <code>x</code>

通過關鍵字聲明:

在函數裡面,把x聲明為全局變量

<code>x </code><code>=</code> <code>100</code>

<code>    </code><code>global</code> <code>x</code>

<code>    </code><code>x </code><code>+</code><code>=</code> <code>1</code>

同理,在函數内部将關鍵字聲明為全局變量,當函數被調用的時候,在外部能列印出函數内部的變量:

<code>    </code><code>global</code> <code>y</code>

<code>    </code><code>y </code><code>=</code> <code>1</code>

<code>print</code> <code>y</code>

locals 的用法(試一下):

<code>    </code><code>x </code><code>=</code> <code>1</code>

<code>    </code><code>print</code> <code>locals</code><code>()</code>

<code>    </code> 

<code>print</code> <code>locals</code><code>()</code>

1.5 函數的傳回值

- 函數被調用後會傳回一個指定的值

- 函數調用後預設傳回None

- return 傳回值

- 傳回值可以是任意類型

- return執行後,函數終止

- return與print的差別

函數被調用後會傳回一個指定值

執行腳本:

None就是函數的傳回值

修改腳本:

這個傳回值可是任意類型,也可以傳回True

1.6 多類型傳值和備援參數

多類型傳值

定義函數

<code>def</code> <code>fun(x, y):</code>

<code>    </code><code>return</code> <code>x </code><code>+</code> <code>y</code>

<code>print</code> <code>fun(</code><code>3</code><code>, </code><code>5</code><code>)</code>

将一個元組傳入函數

<code>t </code><code>=</code> <code>(</code><code>3</code><code>, </code><code>7</code><code>)</code>

<code>fun(</code><code>*</code><code>t)</code>

<code>10</code>  <code>#傳回的函數結果</code>

傳入多個參數的三種形式:

錯誤的寫法:

是以,元組不能寫在前面

另外,還可以指定參數值,如下

傳入的參數名字一定要和函數内形參的名字要一緻,下面兩種錯誤的方法:

'x'被函數當成了一個字元串變量

a,b,c 報類型錯誤,與函數的形參不一緻,函數不知道這三個新導入的參裡面是什麼

名字一定要和形參一緻。

函數傳入字典的方法

把字典作為參數傳入函數

同理,定義的字典裡面的 key 也要和函數裡面的形參一緻

定義的字典裡面的key,要加引号,比如 'x':1,否則,不加引号字典會把x定義為變量,定義字典會報錯。

總結:

可以向函數内部傳入元組和字典,可以把元組裡面的元素作為參數傳給函數,也可以把字典裡面的value作為參數傳給函數,但是定義字典的時候字典的key一定要和函數的形參一緻。

備援參數

定義函數的時候,函數有3個參數,調用函數的時候,隻能給傳3個參數,不能傳多,也不能傳少

有時候,我們要讓函數接收多一些的參數,但是傳的時候可能隻傳了少數幾個,或者傳入更多參數。

def  fun(x, y=1, *args, **kwargs)

解釋:

x 叫預設參數(命名參數)

y=1 叫關鍵字參數

*args 和 **kwargs 叫 可變參數(或者備援參數)

傳入一個參數,傳回

再傳入一個參數,傳回

2被認為是備援參數,并且是以元組的形式往裡傳。

傳入字元串、清單傳入進去,都會存入元組裡:

再傳入一個參數 y=2:

傳回的是字典,可以多傳入幾個:

多類型傳值裡面我們定義了元組類型的變量 t,我們把他作為參數傳入函數

同理,字典也可以以參數形式傳入函數或者 a=3這種形式:

1.7 函數的遞歸調用

遞歸就是在函數内部調用他自己

通常用遞歸去調用階乘

最基本的階乘:就是循環方式實作階乘

舉例1:

舉例2:

下面使用遞歸的方式實作階乘:

首先,遞歸的注意事項:

所謂"預設結果" 就是當參數等于0的時候,傳回1

形象一點:

上圖 f(0) 的時候,結果就是1

本文轉自 聽丶飛鳥說 51CTO部落格,原文連結:http://blog.51cto.com/286577399/2046625

繼續閱讀