2016年5月31日 星期二

Python_Note06

Function


函數 (function) 是一種功能性的程式碼集合,可以將程式 (program) 分割成小部分,藉由呼叫 (call) 函數安排執行順序

呼叫函數的基本方法




Built-in Function

查詢內建函數 (built-in function) : dir(__builtins__)

https://docs.python.org/3.3/library/functions.html

查詢函數用法 : 
In[76]: help(abs)
Help on built-in function abs in module builtins:

abs(x, /)
    Return the absolute value of the argument.


自訂函數


定義函數使用關鍵字 (keyword) def ,其後空一格接函數名稱與小括弧,小括弧用來放參數列 (parameter list) ,函數可以有參數 (parameter) 也可以沒有參數,沒有參數的函數的小括弧留空,另外函數可用 return 設定回傳值 (return value) ,沒有回傳值的函數也就不需要 return 。


函數的命名
  1. 函數之命名慣例:
  • GUI函數習慣以駝峰式(Camel-Case)命名 Ex: GetStudentName()
  • 一般函數習慣以小寫或輔以底線命名   Ex: sum_grades()
  • 避免非慣用縮寫
  • 函數之命名應有意義,且須指出函數之目的或回傳之資料,而非達成目的所使用的方法

Parameter and Argument


參數Parameter
引數Argument
函數運行時之
放在函數的標記式,用來說明這個函數,當它被呼叫時必須接收到什麼樣的資料
用以函數
當呼叫函數的時候,可以放在括號內的東西


傳遞引數給參數

以引數呼叫函數而將其值賦予參數以供函數(副程式)運行參考
依序一個對一個(只是一個丟接遊戲!), 這種依參數順序給定的引數
稱為positional argument
傳遞的動作可以想像成若干個賦值運算
即:
Pra1 = Arg1
Pra2 = Arg2
PraN = ArgN

函數參數傳入的型態有四種

  1. F(arg1, arg2, ...)
    最常見的格式。
  2. F(arg1, arg2=value2, ...)
    在宣告函式的時候,可以先給預設值。
  3. F(*arg1)
    不限參數數量,參數將保存為一個tuple。
  4. F(**arg1)
    不限參數數量,參數將保存為一個dictionary。
函數解析參數的過程,依序由 1> 2> 3> 4 這個順序來解析。

函數的回傳值

一 個函數於運行完畢之後可以回傳結果(也可以忽略不回傳)。當程式運行到 return陳述句時將會無條件直接離開(結束)函數並回傳結果。


回傳值可以為:
  • 單一的值或 物件
  • 多個值或物件所構成的 tuple
  • 當未使用 return陳述句時,預設將會回傳None

參數預設值可減少function call撰寫上的麻煩

即便呼叫函數時沒有給定引數,函數依然有參考值(預設參數值)。

且自定義函數的參數規則:

  • 無預設值之參數在前
  • 有預設值之參數在後

因為引數之傳遞是依序的

  • 當有預設值之參數仍有引數之分配時,引數值將會取代預設值


範例1:
# (for 迴圈版本)
n = int(input('Please input n:'))

total = 0
for i in range(1,n+1):    
    total += i   # total += i  等價於 total = total + i

print('Total is:',total)

範例2:
# (函數版本)
def sumation(n):
    total = 0
    for i in range(1,n+1):        
        total += i   # total += i  等價於 total = total + i
    print('Total is:',total)

n = int(input('Please input n:'))
sumation(n)

利用參數名稱之函數呼叫
呼叫函數時不使用參引數依序一對一對應傳遞,而是換成以參數名稱來進行傳遞與函式之呼叫(名稱呼叫)。這種依名稱傳遞的引數稱為 keyword argument




—函數 (function) 可以有不定個數的參數 (parameter),也就是可以在參數列 (paramenter list) 提供任意長度的參數個數



— *arguments 就是參數識別字 (identifier) 前面加上一個星號,當成一組序對 (tuple)
— **keywords 參數識別字前面加上兩個星號,當成一組字典(dictionary)

Yield產生器
函數 (function) 中若使用 return ,函數會直接回傳數值 (value) ,也隨之終止函數執行。若使用另一個關鍵字 (keyword) yield,可使函數產生數值,而不會結束函數執 行,這樣的函數被稱為產生器函數(generator function)

範例:
#  使用 yield 模擬 range() # 
def myrange(n):
    x = 0
    while True:
        yield x
        x += 1
        if x == n:
            break            


print(list(myrange(10)))

變數的有效範圍

每個變數有其有效範圍, 也就是被認定(認識)的範圍

Globe
一般定義在函數外的變數其範圍是一整個模組, 又稱全域變數(全域指的是整個模組)

有的時候在函數中我們希望改變或存取的是全域變數時,為了確認使用到正確的全域變數,而非定義一個新的區域變數時,我們需要利用 global敘述句來告知 python 某變數名稱指稱的是全域變數

範例:
#name 變數宣告在最外層,為全域變數
name = "Tony"
def change_name(n):
    global name   
    name = n
    print('In change_name function, name=%s' % name)

print('Before change_name function called, name=%s' % name)
change_name('John')

print('After change_name function called, name=%s' % name)

Local
被定義在一個函數中的變數稱為區域變數, 其範圍是一整個函數

以上兩種範圍都必須從變數定義被python看到開始算起
當區域變數與全域變數名稱相同產生衝突時,區域內以區域變數為主,區域外以全域變數為主


沒有留言:

張貼留言