Python 基本語法與科學計算套件的使用: Python 基礎(二)

四堂課程大綱

  • 第一堂-Python 基礎(一):Python 簡介及環境建立、Python程式的編寫及執行、資料型態、基本輸入輸出、流程控制
  • 第二堂-Python 基礎(二):檔案讀寫、例外處理、函數、模組、物件導向
  • 第三堂-Python科學計算套件(一):Numpy、Matplotlib
  • 第四堂-Python科學計算套件(二):Scipy、Astropy

檔案讀寫

使用open()函數開啟檔案,第一個參數為檔名,第二個參數為對該檔案的使用方法:

  • 只讀取檔案中的資料(預設): r
  • 開啟一個新檔案將資料寫入,若檔案已存在,則會複寫: w
  • 將資料累加至所開啟的檔案末端: a
  • 讀寫檔案資料: r+

In [1]:
# 開啟一個新檔案來寫入黑洞X-ray雙星的資訊
file = open('BHXBs.txt', 'w') 
file.write('黑洞X-ray雙星名稱, Mass Function (單位:太陽質量)\n')
file.writelines(['GX 339-4,  %4.2f\n' %(5.8), 'GRS 1915+105, %4.2f\n' %(9.5), 'XTE J1550-564,  %4.2f\n' %(6.9)]) # 格式化字串舊用法
file.close()

In [2]:
# 讀取BHXBs.txt 並印出每一行內容
file = open('BHXBs.txt')
for line in file:
    print(line[:-1])
file.close()


黑洞X-ray雙星名稱, Mass Function (單位:太陽質量)
GX 339-4,  5.80
GRS 1915+105, 9.50
XTE J1550-564,  6.90

例外處理

  • 沒有使用例外處理

In [3]:
period = input("請輸入雙星軌道周期 (單位為秒,請輸入數字): ")
period = float(period)
print(period)


請輸入雙星軌道周期 (單位為秒,請輸入數字): 嘿嘿,我偏不輸入數字
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-ec5f60319f26> in <module>()
      1 period = input("請輸入雙星軌道周期 (單位為秒,請輸入數字): ")
----> 2 period = float(period)
      3 print(period)

ValueError: could not convert string to float: '嘿嘿,我偏不輸入數字'
  • 使用例外處理

In [4]:
try:
    period = input("請輸入雙星軌道周期 (單位為秒,請輸入數字): ")
    period = float(period)
    print(period)
except:
    print("抓到了,你不是輸入數字!")


請輸入雙星軌道周期 (單位為秒,請輸入數字): 嘿嘿,我偏不輸入數字
抓到了,你不是輸入數字!
  • 針對不同例外情形做處理

In [5]:
try:
    file = open('NSXBs.txt', 'r')
    print(float('周期'))
except IOError:
    print('檔案不存在,無法開啟!')
except ValueError:
    print('你輸入的資料無法轉成數值!')
else:
    file.close()


檔案不存在,無法開啟!

模組與套件

  • 引入模組、套件的方法

In [6]:
import math
print(math.pi)


3.141592653589793

In [7]:
import numpy as np
print(np.pi)


3.141592653589793

In [8]:
from astropy.constants import G, M_sun
print(2 * np.pi * G)
print(3 * M_sun)


4.193297343046741e-10 m3 / (kg s2)
5.9673e+30 kg

自訂函數


In [9]:
def mass_function(period, radial_velocity):
    """    
    輸入雙星軌道周期及伴星的徑向速度,印出雙星系統的mass function。
    
    Parameters
    ----------------   
    period: 數字
            軌道周期 (單位為 s)。
    radial_velocity: 數字
            伴星的徑向速度 (單位為 m/s)    
    """
    G = 6.67 * 10 ** -11
    print(period / (2 * np.pi * G) * radial_velocity ** 3)

In [10]:
mass_function(144000, 400000)


2.199058404100311e+31

In [11]:
mass_function?
print(G)


  Name   = Gravitational constant
  Value  = 6.67384e-11
  Error  = 8e-15
  Units  = m3 / (kg s2)
  Reference = CODATA 2010
  • 使用關鍵字return回傳函數的結果

In [12]:
def mass_function2(period, radial_velocity):
    """    
    輸入雙星軌道周期及伴星的徑向速度,回傳雙星系統的mass function。
    
    Parameters
    ----------------
    period: 數字
            軌道周期 (單位為 s)。
    radial_velocity: 數字
            伴星的徑向速度 (單位為 m/s)
    
    Returns
    -----------
    result: 數字
            mass function的計算值。    
    """
    G = 6.67 * 10 ** -11
    result = period / (2 * np.pi * G) * radial_velocity ** 3
    return result

In [13]:
mass_function2(144000, 400000)


Out[13]:
2.199058404100311e+31

In [14]:
def mass_function3(period, radial_velocity = 400000):
    """    
    輸入雙星軌道周期及伴星的徑向速度,回傳雙星系統的mass function。
    
    Parameters
    ----------------
    period: 數字
            軌道周期 (單位為 s)。
    radial_velocity: 數字
            伴星的徑向速度 (單位為 m/s),預設值為400000。
    
    Returns
    -----------
    result: 數字
            mass function的計算值。    
    """
    G = 6.67 * 10 ** -11
    result = period / (2 * np.pi * G) * radial_velocity ** 3
    return result

In [15]:
mass_function3(144000)


Out[15]:
2.199058404100311e+31

物件導向與類別

  • 待編輯

作業小專題

  • 修改上堂課的作業,將程式所挑出的黑洞X-ray雙星相關資訊寫進一個檔案中
  • 修改上堂課的作業,增加例外處理至程式中,避免使用者輸入非預期的值
  • 修改上堂課的作業,將要計算的式子寫成自訂函數,並在程式中引用