SlideShare a Scribd company logo
附錄B 裝飾器
附 錄 B
裝 飾 器
python 程式設計
python 簡要講義
國立中央大學數學系 吳維漢
附錄B 裝飾器
python 函式為第一類物件 (一)
2
 python 函式為第一類物件(first-class object)
 函式可當成物件使用
 函式可當成參數傳入另一個函式使用
def square( fn , a , b ) :
return [ fn(x) for x in range(a,b+1) ]
# 將 abs 傳入 square 函式使用
print( square( abs , -2 , 2 ) ) # 印出 [2, 1, 0, 1, 2]
def square( a , b ) :
return [ x*x for x in range(a,b+1) ]
# foo 即是 square
foo = square
print( foo( -2 , 2 ) ) # 印出 [4, 1, 0, 1, 4]
附錄B 裝飾器
python 函式為第一類物件 (二)
3
 函式可回傳函式
 函式內可定義函式
# 回傳設定係數後的一元二次方程式函式
def spoly( a , b , c ) :
return lambda x : a*x*x + b*x + c
# fn = x**2 + 2*x + 1
fn = spoly(1,2,1)
for x in range(3) :
print( x , fn(x) ) # 印出:0 1,1 4,2 9 共三列
def fsum( f , g ) :
# fn 為兩函式之和
def fn(x) : return f(x) + g(x)
return fn
def square(x) : return x * x
def cubic(x) : return x * x * x
# h(x) = square(x) + cubic(x)
h = fsum( square , cubic )
for x in range(0,3) :
print( x , h(x) ) # 印出:0 0,1 2,2 12 共三列
附錄B 裝飾器
python 函式為第一類物件 (三)
4
 函式可存入其它資料型別中
# 使用上例的函式
fns = [ square , cubic ] # fns 串列內存兩函式
for x in range(0,3) :
print( x , end=" " )
for fn in fns :
print( fn(x) , end=“ ” ) # 印出:0 0 0,1 1 1,2 4 8 三列
print()
附錄B 裝飾器
函式裝飾器 (一)
5
 函式裝飾器:以函式當為裝飾器
 用來包裝函式的函式,擴充原有函式功能
1. 版本一
def square(x) : return x*x
def cubic(x) : return x*x*x
# 計算在 x 在 [a,b] 之間的函數數值和
def fsum_over( fn , a , b ) :
return sum( [ fn(x) for x in range(a,b+1) ] )
# 分別將 square 與 cubic 函式當成參數傳入
print( fsum_over( square , -2 , 2 ) ) # 印出:10
print( fsum_over( cubic , -2 , 2 ) ) # 印出:0
 以上 square、cubic、fsum_over 三函式各自獨立
附錄B 裝飾器
函式裝飾器 (二)
6
2. 版本二
def square(x) : return x*x
def cubic(x) : return x*x*x
# decorate 函式名稱,非保留字
def decorate( fn ) :
def fsum_over( a , b ) :
return sum( [ fn(x) for x in range(a,b+1) ] )
return fsum_over
# decorate 回傳的 fsum_over 被當成新的 square,square 函式不再是
原有 square
square = decorate(square)
# 這裡的 square 事實上是 fsum_over 函式,square 變成雙參數函式
print( square(-2,2) ) # 印出:10
 以上接收的 square 函式是原有函式 square 與 fsum_over 的合體函式,等同
square 函式經過 decorate 裝飾器函式的處理後「融合」了兩個函式功能,造成
square 函式產生質變,由單參數函式變為雙參數函式。
附錄B 裝飾器
函式裝飾器 (三)
7
def rangesum( fn ) :
def fsum_over( a , b ) :
return sum( [ fn(x) for x in range(a,b+1) ] )
return fsum_over
def square(x) : return x*x
square = rangesum(square)
def cubic(x) : return x*x*x
cubic = rangesum(cubic)
可分別簡化為:
def rangesum( fn ) :
def fsum_over( a , b ) :
return sum( [ fn(x) for x in range(a,b+1) ] )
return fsum_over
@rangesum
def square(x) : return x*x
@rangesum
def cubic(x) : return x*x*x
 裝飾器簡化語法:
