正如其他的程式語言,我們都會將常用到的一段程式定義成一個函式(Function),且有點 Functional Programming 的感覺。但應該比較少人聽過我們可以透過 Class ,把 Python 當 Object Oriented Programming 來寫。當然,這篇教學還不會對程式設計原則做深入探討這些原理背後的精神。

首先先稍微說明一下 Function 和 Class 之間的差別。Function 基本上會有一個主要的功能,並且我們宣告和呼叫一個 Function 的目的是為了減少撰寫重複的程式碼;例如:print() 就是一個輸出字元到 stdout 的一個 function。而 Class 主要為一個物件的藍圖,它可以擁有 variables 和 function;例如:bird() 這個 class 裡面會有 name 的變數,和 tweet() 的方法。

函式 Function

當我們要定義一個函式的時候,我們會用 def 來做宣告一個函式;並且 () 內為輸入(input)值。我們也可以在定義一些預設的 input,如範例裡面的。

def say_hello(name, loud=False):
    if loud:
        print('HELLO, {}!'.format(name).upper())
    else:
        print('Hello, {}!'.format(name))
hello('Tom')               # Hello, Tom
hello('Harry', loud=True)  # HELLO, HARRY!

再來要強調一個 Python 裡很重要的語法觀念,就是 indentation (縮排)。Python 跟其他語言一個很不一樣的地方再與不是利用 {} 來判斷程式碼段落,而是這對程式碼的縮排來判斷一段程式。再加上 Python 裡 tabspace 是不同的東西,因此會鼓勵大家都用空格(4個)為縮排標準。

Internal Functions

正如上面範例碼,當我想要呼叫一個函式的時候,我直接打出函式名稱和輸入值就可以了~ 但是各位有沒有想過,為什麼我們不需要定義 print() 呢?那是因為它已經是 Python 內建函式啦。當然還有之前學過的 len()range(),還有資料形態變換使用的 int()str()list()等等。

pi = 3.142
print(int(pi))      # 3
print(str(pi))      # 3.142
# 當然,有些資料形態是無法互相轉換的...
print(list(pi))     # TypeError: 'float' object is not iterable

Lambda Function

又被稱為 Anonymous Function (匿名函式)。正如他的名字,一個匿名函式不需要定義函式名字。而匿名函式通常只會用在小型,並且在程式碼的其他地方不會重複呼叫的程式。之後大家在用一些像是 map()filter() 的時候就會很常看到 lambda 了。

# Syntax: lambda 傳入值: 函式
lambda x, y: x + y
# 當然也是可以拿來定義 function
add = lambda x, y : x + y
add(4,6)    # 10

這個理念是從 Lambda Calculus 的哲學來的,並且很多 Functional Programming 如:JavaScript 會很常利用這個精神;逐漸的其他的非 Functional Programming 的語言也開始在應用它。 ### 類別 Class 類別可以想像成是建立一個物件的藍圖或模板。例如我們的程式碼裡需要宣告很多種鳥,我們可能可以先宣告一個 Bird() 的 Class,如果我們之後需要創立一隻鸚鵡,或雞的時候,我們就可以直接依據這個模板宣告一個 parrot()chicken() 物件

class Bird():
  name = bird
  can_fly = True
  def __init__(self, name):
    self.name = name
  def fly(self):
    if self.can_fly:
      print(Weee!!!)
    elif not self.can_fly:
      print(I believe I can fly... QQ)
parrot = Bird(Parrot)
print(parrot.name)          # Parrot
print(parrot.can_fly)       # True
print(type(parrot))         # <class '__main__.Bird'>
chicken = Bird(Chicken)
chicken.can_fly = False
chicken.fly()               # I believe I can fly... QQ

這裡不會再深入去談一些 Python 物件導向的細節。要提的一點是,當我們在呼叫 import 進來的套件時,基本上就跟 class 的方式是一樣的。 ## 檔案 Files Python 裡面其實還有一種資料形態叫做 Files。我們只要用 open() 的內建函式就可以開啟一個 File 了。主要的開襠模式有這些:

Mode Function
r read
w write
x create
a append
b binary
filepath = textbook/ebook.txt
# Syntax (path, mode, [encoding], [errors])
f = open(filepath, 'w', encoding='utf-8', errors='replace') # 以 write 模式開啟路徑裡的檔案
f.write(這裡可以輸入要寫入檔案的資料)
f.close()   # 記得要關閉檔案

注:

在 Python 裡宣告 Function 的時候會鼓勵使用全小寫並底線分字(lowercase_and_underscore, a.k.a snake_case)來命名;而宣告 Class 則會鼓勵使用大寫分字(CapsWordsConvention, a.k.a camelCase)來命名哦~

Leave a Reply

Your email address will not be published. Required fields are marked *