復習 函數
函數
(1)函數就是完成特定功能的一個語句組,這組語句可以作為一個單位使用,並且給他取一個名字。
(2)可以通過函數名在程序的不同地方多次執行(即,函數的調用)
(3)預定義函數,可以直接使用
(4)自定義函數,用戶自己編寫
(5)為社麽使用函數:
① 降低編程難度
- 通常將一個復雜的大問題分解成一系列小問題,然後將小問題劃分成更小的問題,當問題細化為足夠簡單時,就可以分而治之,各個小問題解決了,大問題就迎刃而解了。
② 代碼重用
- 避免重復勞動,提升效率
定義函數:
函數的定義和調用:
- def 函數名([參數列表]): // 定義 - 函數名([參數列表]) // 調用
函數名的命名規則:
函數名可以是以字母,數字,下劃線命名的,但是不能以數字開頭
函數名在定義的時候跟變量有點區別
"變量"都是定義成 小寫 的;
"函數名" 如果是由兩個單詞組成,第二個單詞首字母要大寫,也就是說,如果由多個單詞組成,除了開頭第一個單詞首字母不要大寫,其余單詞首字母都要大寫;兩個單詞之間可以通過下劃線連接;
"類"的命名:每個單詞首字母都要大寫;
要養成這樣的規範習慣。
定義函數例子:
def fun(): print "hello world"
函數調用:
fun() hello world
舉例:
當我執行腳本的時候,提示我從鍵盤讀取輸入:
結果:
1.2 函數的參數
形參和實參:
- 在定義函數的時候,函數名後面括號中的變量名稱叫做“形式參數”,或者稱為“形參”
- 在調用函數時,函數名後面括號中的變量名稱叫做“實際參數”,或者稱為“實參”
形參:
def fun(x, y): print x + y
x , y 是2個形式參數
調用(傳參):
fun(2, 3) 5
舉例:
判斷並打印最大的數
調用
實際參數:
import sys print sys.argv[1]
打印參數
python test.py 1 2 1
舉例:
判斷是否是數字
結果:
1.3 函數的默認參數
練習
打印系統所有的PID
要求從 /proc 讀取
os.listdir()
import os os.listdir()
os.listdir() 幫助信息
用法:
os.listdir('/proc')
腳本:
import sys import os def isNum(s): for i in s: if i in '0123456789': pass else: break else: print s for i in os.listdir('/proc'): isNum(i)
默認參數
缺省參數(默認參數)
def fun(x, y = 100): print x, y
調用:
fun(1, 2) fun(1)
結果自然不同
舉例解釋:
調用的時候,實參會代替100
只有一個參數的時候,y使用默認的值
舉例:
若指定參數,則
錯誤舉例:
def fun(x=2, y): print x + y
報錯:
結論:
默認參數只能在最後的形參上,不能在前面或中間,只能在最後,方向從右到左,比如有3個參數,定義默認參數可以是"最後一個參數" ,或"第二個和最後一個",或"第一和第二和第三個參數"都定義。
默認參數主要看位置
本節總結:
默認參數就是我們在調用函數的時候,如果沒有給函數傳值得話,會使用默認參數給函數傳值
1.4 函數的變量
局部變量和全局變量
- python中的任何變量都有特定的作用域
- 在函數中定義的變量一般只能在該函數內部使用,這些只能在程序特定部分使用的變量,稱之為局部變量;
- 在一個文件頂部定義的變量可以供文件中的任何函數調用,這些可以為整個程序所使用的變量稱之為全局變量。
局部變量:
def fun(): x = 100 print x fun()
全局變量:
x = "global var" def fun(): x = 100 print x fun() print x
通過關鍵字聲明:
在函數裏面,把x聲明為全局變量
x = 100 def fun(): global x x += 1 print x fun()
同理,在函數內部將關鍵字聲明為全局變量,當函數被調用的時候,在外部能打印出函數內部的變量:
x = 100 def fun(): global x x += 1 global y y = 1 fun() print x print y
locals 的用法(試一下):
x = 100 def fun(): x = 1 y = 1 print locals() fun() print locals()
鏈接:http://blog.csdn.net/scelong/article/details/6977867
1.5 函數的返回值
- 函數被調用後會返回一個指定的值
- 函數調用後默認返回None
- return 返回值
- 返回值可以是任意類型
- return執行後,函數終止
- return與print的區別
函數被調用後會返回一個指定值
執行腳本:
None就是函數的返回值
修改腳本:
執行腳本:
這個返回值可是任意類型,也可以返回True
1.6 多類型傳值和冗余參數
多類型傳值
定義函數
def fun(x, y): return x + y print fun(3, 5)
將一個元組傳入函數
t = (3, 7) fun(*t) 10 #返回的函數結果
舉例:
傳入多個參數的三種形式:
錯誤的寫法:
所以,元組不能寫在前面
另外,還可以指定參數值,如下
傳入的參數名字一定要和函數內形參的名字要一致,下面兩種錯誤的方法:
'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
舉例:
舉例:
復習 函數