python 中的函數
1. 什麼是函數
- 所謂函數,就是把具有獨立功能的代碼塊組織成爲一個小模塊,在需要的時候調用
函數的使用包含兩個步驟
1.定義函數–封裝獨立的功能
2.調用函數–享受封裝的成果
- 函數的作用:
在開發時,使用函數可以提高編寫的效率以及代碼的重用
函數是帶名字的代碼塊,用於完成具體的工作
需要在程序中多次執行同一項任務時,你無需反覆編寫完成該任務的代碼,而只需調用該任務的函數,讓python運行其中的代碼,你將發現,通過使用函數,程序編寫,閱讀,測試和修復都將更容易
2. 函數的定義及調用
2.1 定義函數
函數定義規則如下:
def 函數名():
函數的代碼
# def是英文define的縮寫
# 函數名稱應該能夠表達函數封裝代碼的功能,方便後續的調用
# 函數名稱的命名應該符合標識符的命名規則
可由字母,下劃線和數字組成
不能以數字開頭
不能與關鍵字重名
示例:
def print_line():
"""The separator""" # 函數的解釋,可通過 crtl + Q 來進行查看
print "=" * 50
print_line() # 調用函數
# To call a function
執行如下:
定義函數並調用
不進行調用
2.2 函數中的參數
- 參數的作用
函數,把具有獨立功能的代碼塊組織成爲一個小模塊,在需要的時候調用
函數的參數,增加函數的通用性,針對相同的數據處理邏輯,能夠適應更多的數據
1.在函數內部,把參數當作變量使用,進行需要的數據處理
2.函數調用時,按照函數定義的參數順序,把希望在函數內部處理的數據,通過
參數傳遞- 實參,形參
- 形參: 定義函數時,小括號中的參數,是用來接收參數使用的,
在函數內部,是當作變量來使用的- 實參: 調用函數時使用,小括號中的參數,是用來把數據傳地到函數內部的
示例:建立三個函數,並對其進行調用
1. 定義對兩個數進行加法的函數
def sum_1sum(num1,num2): # 此處的參數叫做形參
"""對兩個數字進行加法運算"""
s = num1 + num2
print '%d + %d = %d' % (num1,num2,s)
sum_1sum(4,3) # 此處的參數爲實參
2. 定義一個函數,其功能是實現九九乘法表
def Mutil_list():
r = 1
while r <= 9:
c = 1
while c <= r:
s = c * r
print '%d * %d = %d\t' % (c, r, s),
c += 1
print ''
r += 1
Mutil_list() # 對函數進行調用
3. 定義一個函數,實現五行五列的星號*顯示
def star_output():
row = 1
while row <= 5:
c = 1
while c <= row:
c += 1
print '*',
print ''
row += 1
star_output() # 對函數進行調用
執行如下:
定義對兩個數進行加法的函數
定義一個函數,其功能是實現九九乘法表
定義一個函數,實現五行五列的星號*顯示
2.3 函數的調用
建立判斷語句,對函數進行調用
first = raw_input('Please input what you what:') ## 進行輸入變量的定義
if first == 'star' : ## 當輸入內容等於star 時調用star_output()函數
star_output()
elif first == 'mutil' : ## 當輸入內容等於mutil 時調用Mutil_list()函數
Mutil_list()
else: ## 否則調用求和函數sum_1sum(num1,num2)
sum_1sum(300,200)
執行如下:
調用 star_output
調用 mutil_list
調用 sum_1sum
2.4 函數的返回值
- 函數的返回值
在程序開發中,有時候,會希望一個函數執行結束後(舉例子:溫度計函數,要返回給我>們當前的溫度),告訴調用者一個結果,以便調用者針對具體的結果作出後續的處理
返回值是函數完成工作後,最後給調用者的一個結果
在函數中使用 return 關鍵字可以返回結果
調用函數一方,可以使用變量來接收函數的返回結果
示例:用函數實現功能:進行任意行,任意字符類型,任意個數,任意行數的內容
打印多行分割線
def print_line(char,times): # 定義分割線的格式
result = char * times # 定義函數內的變量
return result # 返回該值
result_ = print_line(raw_input('Please input the char you
want:'),int(raw_input('Please input the times you want:')))
# 將返回值定義成變量進行輸出
def print_lines(): # 定義分割線的類行
row = int(raw_input('Please input the line number you want:'))
while row > 0:
print result_ # 調用副函數的返回值
row -= 1
print_lines()
執行如下:
示例二:直接在第二個函數中進行形式參數的設置
def print_line(char,times): # 定義副函數,分隔符的樣式及個數
"""
進行多行分隔符的調用
:param char: 分割線使用的分隔字符
:param times: 分割線重複的次數
:return: 返回函數值
"""
print char * times
def print_lines(char,times): # 定義主函數,對副函數進行調用並規定行數
row = int(raw_input('Please input the line number you want:'))
while row > 0:
print_line(char,times)
row -= 1
print_lines('@',23)
執行如下:
2.5 進行跨模塊調用
將所有的內容寫在一個文本內顯得過於繁瑣,也不利於排錯,此時可以將函數於調用分開來,這樣利於編寫於排查錯誤。
執行如下
通過 import 加項目名進行調用
上述返回值的示例中,示例一的項目名稱爲 test.py ,
新建一個 python 項目,名爲跨模塊調用,在此項目內對test內函數進行調用
執行如下:
import fun_03
fun_03.print_lines('#',23)
使用鼠標 ctrl 點擊 函數名稱,可轉到對應函數,進行查看
具體執行如下:
3. 函數中的變量
3.1 局部變量
函數內部定義的變量爲局部變量,無法在其他位置進行調用;不同的函數,可以定義相同的名字的局部變量,但是各用各的不會產生影響
局部變量的作用
在函數內部使用,臨時保存函數內部需要使用的數據
示例:
def demo1():
num = 1 ## 局部變量
print num
demo1()
print num ## 此處的 num 爲全局變量
執行後會報錯:NameError: name ‘num’ is not defined 因爲函數內的局部變量的值無法調用到函數外部
執行如下:
在函數執行時,局部變量創生,在函數執行完後,就會被內存回收,這叫做
變量的生命週期
不同的函數可以定義名字相同的局部變量,但不會產生影響
示例:
def demo1(): # 定義函數 demo1
num = 1 # demo1 中的局部變量num 值爲1
print 'num =%d' % num # 顯示 num 的值
demo1() # 調用函數
def demo2(): # 定義函數 demo1
num = 2 # demo2 中的局部變量num 值爲2
print 'num =%d' % num # 顯示 num 的值
demo2() # 調用函數
執行如下:
注:
因爲各函數內的局部變量的名稱是否相似毫不影響,因此爲了方便區分,最好好定義成不同名稱的變量,以便區分
可將上述函數變成:
def demo1():
demo1_num = 1 ## 用來區分不同函數的變量
print demo1_num
demo1()
def demo2():
demo2_num = 2 ## 用來區分不同函數的相同名稱變量
print demo2_num
demo2()
3.2 全局變量
全局變量是在函數外部定義的變量,(沒有定義在某一個函數內),所有函數內部都可以使用這個變量
示例:
num = 38 ## 定義全局變量num的值爲38
def demo1(): ## 在函數 demo1 中進行調用
print 'num=%d' % num
demo1()
def demo2(): ## 在函數 demo2 中進行調用
print 'num=%d' % num
demo2()
還可以對全局變量進行重新賦值
可以使用global 進行聲明,函數中調用的爲全局變量,在用賦值語句,對全局變量值進行修改
num = 38
def demo1():
global num ## 表示此函數中調用的 num 爲全局變量 num
num = 22 ## 對 num 進行重新賦值
print 'demo1 =========> %d' % num
demo1() ## 進行調用
def demo2():
print 'demo2 =========> %d' % num
demo2()
執行如下:
注:
在進行變量定義時,要求對變量名稱進行區分,全局變量與局部變量名稱進行區分,在開發時,將全局變量定義到所有函數的最上方
4 函數的引用及裝飾器
首先要了解一點變量與數據是分開存儲的變量中存儲的是數據的內存地址
函數的返回值,返回的也是變量的內存地址
可通過 id (變量名)來查看
例如:
a = 10
print '變量 a 存儲的數據的內存地址爲 %d ' % id(a)
執行如下:
返回值地址示例:
a = 10
def test(num):
print '%d 在函數中調用的是 %d 地址' % (num,id(num))
result = 'python'
print '函數返回值的存儲地址爲 %d ' % id(result)
return result
r = test(a)
print '%s 的內存地址是 %d ' % (r,id(r))
執行如下:
4.1 裝飾器
詳細的關於裝飾器的理解可移步 Python裝飾器的通俗理解
- 裝飾器
概念:把一個函數當作參數,傳遞給函數
返回一個加強版的函數
本質上是一個返回函數的函數
“在不改變原函數的基礎上給函數增加功能”
最簡單的裝飾器
示例:
def func1():
print "This is func1."
# 再不改變原函數的情況下,讓func1函數的執行結果前加上一串'*'
def outer(func1):
print "**************"
func1()
outer(func1)
執行如下:
又如
def say(age): # 定義固定函數,不改變此函數的前提下爲其添加功能
print 'man is %d years old' % age
def outer(func): # 定義裝飾函數
def inner(age): # 定義內函數
if age < 0: # 作判定
age = 0
func(age) # 調用形參
return inner # 返回內函數的值
say = outer(say) # 定義新變量,其值爲裝飾函數的值,此時裝飾函數的值
# 爲 inner 的返回值
say (int(raw_input('Please input your age:')))
# 調用 say 這個重新定義的函數,及 say 的加強版
執行如下: