Skip to main content

Function

function基本上是將一些操作包裝在一起來執行特定功能。

必要元素

  • def開頭定義一個function。
  • 若想要之後再定義內容,可先寫入pass,就不會讓這個空的function出現錯誤。
  • 呼叫function要加上()
def hello_func():
pass

# execute the function
print(hello_func())
# None (since no value returned)

# call function itself
print(hello_func)
# <function hello_func at 0x0000021604F2F040>

Arguments

基本上使用function的人,不需要詳細知道內部如何運作,只需要知道 輸入輸出 是什麼就行了。而輸入的參數我們就稱為arguments(下面範例就是指greeting)。

def hello_func(greeting):
return '{} Function.'.format(greeting)

print(hello_func('Hi'))

Default arguments

若function要求要輸入arguments,沒有輸入的話就會出現error。但是也可以設定default值,當沒有輸入時就將變數設定為該值(下面範例就是指name)。

def hello_func(greeting = 'Hi'):
return '{}, {}'.format(greeting)

print(hello_func())

Position arguments

指的是當呼叫函式時,傳入的 arguments的位置是最重要的。

例如你本來是想輸出 「Hi, John」,但因為輸入時未注意傳入參數順序(位置),所以function理所當然地依照順序接收arguments。

def hello_func(greeting, name):
return '{}, {}'.format(greeting, name)

print(hello_func('John', 'Hi'))
# John, Hi

Keyword arguments

相對於position arguments,keyword arguments因為有keyword附著在每一個argument上,所以就不需要在意位置關係。

def hello_func(greeting, name):
return '{}, {}'.format(greeting, name)

print(hello_func(name='John', greeting='Hi'))

*args & **kwargs

一般看到別人寫的function都會有這兩個arguments,因為代表可以接收 任意數量的arguments。

args是position arguments的縮寫,會是一tuple

kwargs是keyword arguments的縮寫,會是一dictionary

def student_info(*args, **kwargs):
print(args)
print(kwargs)
# ('Math', 'Art')
# {'name': 'John', 'age': 21}

student_info('Math', 'Art', name='John', age=21)

Unpacked

*list**dictionary代表unpacked,因此我們可以在傳入function時利用這個技巧。

def student_info(*args, **kwargs):
print(args)
print(kwargs)

courses = ['Math', 'Art']
info = {'name': 'John', 'age': 21}

student_info(*courses, **info)

Function Annotations

Python 3的函式註解,讓你在定義參數時對參數和返回值添加註解。

def foo(a: int, b: "this is b", c: str = 5) -> tuple:
return a, b, c
  • a: int 是參數註解
  • c: str = 5是有default值的參數註解
  • -> tuple是回傳值的註解

可以用__annotations__來得到

libaries, packages , modules, framework差異

function是將code打包的最小單位,而libaries, packages , modules, framework也是類似的概念,打包code以達到特定效果,以下是一些名詞解釋。

Modules

幫助你的code變得更有組織性,也就是將相關的code打包在一起,讓你可以在其他地方import進來使用。可以說module就是 一綑相關的程式碼被儲存在附檔名為.py。裡面可以是function, classes, or variables。

一些常用的modules : random, datetime, re。

Ex

  • 有一檔案 < hello.py >內含一function hello_message
def hello_message(msg):
print('Hello, {}'.format(msg))
  • 在其他檔案中import

此外,module.__file__可以找到該module的所在位置。

# import method 1
import hello

hello.hello_message('World')

#import method 2
from hello import hello_message

hello_message('World')

Packages

若開發較大專案,可能會有很多不同modules,造成管理上的困難。因此 packages就是 一個資料夾裡面蒐集了多個modules,允許module namespace有 階層架構,就像一般在資料夾中也能有子資料夾,也可以將modules組織成packages和subpackages。

一些常用的packages : Numpy, pandas

Ex

package結構及引入方式

├── my_module
│ ├── __init__.py
│ ├── training
│ │ ├── __init__.py
│ │ ├── training.py
│ │ ├── loss.py
│ │ └── test.py
│ ├── submission
│ │ ├── __init__.py
│ │ ├── submit.py
│ │ ├── production.py
│ │ └── test.py
# import method 1
import my_model.training.loss

#import method 2
from my_model.training import loss

Libraries

通常說library包含許多modules和packages成為一個可重複利用的程式碼塊。但因為Package本身也可以包含很多subpackages,所以Library有時也會和Packages互換使用。一般來說,還是較常稱 package包含許多modules;Library包含許多packages

常用的像是 : Matplotlib, Beautiful Soup。

packages提到的Numpy, pandas也會被稱作Library

Framework

跟library很像,包含很多modules跟packages幫助使用者執行特定程序,加快開發流程,但framework比library複雜得多。framework包含該應用程式基本的流程和架構。

常用的framework有Django和Flask。