函式&模組

2019/08/23 謝碧景(c)編製更新

學習目標

一、自訂函式

(一)建立函式(定義函式)

  • 一般程式中會將特定功能或經常需重複使用之程式編撰成獨立的小單元,稱為函式,並賦予一個名稱,當程式需使用時,就呼叫執行即可。

  • Python 以 def 命令建立函式(即定義函式),可不傳送參數或傳送一個或多個參數給函式,執行函式後亦可返回一個或多個回傳值,亦可無回傳值。語法如下:

def 函式名稱([參數1,參數2,...]) #參數列可無或一個~多個,為接收呼叫函式傳進的值

程式區塊

[return 回傳值1,回傳值2,...] #返回值可無或一個~多個

(二)呼叫函式

    • 函式建立後不會執行,需在主程式中呼叫,才會執行。語法如下:

函式名稱([參數1,參數2,...]) # 無回傳值呼叫

[變數]=函式名稱([參數1,參數2,...]) #有回傳值呼叫

*註:

1.若函式有回傳值,可使用變數儲存返回值。

2.若有多個回傳值,則需相同個數的變數儲存返回值,且變數間以 , 逗號隔開。

    • 範例:建立函式及呼叫函式。

      • 例1:無參數亦無回傳值

執行結果:

      • 例2:有參數無回傳值

執行結果:

      • 例3:有參數有回傳值

執行結果:

      • 例4:輸出兩數。

執行結果

範例1:請設計函數 ctof,輸入攝氏(Celsius)溫度,並轉換華氏(Fahrenheit)溫度輸出。(檔名:ctof.py)

範例2-1:請設計函數 getArea,長方形面積:輸入長度與寬度,呼叫自訂函式 getArea將長度與寬度傳入,回傳計算結果。(檔名:getArea.py)

◆範例2-2:請設計函數 getSeconds 求一天有幾秒。(檔名:getSeconds.py)

(三)參數預設值

    • 當自訂函式設為有參數,而呼叫函式時若沒傳入參數,會產生錯誤,為避免次錯誤,參數可設定預設值,若沒傳入參數,則會使用預設值,即 參數可預設引數值 default argument value。

    • 若有多個參數,有預設值的參數需放置於參數串列最後,即沒預設值的參數要靠前面,有預設值的參數要靠後面

    • 呼叫函式時可輸入參數名稱,此方式與參數順序無關,但程式執行時會降低效率。

    • 語法如下:*參閱:呼叫函數中華開放教育平台Python程式設計入門

參數=值

(四)變數的有效範圍

    • 變數依其有效範圍分為全域變數及區域變數。

1.全域變數:定義在函式外的變數,其有效範圍是整個Python檔案。

2.區域變數:定義在一個函式中的變數,其有效範圍是在該函式內。

二、內建函式

(一)數值函式

範例3:輸入小考成績,若輸入-1,代表成績輸入結束,請輸出輸入的成績個數、最高分、小考平均,及成績由大到小排序。(檔名:sorted-1.py)

(二)字串函式

    • 字串函式是處理字串相關功能。如下:

◆範例4:字串.split() 結合 sys模組應用,【參閱:模組索引→import sys、字串函式字串.split()】。

  • 例4-1:中華民國萬歲!【資料來源:ZeroJudge→d049

#只有一個元素 split_4-1

import sys

for line in sys.stdin:

n, = line.split() #只有一個元素要加上逗點

y=int(n)-1911 #以 int(字串)轉成數字

print(y) #民國年份

    • 例4-2:簡易加法。【資料來源:ZeroJudge→a002

#分割為2個變數

import sys #匯入sys模組

for line in sys.stdin:

a,b = line.split() #字串分割為2個變數

print(int(a)+int(b)) #兩數相加

    • 例4-3:字串有多個元素,分割後成串列。

範例5:檢測網址正確否,即網址若為 http:// 或 https:// 開頭,為正確,否則錯誤。(檔案:startswith-1.py)

三、模組 (Module)

  • 模組是一個Python檔案,以 .py 結尾,包含 Python 物件定義和Python語句。

  • 每一個Python檔案被視為一個模組,可在程式中匯入其他Python模組,模組就可以不斷被其他程式再利用。

(一)亂數模組_random

  • random可產生整數或浮點數的亂數,亦可一次取得多個亂數。

  • 使用 import 命令即可匯入模組,而模組中有許多函式可應用

1.匯入整個模組

import 模組名稱 #匯入整個模組,例 import random

模組名稱.函式名稱(參數) #呼叫函式,例 random.randint(參數)

2.只匯入模組中特定的函式,可如下:

from 模組名稱 import 函式名稱

函式名稱(參數)

例 from random impot randint

randint(參數)

3.使用別名匯入模組:為避免輸入較長的模組名稱,可利用模組別名,語法如下:

import 模組名稱 as 模組別名 #模組別名,例 import random as r

