tuple在python中是一種不可變動(immutable)的資料結構,相較於list是可變動的(mutable),兩者共同都可以使用index來讀取值,但因為tuple為不可變動,所以一經宣告即無法修改其中的值。
1 | 'Black Tea', 'regular', 'sugar free') # 我要一杯紅茶,正常冰量不加糖 drink = ( |
tuple在python中是一種不可變動(immutable)的資料結構,相較於list是可變動的(mutable),兩者共同都可以使用index來讀取值,但因為tuple為不可變動,所以一經宣告即無法修改其中的值。
1 | >>> drink = ('Black Tea', 'regular', 'sugar free') # 我要一杯紅茶,正常冰量不加糖 |
之前曾介紹過Python透過LEGB規則來參照變數,今天要介紹有兩個python的關鍵字可以打破這樣的規則
如果我們需要在函式內部修改global變數,可以使用global來宣告函式內的變數,再進一步作修改
1 | var = 5 |
呼叫access_local的函數後,此時依照LEGB的規則,access_local內的var為local變數,因此對var作任何操作都不會影響到global變數。但在呼叫access_global函數後,此時函式內的var經過global宣告後即為global變數,此時對var作的操作就會影響到原本的global變數。
談到closure,首先要先瞭解First-cass Function,所謂的first-class function是指函式可以被assign給變數或儲存於資料結構中,並且可以作為其他函數的參數,或是作為其他的函數的回傳值。而python裡的每個function都是first-class function,所以在python中可以作到以下的操作:
1 | def max(m, n): |
我們可以把max這個函式assign給func,再使用func來實際使用max這個函式。
python的namespace是一種”name-to-object”的對應關係,而在不同的namespace之間都有各自的作用域,就像是不同的module中雖然都定義了相同的名稱的函式,但卻不會互相影響。為了找到特定的”name-to-object”的namespace,python會採用scope的概念來找到特定object的所屬變數或是函式,而搜尋順序即是LEBG規則。
python的scope規則LEGB查找順序分別為 Local -> Enclosed -> Global -> Built-in
Local: 宣告於於function或是class內的name
Enclosed: 封閉的function,function被另一個function包起來,常見為Closure
Global: 最上層位於module的global name
Build-in: 內建module的name,例如print, input等等
以下舉幾個範例說明:
在寫sql的時候,一開始總是習慣帶入一支完整的sql,遇到要替換的地方就在程式用取代來處理。例如下面這個範例,為了insert不用的資料,用format來作字串替代完成一支sql
1 | >>> sql = "INSERT INTO ALBUM(TITLE, ARTIST_ID) VALUES ('{0}',{1})" |
可以看到要insert的資料,如果是char型態會用’’括起來。但是當今天要取代的字串有特殊符號或是有引號處理起來就會很麻煩,像下面的例子在insert到db時就會造成syntax error
很特別的可以直接當作一個函式的參數來使用。如果當作函式的參數,可以用來限定*之後不可以使用位置引數,但可以使用關鍵字引數,這樣的使用方法被稱為Keyword-Only Arguments
以下以位置引數(Positional Argument)與關鍵字引數(Keyword Argument)中的計算小考平均成績為例說明:
1 | def total_score(eng_score, math_score, eng_weight=0.5, math_weight=0.5): |
我們可以透過拆開運算符,來達到建立具有接收不固定位置引數和不估定關鍵字引數的函式。假設我們今天要建立一個,可以讀取不固定引數數量的函式,就會很有用。
舉例來說,當我們要建立一個能將所有引數平方相加函式,可以使用下列寫法:
Python函式參數所接收的引數(Argument),主要可以分成兩種,分別為位置引數(Positional Argument)和關鍵字引數(Keyword Argment),以下我們先來看個例子,說明什麼是位置引數
1 | def total_score(eng_score, math_score, eng_weight, math_weight): |
在處理python的序列資料(tuple, list)或是映射資料(dict),並要把資料傳入function時,可使用*和**運算符來分別對兩種資料作unpacking並傳入函式
針對序列(tuple, list)可以使用拆開序列運算符(sequence unpacking operator),在變數前加上*前綴來達成
寫python在做字串格式化的時候,常常會使用format來達成。一般簡單的format用法,會使用大括弧加數字編號配合引數順序做取代
1 | >>> str = "My name is {0}, and I'm {1} years old".format('Tom', 18) |
在Python3.1開始可以省略數字編號