附錄B 裝飾器
類別裝飾器 (一)
8
 類別裝飾器:以類別當為裝飾器
 函式運算子:__call__
class RangeSum :
def __init__( self , fn ) :
self.fn = fn
# 函式運算子:讓物件可用函式方式執行實例方法
def __call__( self , a , b ) :
return sum( [ self.fn(x) for x in range(a,b+1) ] )
# 輸入 abs 絕對值函式
foo = RangeSum( abs )
# 以下兩者相同,都印出 12
print( foo.__call__(-3,3) )
print( foo(-3,3) )
 foo 為 RangeSum 物件,foo(-3,3) 等同 foo.__call__(-3,3)
附錄B 裝飾器
類別裝飾器 (二)
9
 使用類別裝飾器:需定義類別的函式運算子
@RangeSum
def square( x ) : return x*x
@RangeSum
def cubic( x ) : return x*x*x
# 分別執行 RangeSum 的函式運算子
print( square(-2,2) ) # 印出:10
print( cubic(-2,2) ) # 印出:0
 定義類別裝飾器時需連同設定類別的函式運算子
範例 (一)
 畫出若干個函式的最大值,最小值,平均值
以下利用類別裝飾器計算若干個函式的最大值,最小值與平均值,
函式的數量可多可少,統一輸入裝飾器的函式運算子內計算。程式
最後利用 pylab 畫出各個圖形如下:
10附錄B 裝飾器
範例 (二)
11附錄B 裝飾器
import pylab
# 類別裝飾器
class Fn_Val :
# 起始設定方法
def __init__( self , fn ) :
self.fn = fn
# 函式運算子
def __call__( self , xs , *fns ) :
ys = []
for x in xs :
ys += [ self.fn( list( map( lambda f : f(x) , fns ) ) ) ]
return ys
@Fn_Val
def maxf(xs) : return max(xs)
@Fn_Val
def minf(xs) : return min(xs)
@Fn_Val
def avgf(xs) : return (max(xs)+min(xs))/2
# sin(x/2)
def sin2(x) : return pylab.sin(x/2)
範例 (三)
12附錄B 裝飾器
if __name__ == ’__main__’ :
pi = pylab.pi
# [0,2pi] 200 個點
xs = pylab.linspace(0, 2*pi, 200)
# 利用裝飾器計算若干函數的最大值,最小值,平均值
ys1 = maxf(xs, pylab.sin, pylab.cos, sin2)
ys2 = minf(xs, pylab.sin, pylab.cos, sin2)
ys3 = avgf(xs, pylab.sin, pylab.cos, sin2)
# 白底
pylab.figure(facecolor=’w’)
# 畫 sin(x) cos(x) sin(x/2) 函式圖形
pylab.plot(xs, pylab.sin(xs), color=’r’, lw=3, label=’sin(x)’)
pylab.plot(xs, pylab.cos(xs), color=’g’, lw=3, label=’cos(x)’)
pylab.plot(xs, sin2(xs), color=’b’, lw=3, label=’sin(x/2)’)
# 畫 max min avg 圖形
pylab.plot(xs, ys1, ’*c:’, lw=1, label=’max val’)
pylab.plot(xs, ys2, ’om:’, lw=1, label=’min val’)
pylab.plot(xs, ys3, ’.k:’, lw=1, label=’avg val’)
pylab.title("max, min, avg values of sin(x), cos(x), sin(x/2)", fontsize=20)
pylab.grid()
pylab.legend()
pylab.show()

More Related Content

What's hot

Appendix B 範例
Appendix B 範例Appendix B 範例
Appendix B 範例
hungchiayang1
 
Ppt 78-100
Ppt 78-100Ppt 78-100
Ppt 78-100
hungchiayang1
 
