5. 函式的使用與進階語法
函式與特殊語法在所有的程式語言裡面都是相當重要的概念!!!
所以請大家一定要好好學習這一段的內容!!!
名稱 |
定義 |
使用 |
函式 functions |
將程式碼包裝起來 方便隨時重複使用 減少程式複雜度 |
建立 => 使用 |
關鍵字 keywords |
程式語言原先就具備的函式 不可以 |
使用 |
一、函式 Functions
其實程式中的函式與我們數學中的函式式非常相似的
數學: f(x) = y
程式: f(arg) = return-value
簡單來說:
- 數學的函式 就是我們把一個數字x 放到f(x)之中 經過f(x)內的算式計算後 得出y
數學函式流程:
使用函式 => 給予 x => f(x) => 計算計算計算 => 得到 y
- 程式的函式 也是一樣的道理 只是放入的 可以是各種形式的資料型態
程式函式流程:
呼叫函式 => (給予參數值) => function(參數值) => 執行函式內的程式 => 取得回傳值
※ 這邊舉個 數學函式 與 程式函式 的例子 ※
數學函式:
f(x) = 7x+9 = y
Python 函式:
def f(x):
return x*7+9
很簡單吧? 兩個式一樣的功能,都是計算: x 乘以 7 加 9
那實際上的 使用 當然不只這樣,但是 語法 就是這樣了 結束 函式 -KO
那我們開始寫幾個函式吧
1. 定義函式的結構:
2. 在函式中使用參數
- 在定義函式的時候,我們括號內,有幾個參數名稱,之後呼叫就必須放幾個參數值
例如: 我想計算3個數字 長length 寬width 高height 相乘的結果 => 就是立方體積啦~
def counting(length, width, height):
result = length*width*height
return result
result = counting(5,6,7)
print(result)
- 我們也可以預先設定好參數值 就不需要每次呼叫都必須輸入了
例如: 員工的薪水加成 加成的趴數固定 10% 那我們可以先預設趴數的參數為10
def CountMoneyBonus(Original, Bonus=10):
return Original+Original/100*Bouns
print(CountMoneyBonus(Original=23000))
print(CountMoneyBonus(Bouns=40, Original=23000))
- 由於函式這東西比較懸乎
直接來拆解幾個前幾篇有使用到的 Python小函式吧
首先是 Python 原本就有的 sum() 函式 會回傳 list 中所有數字加總的和
numbers = [1,2,3,4,5,6,7,8,9,10]
print(sum(numbers))
那現在換我們來重現一下它吧
def mysum(input):
result = 0
try:
if all(type(check_type) != str for check_type in input):
for each_num in input:
result += each_num
return result
else:
return input
except:
return input
這樣就定義完了 那我們如何呼叫 / 使用這個函式呢
就跟 Python 原本給的一樣 Python給的是 sum(參數列表) 那我們的是 mysum(參數列表)
numbers = [1,2,3,4,5,6,7,8,9,10]
print(mysum(numbers))
這個例子中我們使用了以前教過的:
- 資料型態與基本運算
定義變數 (result = 0)
取得資料型態 type
字串型態 str
運算子 +=
- 流程控制
判斷式 if else
迴圈 for
嘗試和例外 try except
另外 還有特殊用法:
1. all用法
all(type(check_type) != str for check_type in input)
用法:
=> all( (a 判斷運算子 b) for a in 列表)
可以用來判斷 列表裡的所有物件 是否 等於 大於 小於. . . b
如果是 回傳 True 否則 回傳 False
2. any用法
any(type(check_type) != str for check_type in input)
用法:
=> any( (a 判斷運算子 b) for a in 列表)
可以用來判斷 列表裡的任何一個物件 是否 等於 大於 小於. . . b
如果有 回傳 True 否則 回傳 False
既然剛好提到了 all any 用法,就順便介紹一些必較常見的特殊關鍵字吧
二、特殊關鍵字 Keywords
1. 特殊關鍵字的種類
判斷關鍵字 |
定義關鍵字 |
流程關鍵字 |
運算關鍵字 |
引入關鍵字 |
False |
def |
with、as |
lambda |
from |
True |
class |
assert |
and |
import |
None |
|
break |
or |
|
|
|
continue |
not |
|
|
|
pass、raise、yield |
is |
|
|
|
if、elif、else |
in |
|
|
|
global、nonlocal |
|
|
|
|
try |
|
|
|
|
except |
|
|
|
|
finally |
|
|
|
|
while |
|
|
|
|
for |
|
|
|
|
return |
|
|
|
|
del |
|
|
2. 定義關鍵字
(1) def
本篇 第一部分 內容
用於定義函式
(2) class
第八篇 OOP內容
用於 定義類別 也就是 自己寫一個資料型態
3. 判斷關鍵字
(1) False
就是 否、不正確的、不對的、NO、0 的意思
(2) True
就是 是、正確的、對的、YES、1 的意思
(3) None
就是 無、否、空、沒東西 的意思
在判斷 True False 時 None 會代表 False
4. 運算關鍵字
(1) and
代表「和」的意思
前後會分別搭配一個會回傳判斷關鍵字的功能或運算子
例如:
print((1+2 == 3) and (9-8 == 1))
.
(2) or
代表「或」的意思
前後會分別搭配一個會回傳判斷關鍵字的功能或運算子
例如:
print((1+2 == 3) or (2 == 1))
.
(3) is
代表「是否就是」的意思,用來判斷兩個資料是否 完全一致
這裡需要介紹到 id() 這個函式 / 功能,可以取得資料的 記憶體位置
如果兩變數的資料一樣 那可以用 == 運算子來判斷
但如果兩個變數的 記憶體位置 一樣 則可以用 is 和 == 來判斷
例如:
a = 1000
b = 1000
print(id(a))
print(id(b))
print(a == b)
print(a is b)
.
(4) not
代表「不是」的意思,通常用來反轉 True False
例如:回傳值雖然是False 但我希望回傳False的時候可以做些事情
a = False
if not a:
print("Excuted")
.
(5) in
代表「是否在裡面」的意思,用來判斷 a 是否在 b 內
例如 “Hello” in “Hello World!” => 輸出 True 因為 Hello 的確有在 Hello World! 裡
a = "Hello"
b = "hello World!"
if a in b:
print("Yes")
.
(6) lambda
相當於 關鍵字def 用來定義簡易函式
例如: 取得兩數相加等於多少
func = lambda a, b : a + b
print(func(100, 200))
print(func(500, 900))
print(func(150, 25))
.
5. 引入關鍵字
(1) from 、 import
這兩個基本上都是一使用的
用法: from 檔案名稱 / 資料夾名稱 import 模組名稱
import time
from time import sleep
.
6. 流程關鍵字
(1) with 、 as
with 代表 「以」 as 代表 「作為」
-
as 在下一篇 常見模組的使用 會非常常用到 它可以把我們引入的模組 / 打開的檔案 命名
相當於把模組 / 檔案 「作為」一個變數名稱的型態 在程式中進行互動
as 用法:
import 模組名稱 as 自訂名稱
from 檔案名稱 / 資料夾名稱 import 模組名稱 as 自訂名稱
-
with 在常見模組教完之後 第七篇 講到檔案的讀寫 就會使用到 with 關鍵字 用來打開並編輯檔案
with 用法: with open(檔案名稱, 開啟模式) as 自訂名稱
import time as t
from time import sleep as s
with open("readme.txt", "r") as f:
.
(2) del
代表「刪除」 用來 【完全刪除】 變數
.
(3) if 、 elif 、 else
if 代表 「如果」
elif 代表 「不然如果」
else 代表 「不然」
a = int(input())
if a>=10:
print(" a 大於等於 10")
elif a>=5:
print(" a 小於10 大餘等於 5")
else:
print(" a 小於 5")
.
(4) try 、 except 、 finally
try 代表 「嘗試」
except 代表 「當出現錯誤」
finally 代表 「最後」
try:
print(x)
except:
print("x 未被定義 未被宣告 未被賦予任何資料")
finally:
print("掰掰")
- 執行結果
.
(5) while 、 for
while 代表 「當」
for 代表 「以」
while(True):
print("Hello World!")
for _ in range(3):
print("Hello World!")
- while 執行結果
- for 執行結果
.
(6) break 、 continue 、 pass
break 代表 「退出迴圈」
continue 代表 「直接進入下一圈迴圈」
pass 代表 「跳過這一行」
- break 常搭配 if / elif / else / try / except 使用
像是如果某條件達成 break 退出迴圈
例如: 我希望找到最小的 3的倍數,同時也是13的倍數,同時又是17的倍數
可以這樣達成:
a = 3
while(True):
if a%13 + a%17 == 0:
print(a)
break
else:
a+=3
- continue 常搭配 if / elif / else / try / except 使用
例如: 我想要計算小於100的3的倍數,但是不是4的倍數有幾個
就可以這麼做:
a = 0
b = []
while(a+3<100):
if a+3 % 4 == 0:
a+=3
continue
else:
a+=3
b.append(a)
print(len(b))
- pass 就只是 跳過這一行
例如: 你可以先定義好函式名稱 然後用pass 先不撰寫函式內的程式碼
def func(value1, value2):
pass
- break 範例程式
- continue 範例程式
.
(7) global 、 nonlocal
- global 代表 「繼承 主程式 的變數」
!!!如果使用global並請在函式中更動了變數值,主程式的值也會更動!!!
例如: 我有一個變數 a 儲存分數加權的趴數,我希望在函式內直接使用它
a = 10
def add(score):
global a
print(score*a/100)
a = 20
return score*a/100
add(100)
print(a)
- nonlocal 則是代表 「繼承 上一層 函式 的變數」
!!!雖然可以避免影響主程式的變數值!!!
!!!但在寫程式的過程中會盡量避免使用同名的變數!!!
!!!並且,雖然不影響主程式,但是被繼承的那一層函式的值會被更動!!!
例如: 我有一層雙層函式,我希望第二層繼承第一層的變數,但不影響主程式的同名變數
a = 0
def layer1():
a = 1
def layer2():
nonlocal a
a = 2
print("layer2", a)
layer2()
print("layer1", a)
layer1()
print("Main", a)
- global 範例
- nonlocal 範例
.
(8) assert
- 代表「是否正確」與 if 類似 但是如果不符合會丟出 AssertError 檢查錯誤
例如: 檢查小明的成績有沒有高於或等於 80 分
如果沒有,就丟出錯誤,結束程式,媽媽生氣氣
Small_Mings_Score = int(input("請輸入小明的成績: "))
assert Small_Mings_Score >= 80
print("恭喜~ 媽媽不生氣了")
- 當輸入小明成績大於80
- 當輸入小明成績小於80
.
(9) raise 、 return 、 yield
- raise 代表「丟出錯誤」
例如: 可以使用 raise 來達到 assert 的效果,如(8)的例子
a = int(input("請輸入小明的成績: "))
if a < 80:
raise BaseException("分數低於80 媽媽要生氣了")
print("恭喜~ 媽媽不生氣了")
- return 代表「回傳」
用來在函式結束時,回傳運行結果或變數值讓接下來的程式使用
例如: 輸入半徑 丟入函式計算後 印出圓面積和圓周長
def count(r):
area = r*r*3.14
perimeter = 2*r*3.14
return area, perimeter
inputR = int(input("請輸入半徑"))
GetArea, GetPerimeter = count(inputR)
print("面積 = ", GerArea)
print("周長 = ", GetPerimeter)
- yield 暫停並回傳
用來製作生成器、計數器,會暫停函式,下次呼叫函式會從被暫停的地方繼續執行
例如: 我需要一個計算現在進行第幾個步驟的計數器
def counting():
for i in range(10):
yield i+1
a = counting()
print(next(a))
print(next(a))
print(next(a))
- raise 範例
- return 範例
- yield 範例
5. 函式的使用與進階語法
tags:
Python
以下程式碼「有」先後順序
推薦影片教學頻道:
函式與特殊語法在所有的程式語言裡面都是相當重要的概念!!!
所以請大家一定要好好學習這一段的內容!!!
一、函式 Functions
其實程式中的函式與我們數學中的函式式非常相似的
數學: f(x) = y
程式: f(arg) = return-value
簡單來說:
數學函式流程:
使用函式 => 給予 x => f(x) => 計算計算計算 => 得到 y
程式函式流程:
呼叫函式 => (給予參數值) => function(參數值) => 執行函式內的程式 => 取得回傳值
※ 這邊舉個 數學函式 與 程式函式 的例子 ※
很簡單吧? 兩個式一樣的功能,都是計算: x 乘以 7 加 9
那實際上的 使用 當然不只這樣,但是 語法 就是這樣了 結束 函式 -KO
那我們開始寫幾個函式吧
1. 定義函式的結構:
2. 在函式中使用參數
例如: 我想計算3個數字 長length 寬width 高height 相乘的結果 => 就是立方體積啦~
例如: 員工的薪水加成 加成的趴數固定 10% 那我們可以先預設趴數的參數為10
直接來拆解幾個前幾篇有使用到的 Python小函式吧
首先是 Python 原本就有的 sum() 函式 會回傳 list 中所有數字加總的和
那現在換我們來重現一下它吧
這樣就定義完了 那我們如何呼叫 / 使用這個函式呢
就跟 Python 原本給的一樣 Python給的是 sum(參數列表) 那我們的是 mysum(參數列表)
這個例子中我們使用了以前教過的:
定義變數 (result = 0)
取得資料型態 type
字串型態 str
運算子 +=
判斷式 if else
迴圈 for
嘗試和例外 try except
另外 還有特殊用法:
1. all用法
2. any用法
既然剛好提到了 all any 用法,就順便介紹一些必較常見的特殊關鍵字吧
二、特殊關鍵字 Keywords
1. 特殊關鍵字的種類
2. 定義關鍵字
(1) def
本篇 第一部分 內容
用於定義函式
(2) class
第八篇 OOP內容
用於 定義類別 也就是 自己寫一個資料型態
3. 判斷關鍵字
(1) False
就是 否、不正確的、不對的、NO、0 的意思
(2) True
就是 是、正確的、對的、YES、1 的意思
(3) None
就是 無、否、空、沒東西 的意思
在判斷 True False 時 None 會代表 False
4. 運算關鍵字
(1) and
代表「和」的意思
前後會分別搭配一個會回傳判斷關鍵字的功能或運算子
例如:
.
(2) or
代表「或」的意思
前後會分別搭配一個會回傳判斷關鍵字的功能或運算子
例如:
.
(3) is
代表「是否就是」的意思,用來判斷兩個資料是否 完全一致
這裡需要介紹到 id() 這個函式 / 功能,可以取得資料的 記憶體位置
如果兩變數的資料一樣 那可以用 == 運算子來判斷
但如果兩個變數的 記憶體位置 一樣 則可以用 is 和 == 來判斷
例如:
.
(4) not
代表「不是」的意思,通常用來反轉 True False
例如:回傳值雖然是False 但我希望回傳False的時候可以做些事情
.
(5) in
代表「是否在裡面」的意思,用來判斷 a 是否在 b 內
例如 “Hello” in “Hello World!” => 輸出 True 因為 Hello 的確有在 Hello World! 裡
.
(6) lambda
相當於 關鍵字def 用來定義簡易函式
例如: 取得兩數相加等於多少
.
5. 引入關鍵字
(1) from 、 import
這兩個基本上都是一使用的
用法: from 檔案名稱 / 資料夾名稱 import 模組名稱
.
6. 流程關鍵字
(1) with 、 as
with 代表 「以」 as 代表 「作為」
as 在下一篇 常見模組的使用 會非常常用到 它可以把我們引入的模組 / 打開的檔案 命名
相當於把模組 / 檔案 「作為」一個變數名稱的型態 在程式中進行互動
as 用法:
import 模組名稱 as 自訂名稱
from 檔案名稱 / 資料夾名稱 import 模組名稱 as 自訂名稱
with 在常見模組教完之後 第七篇 講到檔案的讀寫 就會使用到 with 關鍵字 用來打開並編輯檔案
with 用法: with open(檔案名稱, 開啟模式) as 自訂名稱
.
(2) del
代表「刪除」 用來 【完全刪除】 變數
.
(3) if 、 elif 、 else
if 代表 「如果」
elif 代表 「不然如果」
else 代表 「不然」
.
(4) try 、 except 、 finally
try 代表 「嘗試」
except 代表 「當出現錯誤」
finally 代表 「最後」
.
(5) while 、 for
while 代表 「當」
for 代表 「以」
.
(6) break 、 continue 、 pass
break 代表 「退出迴圈」
continue 代表 「直接進入下一圈迴圈」
pass 代表 「跳過這一行」
像是如果某條件達成 break 退出迴圈
例如: 我希望找到最小的 3的倍數,同時也是13的倍數,同時又是17的倍數
可以這樣達成:
例如: 我想要計算小於100的3的倍數,但是不是4的倍數有幾個
就可以這麼做:
例如: 你可以先定義好函式名稱 然後用pass 先不撰寫函式內的程式碼
.
(7) global 、 nonlocal
!!!如果使用global並請在函式中更動了變數值,主程式的值也會更動!!!
例如: 我有一個變數 a 儲存分數加權的趴數,我希望在函式內直接使用它
!!!雖然可以避免影響主程式的變數值!!!
!!!但在寫程式的過程中會盡量避免使用同名的變數!!!
!!!並且,雖然不影響主程式,但是被繼承的那一層函式的值會被更動!!!
例如: 我有一層雙層函式,我希望第二層繼承第一層的變數,但不影響主程式的同名變數
.
(8) assert
例如: 檢查小明的成績有沒有高於或等於 80 分
如果沒有,就丟出錯誤,結束程式,媽媽生氣氣
.
(9) raise 、 return 、 yield
例如: 可以使用 raise 來達到 assert 的效果,如(8)的例子
用來在函式結束時,回傳運行結果或變數值讓接下來的程式使用
例如: 輸入半徑 丟入函式計算後 印出圓面積和圓周長
用來製作生成器、計數器,會暫停函式,下次呼叫函式會從被暫停的地方繼續執行
例如: 我需要一個計算現在進行第幾個步驟的計數器