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 吧!
def
是定義 function 的關鍵字- printHello 是 function name
- (name): name 是 參數
- name = ‘Bob’ 是預設參數
- “”” “”” 是說明 function 用途跟用法
- 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!