Python p.193 197
Python p.193 197Python p.193 197
Python p.193 197
hungchiayang1
 
Ppt 127-135
Ppt 127-135Ppt 127-135
Ppt 127-135
hungchiayang1
 
Ch7 教學
Ch7 教學Ch7 教學
Ch7 教學
hungchiayang1
 
Ppt 1-25
Ppt 1-25Ppt 1-25
Ppt 1-25
hungchiayang1
 
Polar example
Polar examplePolar example
Polar example
Alisha Smile
 
Ppt 51-77
Ppt 51-77Ppt 51-77
Ppt 51-77
hungchiayang1
 
Ch10 教學
Ch10 教學Ch10 教學
Ch10 教學
hungchiayang1
 
Taylor example
Taylor exampleTaylor example
Taylor example
Alisha Smile
 
Ppt 1-50
Ppt 1-50Ppt 1-50
Ppt 1-50
hungchiayang1
 
Ch12 範例
Ch12 範例Ch12 範例
Ch12 範例
hungchiayang1
 
Sym py edu
Sym py eduSym py edu
Sym py edu
Alisha Smile
 
P127 135 new
P127 135 newP127 135 new
P127 135 new
hungchiayang1
 
Ch10 範例
Ch10 範例Ch10 範例
Ch10 範例
hungchiayang1
 
Ch12 教學
Ch12 教學Ch12 教學
Ch12 教學
hungchiayang1
 
Ch8 教學
Ch8 教學Ch8 教學
Ch8 教學
hungchiayang1
 
Ch11 範例
Ch11 範例Ch11 範例
Ch11 範例
hungchiayang1
 
Ch1 教學
Ch1 教學Ch1 教學
Ch1 教學
hungchiayang1
 
Ch6 教學
Ch6 教學Ch6 教學
Ch6 教學
hungchiayang1
 

What's hot (20)

Appendix B 範例
Appendix B 範例Appendix B 範例
Appendix B 範例
 
Ppt 78-100
Ppt 78-100Ppt 78-100
Ppt 78-100
 
Python p.193 197
Python p.193 197Python p.193 197
Python p.193 197
 
Ppt 127-135
Ppt 127-135Ppt 127-135
Ppt 127-135
 
Ch7 教學
Ch7 教學Ch7 教學
Ch7 教學
 
Ppt 1-25
Ppt 1-25Ppt 1-25
Ppt 1-25
 
Polar example
Polar examplePolar example
Polar example
 
Ppt 51-77
Ppt 51-77Ppt 51-77
Ppt 51-77
 
Ch10 教學
Ch10 教學Ch10 教學
Ch10 教學
 
Taylor example
Taylor exampleTaylor example
Taylor example
 
Ppt 1-50
Ppt 1-50Ppt 1-50
Ppt 1-50
 
Ch12 範例
Ch12 範例Ch12 範例
Ch12 範例
 
Sym py edu
Sym py eduSym py edu
Sym py edu
 
P127 135 new
P127 135 newP127 135 new
P127 135 new
 
Ch10 範例
Ch10 範例Ch10 範例
Ch10 範例
 
Ch12 教學
Ch12 教學Ch12 教學
Ch12 教學
 
Ch8 教學
Ch8 教學Ch8 教學
Ch8 教學
 
Ch11 範例
Ch11 範例Ch11 範例
Ch11 範例
 
Ch1 教學
Ch1 教學Ch1 教學
Ch1 教學
 
Ch6 教學
Ch6 教學Ch6 教學
Ch6 教學
 

Similar to Appendix B

函數微分_範例.pptx
函數微分_範例.pptx函數微分_範例.pptx
函數微分_範例.pptx
mclmath
 
ncuma_函數微分計算.pptx
ncuma_函數微分計算.pptxncuma_函數微分計算.pptx
ncuma_函數微分計算.pptx
NCU MCL
 
ncuma_函式.pptx
ncuma_函式.pptxncuma_函式.pptx
ncuma_函式.pptx
NCU MCL
 
