函式&模組
2019/08/23 謝碧景(c)編製更新
學習目標
一、自訂函式
def 函式名稱([參數1,參數2,...]) #參數列可無或一個~多個,為接收呼叫函式傳進的值
程式區塊
[return 回傳值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.區域變數:定義在一個函式中的變數,其有效範圍是在該函式內。
程式中如有相同的全域及區域變數名稱,若變數在區域裡面,就以區域變數為主;若在區域外面,則以全域變數為主。如下範例。*參閱:全域變數與區域變數。中華開放教育平台→Python程式設計入門
二、內建函式
(一)數值函式
Python內建許多函式,例如數值函式是處理數值相關的功能。常用的數值函式,如下:【參閱:Python 標準函式庫 →3.8.11 Documentation】
◆範例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模組,模組就可以不斷的被其他程式再利用。
參閱:官網 Python documentation、模組的索引、語法參考。
(一)亂數模組_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)