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