函數畫圖.pptx
函數畫圖.pptx函數畫圖.pptx
函數畫圖.pptx
mclmath
 
ncuma_函數畫圖.pptx
ncuma_函數畫圖.pptxncuma_函數畫圖.pptx
ncuma_函數畫圖.pptx
NCU MCL
 
Ch5 教學
Ch5 教學Ch5 教學
Ch5 教學
hungchiayang1
 
SymPy在微積分上的應用:範例.pptx
SymPy在微積分上的應用:範例.pptxSymPy在微積分上的應用:範例.pptx
SymPy在微積分上的應用:範例.pptx
mclmath
 
ncuma_SymPy符號運算套件.pptx
ncuma_SymPy符號運算套件.pptxncuma_SymPy符號運算套件.pptx
ncuma_SymPy符號運算套件.pptx
NCU MCL
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin
 
Ptyhon 教學 003 函數
Ptyhon 教學 003 函數Ptyhon 教學 003 函數
Ptyhon 教學 003 函數
信宏 陳
 
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
ChengHui Weng
 
ncuma_Taylor 多項式.pptx
ncuma_Taylor 多項式.pptxncuma_Taylor 多項式.pptx
ncuma_Taylor 多項式.pptx
NCU MCL
 
nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言
吳錫修 (ShyiShiou Wu)
 
nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言
吳錫修 (ShyiShiou Wu)
 

Similar to Appendix B (20)

函數微分_範例.pptx
函數微分_範例.pptx函數微分_範例.pptx
函數微分_範例.pptx
 
ncuma_函數微分計算.pptx
ncuma_函數微分計算.pptxncuma_函數微分計算.pptx
ncuma_函數微分計算.pptx
 
ncuma_函式.pptx
ncuma_函式.pptxncuma_函式.pptx
ncuma_函式.pptx
 
Ch9
Ch9Ch9
Ch9
 
函數畫圖.pptx
函數畫圖.pptx函數畫圖.pptx
函數畫圖.pptx
 
ncuma_函數畫圖.pptx
ncuma_函數畫圖.pptxncuma_函數畫圖.pptx
ncuma_函數畫圖.pptx
 
Ch5
Ch5Ch5
Ch5
 
Ch5
Ch5Ch5
Ch5
 
Ch5 教學
Ch5 教學Ch5 教學
Ch5 教學
 
Ch10
Ch10Ch10
Ch10
 
SymPy在微積分上的應用:範例.pptx
SymPy在微積分上的應用:範例.pptxSymPy在微積分上的應用:範例.pptx
SymPy在微積分上的應用:範例.pptx
 
ncuma_SymPy符號運算套件.pptx
ncuma_SymPy符號運算套件.pptxncuma_SymPy符號運算套件.pptx
ncuma_SymPy符號運算套件.pptx
 
Ch8
Ch8Ch8
Ch8
 
Ch 8
Ch 8Ch 8
Ch 8
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
 
Ptyhon 教學 003 函數
Ptyhon 教學 003 函數Ptyhon 教學 003 函數
Ptyhon 教學 003 函數
 
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
 
ncuma_Taylor 多項式.pptx
ncuma_Taylor 多項式.pptxncuma_Taylor 多項式.pptx
ncuma_Taylor 多項式.pptx
 
nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言
 
nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言nodeMCU IOT教學02 - Lua語言
nodeMCU IOT教學02 - Lua語言
 

More from Alisha Smile

Chem ex1 1082
Chem ex1 1082Chem ex1 1082
Chem ex1 1082
Alisha Smile
 
Chem ex2 1082
Chem ex2 1082Chem ex2 1082
Chem ex2 1082
Alisha Smile
 
Python3-3
Python3-3Python3-3
Python3-3
Alisha Smile
 
Chem ex2
Chem ex2Chem ex2
Chem ex2
Alisha Smile
 
Chem ex
Chem exChem ex
Chem ex
Alisha Smile
 
