0%

Python 的 Function

Function 定義

在 Python function 以 def來定義

1
def printHello(name = 'Bob'):
2
    """如果是Jack 印出 hello world"""
3
    if name == 'Jack':
4
        print('hello world!')
5
    else:
6
        print('who are you?')
7
    return 0
8
9
printHello()
10
printHello('Jenny')
11
printHello('Jack')
12
---------------執行結果---------------
13
who are you?
14
who are you?
15
hello world!

來說說以上 code 吧!

  1. def 是定義 function 的關鍵字
  2. printHello 是 function name
  3. (name): name 是 參數
  4. name = ‘Bob’ 是預設參數
  5. “”” “”” 是說明 function 用途跟用法
  6. return 回傳值,不寫為 None

關於參數預設值

我們可以使用預設值來方便操作,但是它有個問題。
def 是個陳述,所以執行到 def 陳述時,就建立了該陳述相關的資源。
什麼意思?
看例子

1
def buggy(arg,result =[]):
2
    result.append(arg)
3
    return result
4
5
print(buggy('a'))
6
7
print(buggy('b'))
8
---------------執行結果---------------
9
['a']  --> 相當正常
10
['a', 'b'] ---> ?????????

奇怪? 當我們第二次使用時,卻不是 [‘b’]!!
這是因為電腦從 code 上至下執行,當執行到def buggy(arg,result =[]):這行時,已經把 list 建好了。
就像之前說的,因為 def 是陳述句所以會先建立。
有點類似 C 語言會先宣告function,當使用到時再來定義。

那怎麼辦?
不要把可變資料型態(list,dict,tuple,set)當預設值!

1
def buggy(arg):
2
    result = []
3
    result.append(arg)
4
    return result
5
6
print(buggy('a'))
7
print(buggy('b'))
8
---------------執行結果---------------
9
['a']
10
['b']

大功告成 XD

參數值使用 *

在 C C++ 裡 * 表示 pointer ,但 Python 卻不是喔!
那是什麼?
如果你在參數中加入 * ,他會把你傳到 function 的資料集合起來,變成一個 Tuple 型態。

1
def printArgs(*arg):
2
    print(arg)
3
4
printArgs('apple','google','android','asus')
5
---------------執行結果---------------
6
('apple', 'google', 'android', 'asus')

也就是一個參數可以包含很多 data。

參數值使用 **

我們如果要把參數弄成 dict 型態呢?
我們使用 **

1
def printKwargs(**kwarg):
2
    print('keyword argument:',kwarg)
3
4
printKwargs(Id = '6666',name = 'Bob',age = '18')
5
---------------執行結果---------------
6
keyword argument: {'Id': '6666', 'name': 'Bob', 'age': '18'}

Function 當參數?

在 Python 的世界裡面所有東西都是一個 Object
因此,你可以把 function 傳給一個 variable,把他們當作參數傳給另一個 function。

1
def print_hundred():
2
    """ 只 print 100  """
3
    print('100')
4
5
def do_something(fun):
6
    fun()
7
8
if __name__ == '__main__':
9
    do_something(print_hundred)
10
---------------執行結果---------------
11
100

我們當參數傳入的是 ‘print_hundred’,而不是 ‘print_hundred( )’!! ( ) 代表 call 這個 function!!

Local Function

這個我覺得挺牛逼的XD
就是 function 裡面還可以加一個小 function 來使整個演算法更有組織,不用再而外寫一個小 function。

1
def student(saying):
2
    def inner():
3
        return "We are the students who say:'{q}'".format(q =saying)
4
5
    return inner()
6
7
if __name__ == '__main__':
8
    print(student('hello world!'))
9
10
---------------執行結果---------------
11
We are the students who say:'hello world!'

Local function 可以使用主要 function 的資源

lambda function

有些小 function 而外寫他有點浪費時間,所以我們可以使用 lambda 來取代。

例子:
我們需要輸入一串水果名稱,並將其第一個字母大寫且尾巴加上驚嘆號

改良前:

1
def print_fruit(fruits,fuc):
2
    for _fruit in fruits:
3
        print(fuc(_fruit))
4
5
def celebrate(fruit):
6
    return fruit.capitalize() + '!'
7
8
if __name__ == '__main__':
9
    fruits = ['apple','banana','orange','lemon']
10
    print_fruit(fruits,celebrate)
11
---------------執行結果---------------
12
Apple!
13
Banana!
14
Orange!
15
Lemon!

使用 lambda:
1
def print_fruit(fruits,fuc):
2
    for _fruit in fruits:
3
        print(fuc(_fruit))
4
5
if __name__ == '__main__':
6
    fruits = ['apple','banana','orange','lemon']
7
    print_fruit(fruits, lambda fruit: fruit.capitalize() + '!')
8
---------------執行結果---------------
9
Apple!
10
Banana!
11
Orange!
12
Lemon!

資料來源:

精通 Python:運用簡單的套件進行現代運算