模組別名.函式名稱(參數) #呼叫函式,例 r.randint(參數)

4.亂數模組常用函式:

範例: r 為亂數模組的別名,str1="Python",list1=[17,44,20,30,55]

範例6:班上有30位同學,請幫康樂股長隨機抽 5 位同學上台表演。(檔名:randint-1.py)

執行結果:

    • 同法:模組別名應用,下圖,r 為 random 的模組別名。

    • 呈上,以randrange 函式,產生1-20間,每次遞增2,的5個數字。

執行結果:

範例7:大樂透中獎號碼為6個1到49之間不重複的數字,加1個特別號碼,請設計程式並將中獎號碼由小至大輸出,以利對獎。(檔名:sample-1.py)

◆範例8:from 套件名稱 import 模組名稱 【參閱:黃老師→Python模組】。

  • 實作模組(檔案:Gguess.zip)

  • 實作套件(檔案:package.zip)

(二)時間模組_time

1.匯入時間模組:

import 時間模組 #匯入模組,例 import time

2.時間模組常用函式:

    • 例:從1970年1月1日零時到現在經過了1567326353.5727067 秒。

import time

print(time.time()) #1567326353.5727067

    • 例:讓程式休息(停止執行) 3 秒。

#執行程式3秒後輸出

範例9:函式回傳值可使用tuple回傳多個資料。例:自訂函式 ymd()使用tuple回傳時間的年、月與日。【參閱:模組索引

(三)Pytube 模組

    • Pytube 模組是專為下載 YouTube 影片撰寫的模組,再配合網路爬蟲技術擷取YouTube播放清單的網址,即可批次下載播放清單的所有影片。

    • Pytube 模組可取得影片所有格式,例如下載720P、具影像及聲音的影片檔,或僅聲音的MP3格式聲音檔。

1.安裝 Pytube 模組:Anaconda預設沒安裝該模組,請在Anaconda Prompt 輸入命令進行安裝,如下:

pip install pytube # 例 pip install pytube==10.8.5 等號後為版本號碼,省略即安裝最新版本

2.使用 Pytube 模組 下載 YouTube 影片,【參閱 pytube 官網】。

延伸:Python 軟體套件索引

  • Python Package Index,簡稱PyPI,是Python程式語言當中的軟體倉庫,請連結 https://pypi.org/ 即可搜尋。

◆ 範例10:人工智慧應用實例,文本分析統計方法中TF-IDF,可利用 jieba (結巴)這個『第三方函式庫』做字詞重要性分析。(檔名:pypi_ex.py) 【提示:請先安裝 pip install jieba 模組套件,再編撰執行程式。】

  • 第3-4列:載入jieba跟jieba.analyse模組套件

  • 第7-8列:把檔案的內容讀出來建立物件article

  • 請把文章存檔article1.txt,目錄與程式相同

  • 第11-12列:透過jieba內建的idf頻率庫計算文章中最重要的幾個字詞並輸出

  • article1.txt為西遊記的第一回 https://tinyl.io/4Ymy 編碼請存 utf-8

*註:TF-IDF——用來從一段文字/一個語料庫中,給越重要的字詞/文檔,越高的加權分數。摘自:技術分享--Analytic Lens

§實作練習

一、公斤轉英鎊:輸入體重公斤數,請轉換英鎊數出,英鎊=公斤*2.2。(檔名:kgtolb.py)

二、輸入一個整數,以自訂函式方式設計,請倒著輸出此數值例:輸入12345,即輸出54321。(檔名:def-ex2.py)

三、請輸入時間之秒數,以自訂函式方式設計,轉換成 [時:分:秒] 格式輸出。【提示:1小時60分鐘,1分鐘60秒,參閱:運算子→比較 //(取整數商) 及 %(取餘數)的差異】(檔名:def-ex3.py)

執行結果:

四、輸入身高及體重,請設計函式 BMI,並判斷BMI標準與否?(檔名:def-ex4.py)

【提示1:BMI=體重/(身高*身高),身高以公尺(M)為單位,體重以公斤(KG)為單位 。】

BMI<18.5 ,請輸出“體重過輕”。

18.5≦BMI≦23 ,請輸出“標準體重”。

23<BMI<25 ,請輸出“體重過重”。

BMI≧25 ,請輸出“肥胖家族”。

執行結果:

判斷BMI是否標準。

請輸入身高(M):1.75

請輸入體重(Kg):70

你的身高為175公分 體重為70公斤 BMI=22.86

標準體重

判斷BMI是否標準。

請輸入身高(M):1.8

請輸入體重(Kg):120

你的身高為180公分 體重為120公斤 BMI=37.04

肥胖家族

、製作一個「剪刀、石頭、布」的小遊戲,電腦出拳為隨機出拳,使用者由介面輸入「剪刀」、「石頭」與「布」,比較電腦出拳與使用者出拳決定勝負。(檔名:guess2)