Func diff cal_exercise2-3
Func diff cal_exercise2-3Func diff cal_exercise2-3
Func diff cal_exercise2-3
Alisha Smile
 
Sym py exersice2
Sym py exersice2Sym py exersice2
Sym py exersice2
Alisha Smile
 
Sym py example
Sym py exampleSym py example
Sym py example
Alisha Smile
 
Sym py exersice1
Sym py exersice1Sym py exersice1
Sym py exersice1
Alisha Smile
 
Taylor exercise2
Taylor exercise2Taylor exercise2
Taylor exercise2
Alisha Smile
 
Taylor exercise1
Taylor exercise1Taylor exercise1
Taylor exercise1
Alisha Smile
 
Polar exercise2
Polar exercise2Polar exercise2
Polar exercise2
Alisha Smile
 
Polar exercise1
Polar exercise1Polar exercise1
Polar exercise1
Alisha Smile
 
Appendix A
Appendix AAppendix A
Appendix A
Alisha Smile
 

More from Alisha Smile (20)

Chem ex1 1082
Chem ex1 1082Chem ex1 1082
Chem ex1 1082
 
Chem ex2 1082
Chem ex2 1082Chem ex2 1082
Chem ex2 1082
 
3-3
3-33-3
3-3
 
3 -2
3 -23 -2
3 -2
 
3-1
3-13-1
3-1
 
Python3-3
Python3-3Python3-3
Python3-3
 
Chem ex2
Chem ex2Chem ex2
Chem ex2
 
Chem ex
Chem exChem ex
Chem ex
 
Func diff cal_exercise2-3
Func diff cal_exercise2-3Func diff cal_exercise2-3
Func diff cal_exercise2-3
 
Sym py exersice2
Sym py exersice2Sym py exersice2
Sym py exersice2
 
Sym py example
Sym py exampleSym py example
Sym py example
 
Sym py exersice1
Sym py exersice1Sym py exersice1
Sym py exersice1
 
Taylor exercise2
Taylor exercise2Taylor exercise2
Taylor exercise2
 
Taylor exercise1
Taylor exercise1Taylor exercise1
Taylor exercise1
 
Polar exercise2
Polar exercise2Polar exercise2
Polar exercise2
 
Polar exercise1
Polar exercise1Polar exercise1
Polar exercise1
 
Ch6
Ch6Ch6
Ch6
 
Appendix A
Appendix AAppendix A
Appendix A
 
Ch11
Ch11Ch11
Ch11
 
Ch4
Ch4Ch4
Ch4
 

Recently uploaded

20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
jhujyunjhang
 
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
jhujyunjhang
 
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
jhujyunjhang
 
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
jhujyunjhang
 
🎉黑客改成绩,只需1小时! 想知道学霸的秘诀吗?跟着我们一起来揭秘吧~ 🤔💡 #技术分享 #考试技巧 #快速提分【微信:oojjiijj】
🎉黑客改成绩,只需1小时! 想知道学霸的秘诀吗?跟着我们一起来揭秘吧~ 🤔💡 #技术分享 #考试技巧 #快速提分【微信:oojjiijj】🎉黑客改成绩,只需1小时! 想知道学霸的秘诀吗?跟着我们一起来揭秘吧~ 🤔💡 #技术分享 #考试技巧 #快速提分【微信:oojjiijj】
🎉黑客改成绩,只需1小时! 想知道学霸的秘诀吗?跟着我们一起来揭秘吧~ 🤔💡 #技术分享 #考试技巧 #快速提分【微信:oojjiijj】
微信 tytyqqww业务接单
 
2024-06-14 師大_AI 新浪潮下的產業人才培育_90 mins_蔡明順.pdf
2024-06-14  師大_AI 新浪潮下的產業人才培育_90 mins_蔡明順.pdf2024-06-14  師大_AI 新浪潮下的產業人才培育_90 mins_蔡明順.pdf
2024-06-14 師大_AI 新浪潮下的產業人才培育_90 mins_蔡明順.pdf
Taiwan AI Academy
 
