星期六, 6月 24, 2017

Python Basic Day 3 小記

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
      • 要完成某件目的所需要的元素