def 一個python的自訂函數:

星期日 12 May 2019   even  
教學

前言

Never reinvent the wheel是程式界耳熟能詳的原則,已經發明好了輪子,那麼就不要再自己發明。同樣的,已經寫好的程式碼,不需要再重寫一次。如何做到重複利用寫好的程式碼呢?這就是本篇自訂函數,以及下一篇import,要介紹給各位的。

自訂函數,就是將一大段的程式碼,定義成一個名叫function的物件,同時,你可以在函數內隨你需求添加參數,讓使用上更加方便。

def

python定義一個函數的語法為def,使用方式如下:

def sayHi():
    print('Hi!')
    print('真是美好的一天~')

記得加上縮排(indentation)喔~

如上,定義了一個函數"sayHi",此時sayHi就會是一個function類別的物件。

要使用時要在最後加上()。

print(type(sayHi))
sayHi()

<class 'function'>
Hi!
真是美好的一天~

如此,你只要執行sayHi(),就等同於執行定義sayHi時底下所有的程式。

return

一般對於函數的想像,是指輸入X,中間進行各種處理,然後輸出Y,我上面最簡單的例子是沒有輸入也沒有輸出的,現在要跟各位如何讓函數輸出。

只要在函式內加入return,就可以將函數的結果送出來,如下:

def sayYay():
    print('Yay!')
    return 'Yay!'

r = sayYay()
print(type(r))
print(r)

Yay!
<class 'str'>
Yay!

因此在第一個例子,沒有設return的情況下,會回傳nontype的物件。

函數中如果碰到return,則會立刻中斷,將東西回傳出來,因此return之後的程式完全不會被執行。

def sayYo():
    print('Yo!')
    return 'Yo!'
    print('Yo!')
    print('Yo!')
    print('Yo!')
    
sayYo() #只會print一次Yo!,return底下的自動無視
r = sayYo() #print一次Yo!,接著回傳'Yo!'給r
print(r) #因為r = 'Yo!',所以等同於print('Yo!')

Yo!
Yo!
Yo!

只會有三個Yo被print出來喔,可以理解嗎?

arguments

現在要來介紹函數的輸入端,arguments。在定義函數時,同時將上argument,如下:

def sayCheckout(name):
   print(f'Checkout! {name}!')

sayCheckout(name = 'Mary')
sayCheckout('Jack')

Checkout! Mary!
Checkout! Jack!

在使用時,可以指定name這個argument的內容為'Mary',又或者不指定。因為這個函數只有一個argument,所以在 sayCheckout('Jack')中,會自動將'Jack'指派給name。

你可以為你的函數添加默認的argument數值(default arguments),如下:

def sayCheckout(name='Mary'):
   print(f'Checkout! {name}!')


sayCheckout()
sayCheckout('Jack')

Checkout! Mary!
Checkout! Jack!

如上,在不設argument時,會自動使用默認的數值。

而要同時多個的arguemts時,default arguments必須設在後面,如下:

def sayCheckout(name1, name2 = 'Mary'):
    print(f'Checkout! {name1} and {name2}!')

sayCheckout('John')
sayCheckout('Jack', 'Jessica')

Checkout! John and Mary!
Checkout! Jack and Jessica!

如果將default argument設在前面則會出現syntax error:

def sayCheckout(name1 = 'Mary', name2):
    print(f'Checkout! {name1} and {name2}!')

SyntaxError: non-default argument follows default argument

如果你的函數無法事先定義要有幾個arguments時,可以使用以下用法:

def product(*numbers):
    r = 1
    for n in numbers:
        r *= n
    return r

print(product(1,2,3,4,5))
print(product(3,5,10))
print(product(100))

120
150
100

使用*,會將輸入的所有argument打包成list裡去執行,另外也可以使用**,會將所有輸入的argument打包成dict去執行,如下:

def my_studio(**args):
    print('Everything about my studio:')
    for k in args:
        print(f'{k}: {args[k]}')
        
my_studio(名稱='PUF STUDIO', 項目=['資料分析','網頁架設','教學','遊戲開發'],員工人數=1)
print('************')
my_studio(內容='自由業接案',網址='freelancerlife.info')

Everything about my studio:
名稱: PUF STUDIO
項目: ['資料分析', '網頁架設', '教學', '遊戲開發']
員工人數: 1
************
Everything about my studio:
內容: 自由業接案
網址: freelancerlife.info

Bonus Tip: docstring

當你要使用編寫複雜的函數時,可以同時寫一些"使用說明",這也就是docstring,如此,任何人使用你的函數時,就可以透過help,來查看使用說明,如下:

def sayHi():
    '''
    這是我非常習慣用來教學的範例函數,會執行print('Hi!'),沒有輸入也沒有輸出
    '''
    print('Hi!')

help(sayHi)

Help on function sayHi in module __main__:

sayHi()
這是我非常習慣用來教學的範例函數,會執行print('Hi!'),沒有輸入也沒有輸出

結尾

以下將本章節所介紹的python自訂函數的使用都放進了lets_party裡,希望你能看得懂。

def lets_party(party_time,party_hour, party_words="let's party", *party_people, **party_info):
    '''
    這是本章節總整理的示範函數,將這篇所有介紹到的東西都放了進去,希望你能看得懂
    '''
    print(f"It's {party_hour} of {party_time}:")
    print(party_words)
    print(f'{len(party_people)} people joined our party~')
    print(f'They are: {party_people}')
    print('I prepared the following stuff for this party:')
    for k in party_info:
        print(f'{k}: {party_info[k]}')
    print('Come and join us with the happy party time!')

    return 'What a Nice Party~'


print(lets_party('2019/5/16','20:00','Check it out~','Mary','John','Jack', table=1,chair=4, tv=1, food='a lot'))

It's 20:00 of 2019/5/16:
Check it out~
3 people joined our party~
They are: ('Mary', 'John', 'Jack')
I prepared the following stuff for this party:
table: 1
chair: 4
tv: 1
food: a lot
Come and join us with the happy party time!
What a Nice Party~

最後,一樣感謝您耐心閱讀到最後,我們下次見,Bye~

python新手教學
Why python
Hello Python!
This is a python - 基本數值運算與邏輯判斷
[Python, 的, list, 教學 ]
"python的字串教學"
python的迴圈與流程控制
python的(tuple)與{dict}
def 一個python的自訂函數:
import套件到你的python
python的嘗試try與錯誤error處理
Python之禪

相關文章:

>