顯示具有 python教學(三) 標籤的文章。 顯示所有文章
顯示具有 python教學(三) 標籤的文章。 顯示所有文章

python 小程式製作範例(課後小作業)

試利用模組設計一個可以選擇二種運算的python程式
(1)可以輸入二個整數四則運算的運算器
(2)可以輸入一個整數值,並計算它的階層乘積
(3)離開

解答:

# homework.py
# coding: utf-8

import re,math

def isValidFormula(strFormula):
    regexp =re.compile(r'\d{1,5}[+|-|*|/]\d{1,5}')
    if regexp.search(strFormula): return True
    return False

def getArithmeticResult(strFormula):
    try:
        if isValidFormula(strFormula): return eval(strFormula)
        else: return 'input error'
    except: return 'input error'

def getFactorialResult(strNum):
    if strNum.isdigit(): return math.factorial(int(strNum))
    else: return 'input error'

def main():
    while True:
        print u'''
請選擇
(1)可以輸入二個整數四則運算的運算器
(2)可以輸入一個整數值,並計算它的階層乘積
(3)離開
               '''
        strChoice=raw_input('Select:')
        if strChoice.strip()=='1':
            print u'請輸入運算式:'
            strFormula=raw_input()
            print u'%s=%s'%(strFormula,getArithmeticResult(strFormula))
        elif strChoice.strip()=='2':
            print u'請輸入階層數字:'
            strNum=raw_input()
            print u'%s!=%s'%(strNum,getFactorialResult(strNum))
        elif strChoice.strip()=='3': break
        else: print 'your choice is error'
        print '=========================================='

if __name__=='__main__':
    main()    

python 套件處理

python 套件處理

在python中,你可以將多個同類型或屬性的模組集中在同一個目錄中,並在目錄中加入 __init__.py的檔案,來組合成一個套件。

假設有個套件的目錄成員結構如下:
mylib/
       __init__.py
       myMathFun.py
       countNum.py


若要引入myMathFun模組,可以在檔案上方加入
from mylib import myMathFun

若要使用myMathFun中的類別物件或函式,可用
#main.py
from mylib import myMathFun
.....
.....
myMathFun.sumHierarchy(5)


在 __init__.py中所定義的物件類別或函式,可直接引入使用。
#mylib/__init__,py

def sayHello():
    print "hello')
   
#main.py
from mylib import sayHello
.....
.....
sayHello()
       

python 的模組設計

python 的模組設計

在應用程式開發的過程中,我們會將相關的函式或類別程式碼組合在同一支程式,這個我們稱之為模組,當這個模組需要被其它程式引用時,可以使用import 的指令來將模組引入,經常一個應用程式是必須要引用多個模組module才能完成應執行的任務。

對每一個python檔案而言,我們也可以將它視為一個模組,例如,我們在myMathFun.py檔案中設計一個可以計算階層加總的函式:

# myMathFun.py

def sumHierarchy(n):
    if n<2: return 1
    else: return n+sumHierarchy(n-1)



如果要在其它的程式中執行,就必須利用import 的語法或from xxx import xxx的語法將模組或模組中的函式引入:

# main.py
import myMathFun

def main():
    print '1+2+...5= %d'%myMathFun.sumHierarchy(5)

if __name__=='__main__':
    main()


當要引入特定物件類別或函式時:

# main.py
from myMathFun import sumHierarchy

def main():
    print '1+2+...5= %d'%sumHierarchy(5)

if __name__=='__main__':
    main()

執行結果為:

C:\Users\Administrator>python main.py
1+2+...5= 15


在上述例子中 __name__ 常數是每一個模組都有的內建常數,這個常數的值就是模組的名稱(也是檔案的名稱),當python直譯器在執行一個python檔案時,它會將此常數__name__的值改成__main__也就是切入程式執行的點,所以在此 if 判斷式中所執行的函式或程式就會在程式一開始執行時被載入運作。

python 自訂例外處理

python 自訂例外處理

在程式碼中,若能預測會發生的例外情形,你就可以使用raise關鍵字來手動抛出一個例外物件。

def getDivisionResult(intNum1,intNum2):
    if not intNum2:
        raise ZeroDivisionError('Number 2 can not be zero')
    else:
        return intNum1/intNum2

try:
    getDivisionResult(10,0)
except ZeroDivisionError as err:
    print 'Error Message is %s'%err

...
Error Message is Number 2 can not be zero
>>>


try:
    getDivisionResult(10,5)
except ZeroDivisionError as err:
    print 'Error Message is %s'%err
...
2
>>>

各種型式的error 物件,可參考:https://docs.python.org/2/library/exceptions.html

另外,我們也可以自行定義例外物件,自行定義的物件,必須要繼承自Exception物件類別。
class DivisionErr(Exception):
    def __init__(self,msg):
        self.message=msg

def getDivisionResult(intNum1,intNum2):
    if not intNum2:
        raise DivisionErr('Number 2 can not be zero')
    else:
        return intNum1/intNum2

try:
    getDivisionResult(10,0)
except DivisionErr as err:
    print err.message


...
Number 2 can not be zero

若你想要讓你定義的物件實體像一般常見到的例外物件一樣,能夠直接透過物件實體來輸出時,你必須在物件中加入 __str__ 的物件方法。

class DivisionErr(Exception):
    def __init__(self,msg):
        self.message=msg
   
    def __str__(self):
        return self.message

def getDivisionResult(intNum1,intNum2):
    if not intNum2:
        raise DivisionErr('Number 2 can not be zero')
    else:
        return intNum1/intNum2

try:
    getDivisionResult(10,0)
except DivisionErr as err:
    print 'Error message is %s'%err

...
Error message is Number 2 can not be zero


python的例外處理

python的例外處理

當python的程式碼在執行時,若發生語法或程式運算錯誤時,系統就會丟出一個例外(Exception)錯誤,如:

>>> i=0
>>> 10/i
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

>>> whild i<10: print i
  File "<stdin>", line 1
    whild i<10: print i
          ^
SyntaxError: invalid syntax
>>>

python 的物件繼承

python 的物件繼承

物件的繼承關係( inheritance),可簡化繁複設計的程式碼,讓物件保留母物件的屬性及方法,並可以加上或修改自己的屬性與方法,這種方式大大提高程式設計的效率,繼承的方法就是在物件類別名稱後的小括號中,放入要繼承的物件類別名稱(如Student物件類別繼承了object物件。

class Student(object):
    number=''
    def __init__(self,number):
        self.number=number
        self.__initSomething()
    def set_number(self,number):
        self.number=number
    def get_number(self):
        return self.number
    def __initSomething(self):
        print 'init something....'

class TimeWorker(Student):
    __name=''
    def __init__(self,number,name):
        self.number=number
        self.__name=name
    def set_name(self,name):
        self.__name=name
    def get_name(self):
        return self.__name

>>> tw=TimeWorker('N95050005','eric')
>>> tw.get_number()
'N95050005'
>>> tw.get_name()
'eric'

python 的物件設計

python 的物件設計

在python 中除了可以定義函式外,它也同樣有物件導向的設計,class關鍵字則是用來定義物件的類別,物件類別可以用來產生物件實體 ( instance) ,所以它也可以視為是一種資料型態。

class Student(object):
    number=''
    def __init__(self,number):
        self.number=number
    def set_number(self,number):
        self.number=number
    def get_number(self):
        return self.number

>>> std=Student('')
>>> print std.get_number()

>>> std=Student('N90000001')
>>> print std.get_number()
N90000001

>>> std.set_number('N00010001')
>>> print std.get_number()
N00010001
>>>