Day 3
9:00 ~ 10:22
Notes
- 自訂函數
- 要先定義 function 才能執行 function
- return 敘述
- return 單獨使用,會中斷函數的執行
- Python 對任何的回傳都有回傳值, 預設是 None
- 可以用 tuple 回傳多個值
練習檔案
# coding=utf-8
# function 要執行之前要先定義, 如果先執行一個沒有定義的 function就會出錯
# 如果這個時候執行 ff() 就會出錯
def ff():
#註解要寫在function 裡面, 方便日後查詢
'''Hello'''
print('Hello')
# return 單獨使用,會中斷函數的執行,會回到
return
# 所以這個 world 不會被列出
print('world')
# 執行 ff()
ff()
# 這邊來觀察回傳值
r = ff()
print(r)
print('====================')
#查詢 ff 的用法
help(ff)
print('====================')
# 自訂 return 值
def dd():
return 2+ 5
# 執行且列出
r=dd()
print(r)
輸出結果
Hello
Hello
None
====================
Help on function ff in module __main__:
ff()
Hello
====================
7
- yield 敘述
- 可以回傳 generator 物件
- 可以建立比較複雜的序列資料
練習檔案
# coding=utf-8
def ff():
# yield 可以回傳generator 物件
yield 100
yield 30
yield 500
yield 600
yield 700
r = ff()
# 直接 print r
print(r)
# 這邊可以透過 next 按順序列出
# next() 返回迭代器的下一个项目
print(next(r))
print(next(r))
print(next(r))
# 透過 tuple方式來收多個回傳值, 使用 tuple好處是不會被更動
lst = tuple(r)
# 前面因為已經使用 3 個, 這邊就可以觀察是剩下的2個內容
print(lst)
輸出結果
<generator object ff at 0x101b82830>
100
30
500
(600, 700)
== Class break ==
10:40 ~ 12:00
- 函數參數
- 讓函數做更彈性的運用
練習檔案
# coding=utf-8
def ff(a):
print('ff function', a)
# 這邊餵進去參數必須跟上面的數量一致
r = ff(10)
print(r)
print('===================')
def bb( a = 20):
print('bb function:', a)
# 沒有指定就是使用預設值
r=bb()
print(r)
# 也可以覆寫
s = bb(30)
print(s)
print('===================')
def cc(a = 7, b = 40):
print('cc function:', a, b)
# 參數的餵入依照位置的順序餵入
r = cc(8)
print(r)
# 使用 keyword 指定方式
s = cc( b=50)
print(s)
print('===================')
輸出結果
ff function 10
None
===================
bb function: 20
None
bb function: 30
None
===================
cc function: 8 40
None
cc function: 7 50
None
===================
- 變數的有效範圍
練習檔案
# coding=utf-8
# 這個 x 是全域變數, 因為直接在 python 內定義
x = 100
def ff():
# x 是區域變數, 所以只在該函數有效
x = 200
print('ff function:', x)
ff()
# 這邊的 x 會列出 100
print(x)
print('======================')
# nonlocal 要找時間再想一下
def dd():
x = 100
print('dd function:', x)
def gg():
nonlocal x
x = 200
print('gg', x)
gg()
print('ppp', x)
dd()
輸出結果
ff function: 200
100
======================
dd function: 100
gg 200
ppp 200
- 任意參數數量
練習檔案
# coding=utf-8
# 使用 * 來定義為 tuple
def ff(*a):
print('ppp', a)
ff(3, 4, 5)
print('===========')
# 使用 ** 為 dict
def dd(**b):
print('qqq', b)
dd()
x = { 'x':3, 'y':4, 'z':5}
print(x, type(x))
# 這邊要配合 dict 的方式
dd(**x)
輸出結果
ppp (3, 4, 5)
===========
qqq {}
{'z': 5, 'x': 3, 'y': 4} <class 'dict'>
qqq {'z': 5, 'x': 3, 'y': 4}
- 引用內建外部函數
- 使用 import 來匯入
- Python 的 import 是去執行, 不像其他的語言是 copy and paste
- 可以使用 as 來避免名稱衝突
- Module
- 每一個 .py的檔案就是一個 module
- __name__ 會印出module的名稱
== Class break ==
13:00 ~ 14:00
- Package
- 為了區分及管理不同的 module可以將 module 放到 package
- 資料夾對於 python, 稱之為 package
檔案在 testpackage/xx.py
# coding=utf-8
def ff():
print('hello')
ff()
練習檔案
# coding=utf-8
# xx.py 放在 testpackage 資料夾下, 所以就是 import testpackage.xx
import testpackage.xx
# from testpackage import xx
# 執行的時候要寫出所有的路徑
testpackage.xx.ff()
輸出結果
hello
hello
== Class break ==
14:15 ~ 15:15
- Decorator
- 呼叫某個 function 之前先自動呼叫另一個方法
- Memoization
- security
練習檔案
# coding=utf-8
def fa(f):
def helper():
# fa 原本的內容
print('fa')
#這邊就會執行 fb
f()
return helper
# 使用 @fa 方式進行 decorator
# 以前的方式是 fb = fa(fb), 將fb自己傳入 fa
# 有需要先執行 fa, 就在前面加上 @fa 就會先執行
@fa
def fb():
print('buiness')
# 希望執行 fb 之前先執行 fa
fb()
輸出結果
fa
buiness
== Class break ==
15:20 ~ 16:05
- Decorator 解說以及自主練習
16:05 ~ 17:00
Chapter 6
- 物件導向
- 關鍵在物件關係的差異
- 不同的目的, 會造成物件會有不同的關係
- 使用人的邏輯來架構系統
- 物件導向分析
- Domain Object
- 要完成某件目的所需要的元素
沒有留言:
張貼留言