20230913-開放資料流程-柯智仁.pdf_20230913-開放資料流程-柯智仁.pdf
20230913-開放資料流程-柯智仁.pdf_20230913-開放資料流程-柯智仁.pdf20230913-開放資料流程-柯智仁.pdf_20230913-開放資料流程-柯智仁.pdf
20230913-開放資料流程-柯智仁.pdf_20230913-開放資料流程-柯智仁.pdf
jhujyunjhang
 
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
jhujyunjhang
 
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
jhujyunjhang
 
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
趙 亨利
 
根据课文训练学生习写《可以喝的书》,丙组作文也是一篇供料作文,满分为十分.pptx
根据课文训练学生习写《可以喝的书》,丙组作文也是一篇供料作文,满分为十分.pptx根据课文训练学生习写《可以喝的书》,丙组作文也是一篇供料作文,满分为十分.pptx
根据课文训练学生习写《可以喝的书》,丙组作文也是一篇供料作文,满分为十分.pptx
OOJIANHANGMoe
 
20240521-資料清理-OpenRefine-劉璟儀.pdf_20240521-資料清理-OpenRefine-劉璟儀.pdf
20240521-資料清理-OpenRefine-劉璟儀.pdf_20240521-資料清理-OpenRefine-劉璟儀.pdf20240521-資料清理-OpenRefine-劉璟儀.pdf_20240521-資料清理-OpenRefine-劉璟儀.pdf
20240521-資料清理-OpenRefine-劉璟儀.pdf_20240521-資料清理-OpenRefine-劉璟儀.pdf
jhujyunjhang
 
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
jhujyunjhang
 
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
jhujyunjhang
 
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
jhujyunjhang
 

Recently uploaded (15)

20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
 
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
 
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
 
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
 
🎉黑客改成绩,只需1小时! 想知道学霸的秘诀吗?跟着我们一起来揭秘吧~ 🤔💡 #技术分享 #考试技巧 #快速提分【微信:oojjiijj】
🎉黑客改成绩,只需1小时! 想知道学霸的秘诀吗?跟着我们一起来揭秘吧~ 🤔💡 #技术分享 #考试技巧 #快速提分【微信:oojjiijj】🎉黑客改成绩,只需1小时! 想知道学霸的秘诀吗?跟着我们一起来揭秘吧~ 🤔💡 #技术分享 #考试技巧 #快速提分【微信:oojjiijj】
🎉黑客改成绩,只需1小时! 想知道学霸的秘诀吗?跟着我们一起来揭秘吧~ 🤔💡 #技术分享 #考试技巧 #快速提分【微信:oojjiijj】
 
2024-06-14 師大_AI 新浪潮下的產業人才培育_90 mins_蔡明順.pdf
2024-06-14  師大_AI 新浪潮下的產業人才培育_90 mins_蔡明順.pdf2024-06-14  師大_AI 新浪潮下的產業人才培育_90 mins_蔡明順.pdf
2024-06-14 師大_AI 新浪潮下的產業人才培育_90 mins_蔡明順.pdf
 
20230913-開放資料流程-柯智仁.pdf_20230913-開放資料流程-柯智仁.pdf
20230913-開放資料流程-柯智仁.pdf_20230913-開放資料流程-柯智仁.pdf20230913-開放資料流程-柯智仁.pdf_20230913-開放資料流程-柯智仁.pdf
20230913-開放資料流程-柯智仁.pdf_20230913-開放資料流程-柯智仁.pdf
 
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
 
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
 
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
 
根据课文训练学生习写《可以喝的书》,丙组作文也是一篇供料作文,满分为十分.pptx
根据课文训练学生习写《可以喝的书》,丙组作文也是一篇供料作文,满分为十分.pptx根据课文训练学生习写《可以喝的书》,丙组作文也是一篇供料作文,满分为十分.pptx
根据课文训练学生习写《可以喝的书》,丙组作文也是一篇供料作文,满分为十分.pptx
 
