高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

Method

為什麼要寫method?

程式碼就這樣一行一行的寫不好嗎? 當你的程式碼超過一定的行數的時候,一行一行的寫就不會是個好的寫法。通常我們會用一個抽象的名詞,來把一群連續或複合的動作給包在一起,這樣一來程式碼變得有系統了,心情也會變得比較好,重點是,會寫method,就容易會有種變成高手的錯覺!

雖然這也許是玩笑話,但把程式碼整理到method裡,程式碼會變得比較好維護,而且也更容易可以重複使用。

定義

method定義
1
2
3
4
5
6
7
8
def calc_method(a, b = 1):
  print a * b

def args_method(*args):
  print args

def kwargs_method(**kwargs):
  print kwargs

第1行的calc_method比較容易懂,這個method會接收2個參數,其中一個還是有預設值的;第4行的args_method後面的參數加了一顆*,表示傳進去的參數args會被集中成一個Tuple;而第7行的kwargs_method則會把傳進去的參數kwargs集中成一個Dictionary。

pass!! 什麼都不做..?

前面提到Python的程式是靠縮排來區分code block的,不過如果我們寫了一個method,但裡面目前還沒想到要寫什麼,或是在if..else..的判斷裡面暫時還沒想到要寫什麼內容,如果就這樣空的不理它是不行的,這時候你就需要pass這個什麼事都不做的東西,像這樣:

1
2
def do_something():
  pass

或是像這樣:

1
2
3
4
if age >= 18:
  pass
else:
  print "kid, go back to school!"

這個pass的用途,就是只放個包包佔位置而已,其它什麼事都不做。也許你會覺得很不習慣,不過這個應該只有像在Python這種依賴縮排的程式語言才看得到的特色(?)吧。

呼叫/使用

呼叫/使用
1
2
3
4
5
6
calc_method(4)
calc_method(4, 10)
calc_method(b = 10, a = 2)

args_method(1, 2, 3)
kwargs_method(name = "eddie", age = 20)

Python的method呼叫是透過小括號(),並且可以在裡面傳參數進去,不過Python的參數還滿自由的,不一定要照著順序傳進去,像是上面這段程式碼的第3行,只要知道變數名稱,用這種方式傳也是行得通的。

回傳值

每個method執行結束,可以使用return關鍵字來指定要回傳的值,如果沒有特別指定,則回傳值是None(相當於在別的程式語言的NullNil)。所以這段程式碼的的回傳值:

1
2
3
4
def calc_method(a, b = 1):
  print a * b

print calc_method(10)

因為calc_method最後並沒明確的指示要回傳什麼值,所以上面這段程式碼的執行結果,會得到在calc_method裡印出的結果10,以及用print把回傳值None給印出來。

Lambda? 黏巴達?

Lambda
1
2
my_profile = lambda user_name, age : "%s is %i years old" % (user_name, age)
print my_profile("eddie", 30)

lambda其實就是一種匿名(anonymous)的method,它不用像一般method使用def來事先定義好。

Method Decorator

decorator的意思簡單的說,就是用某個method把你原來的method給包起來,也就是你在執行內層method之前,會先執行外層的method。這個在Python或Django的程式碼還滿常見的,主要有兩種方式來實作:

第一種是使用method來做decorator:

method decorator
1
2
3
4
5
6
7
8
9
10
11
def my_deco(func_name):
  print "Hello, this is method decorator"
  def wrapper():
    return func_name
  return wrapper

@my_deco
def real_method():
  print "This is real method"

real_method()

另一種是使用類別來做decorator:

method decorator
1
2
3
4
5
6
7
8
9
10
11
12
13
class Deco(object):
  def __init__(self, func_name):
    self.func_name = func_name

  def __call__(self, *args):
    print "This is a decorator class"
    return self.func_name(*args)

@Deco
def real_method():
  print "This is real method"

real_method()

接下來,我們來看看在Python裡面的一些基本的資料型態.. 數字!

Comments