20240521-資料清理-OpenRefine-劉璟儀.pdf_20240521-資料清理-OpenRefine-劉璟儀.pdf
20240521-資料清理-OpenRefine-劉璟儀.pdf_20240521-資料清理-OpenRefine-劉璟儀.pdf20240521-資料清理-OpenRefine-劉璟儀.pdf_20240521-資料清理-OpenRefine-劉璟儀.pdf
20240521-資料清理-OpenRefine-劉璟儀.pdf_20240521-資料清理-OpenRefine-劉璟儀.pdf
 
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
 
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
 
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
 

Appendix B

  • 1. 附錄B 裝飾器 附 錄 B 裝 飾 器 python 程式設計 python 簡要講義 國立中央大學數學系 吳維漢
  • 2. 附錄B 裝飾器 python 函式為第一類物件 (一) 2  python 函式為第一類物件(first-class object)  函式可當成物件使用  函式可當成參數傳入另一個函式使用 def square( fn , a , b ) : return [ fn(x) for x in range(a,b+1) ] # 將 abs 傳入 square 函式使用 print( square( abs , -2 , 2 ) ) # 印出 [2, 1, 0, 1, 2] def square( a , b ) : return [ x*x for x in range(a,b+1) ] # foo 即是 square foo = square print( foo( -2 , 2 ) ) # 印出 [4, 1, 0, 1, 4]
  • 3. 附錄B 裝飾器 python 函式為第一類物件 (二) 3  函式可回傳函式  函式內可定義函式 # 回傳設定係數後的一元二次方程式函式 def spoly( a , b , c ) : return lambda x : a*x*x + b*x + c # fn = x**2 + 2*x + 1 fn = spoly(1,2,1) for x in range(3) : print( x , fn(x) ) # 印出:0 1,1 4,2 9 共三列 def fsum( f , g ) : # fn 為兩函式之和 def fn(x) : return f(x) + g(x) return fn def square(x) : return x * x def cubic(x) : return x * x * x # h(x) = square(x) + cubic(x) h = fsum( square , cubic ) for x in range(0,3) : print( x , h(x) ) # 印出:0 0,1 2,2 12 共三列
  • 4. 附錄B 裝飾器 python 函式為第一類物件 (三) 4  函式可存入其它資料型別中 # 使用上例的函式 fns = [ square , cubic ] # fns 串列內存兩函式 for x in range(0,3) : print( x , end=" " ) for fn in fns : print( fn(x) , end=“ ” ) # 印出:0 0 0,1 1 1,2 4 8 三列 print()
  • 5. 附錄B 裝飾器 函式裝飾器 (一) 5  函式裝飾器:以函式當為裝飾器  用來包裝函式的函式,擴充原有函式功能 1. 版本一 def square(x) : return x*x def cubic(x) : return x*x*x # 計算在 x 在 [a,b] 之間的函數數值和 def fsum_over( fn , a , b ) : return sum( [ fn(x) for x in range(a,b+1) ] ) # 分別將 square 與 cubic 函式當成參數傳入 print( fsum_over( square , -2 , 2 ) ) # 印出:10 print( fsum_over( cubic , -2 , 2 ) ) # 印出:0  以上 square、cubic、fsum_over 三函式各自獨立
  • 6. 附錄B 裝飾器 函式裝飾器 (二) 6 2. 版本二 def square(x) : return x*x def cubic(x) : return x*x*x # decorate 函式名稱,非保留字 def decorate( fn ) : def fsum_over( a , b ) : return sum( [ fn(x) for x in range(a,b+1) ] ) return fsum_over # decorate 回傳的 fsum_over 被當成新的 square,square 函式不再是 原有 square square = decorate(square) # 這裡的 square 事實上是 fsum_over 函式,square 變成雙參數函式 print( square(-2,2) ) # 印出:10  以上接收的 square 函式是原有函式 square 與 fsum_over 的合體函式,等同 square 函式經過 decorate 裝飾器函式的處理後「融合」了兩個函式功能,造成 square 函式產生質變,由單參數函式變為雙參數函式。
  • 7. 附錄B 裝飾器 函式裝飾器 (三) 7 def rangesum( fn ) : def fsum_over( a , b ) : return sum( [ fn(x) for x in range(a,b+1) ] ) return fsum_over def square(x) : return x*x square = rangesum(square) def cubic(x) : return x*x*x cubic = rangesum(cubic) 可分別簡化為: def rangesum( fn ) : def fsum_over( a , b ) : return sum( [ fn(x) for x in range(a,b+1) ] ) return fsum_over @rangesum def square(x) : return x*x @rangesum def cubic(x) : return x*x*x  裝飾器簡化語法:
  • 8. 附錄B 裝飾器 類別裝飾器 (一) 8  類別裝飾器:以類別當為裝飾器  函式運算子:__call__ class RangeSum : def __init__( self , fn ) : self.fn = fn # 函式運算子:讓物件可用函式方式執行實例方法 def __call__( self , a , b ) : return sum( [ self.fn(x) for x in range(a,b+1) ] ) # 輸入 abs 絕對值函式 foo = RangeSum( abs ) # 以下兩者相同,都印出 12 print( foo.__call__(-3,3) ) print( foo(-3,3) )  foo 為 RangeSum 物件,foo(-3,3) 等同 foo.__call__(-3,3)
  • 9. 附錄B 裝飾器 類別裝飾器 (二) 9  使用類別裝飾器:需定義類別的函式運算子 @RangeSum def square( x ) : return x*x @RangeSum def cubic( x ) : return x*x*x # 分別執行 RangeSum 的函式運算子 print( square(-2,2) ) # 印出:10 print( cubic(-2,2) ) # 印出:0  定義類別裝飾器時需連同設定類別的函式運算子
  • 11. 範例 (二) 11附錄B 裝飾器 import pylab # 類別裝飾器 class Fn_Val : # 起始設定方法 def __init__( self , fn ) : self.fn = fn # 函式運算子 def __call__( self , xs , *fns ) : ys = [] for x in xs : ys += [ self.fn( list( map( lambda f : f(x) , fns ) ) ) ] return ys @Fn_Val def maxf(xs) : return max(xs) @Fn_Val def minf(xs) : return min(xs) @Fn_Val def avgf(xs) : return (max(xs)+min(xs))/2 # sin(x/2) def sin2(x) : return pylab.sin(x/2)
  • 12. 範例 (三) 12附錄B 裝飾器 if __name__ == ’__main__’ : pi = pylab.pi # [0,2pi] 200 個點 xs = pylab.linspace(0, 2*pi, 200) # 利用裝飾器計算若干函數的最大值,最小值,平均值 ys1 = maxf(xs, pylab.sin, pylab.cos, sin2) ys2 = minf(xs, pylab.sin, pylab.cos, sin2) ys3 = avgf(xs, pylab.sin, pylab.cos, sin2) # 白底 pylab.figure(facecolor=’w’) # 畫 sin(x) cos(x) sin(x/2) 函式圖形 pylab.plot(xs, pylab.sin(xs), color=’r’, lw=3, label=’sin(x)’) pylab.plot(xs, pylab.cos(xs), color=’g’, lw=3, label=’cos(x)’) pylab.plot(xs, sin2(xs), color=’b’, lw=3, label=’sin(x/2)’) # 畫 max min avg 圖形 pylab.plot(xs, ys1, ’*c:’, lw=1, label=’max val’) pylab.plot(xs, ys2, ’om:’, lw=1, label=’min val’) pylab.plot(xs, ys3, ’.k:’, lw=1, label=’avg val’) pylab.title("max, min, avg values of sin(x), cos(x), sin(x/2)", fontsize=20) pylab.grid() pylab.legend() pylab.show()