2016年5月31日 星期二

Python_Note11

Module

一個 Python 檔案 (.py) 檔就是一個模組 (module) ,模組內可以定義變數 (variable) 、函數 (function) 、類別 (class) 或是任何需要的程式內容。

利用關鍵字 (keyword) import ,我們可以在模組裡用其他定義好的模組內容。

模組的使用
建立模組:
  • 建立一個A,py檔
  • 建立第二個B,py檔
載入模組
  • 在第二個檔案輸入import A
  • 亦可使用from ModuleName import FunctionName
  • Python會將載入的模組編譯成A.pyc於B.py檔旁邊
  • 使用第二個方法可以使用‘*’表示載入所有函數
  • 用help()函數可以將模組定義的函數備註文字輸出
  • from module import * ,將module中的函數全部匯入,可以直接呼叫函數名稱來使用,不需要用module.function的方式來呼叫。

__name__

當在第二個檔案使用 import A,程式會先執行A,py模組中所有未縮排的程式碼後,才繼續執行B,py的程式碼。那我們是否應該把執行程式的模組跟放定義的模組分開來呢?大可不必,很多時候我們需要直接測試定義是否合用,因此直接放在相同檔案裡會比較方便,可是當作為其他檔案引入的時候,我們得用一套機制來區分引入跟非引入的情況,這個就得利用 Python 執行環境的預設變數 __name__ 了,當這個變數等於 "__main__" 的時候,就代表目前的模組是執行程式。

範例1:
#-*-coding:UTF-8 -*-
#  模組範例檔_1
import random

if __name__ == '__main__':     #被當主程式時才會被執行
    print('模組範例檔_1')

class tools:
    def generate_random_nums(self,len):
        nums=[]
        for i in range(len):
            nums.append(random.randint(1,100))
        return nums

Out:
模組範例檔_1

範例2:
#-*-coding:UTF-8 -*-
#  EX08_02_2.py
#  模組範例檔_2
import EX08_02_1

if __name__ == '__main__':       #被當主程式時才會被執行
    print('模組範例檔_2')

tools = EX08_02_1.tools()
print(tools.generate_random_nums(10))

Out:
模組範例檔_2                     #print('模組範例檔_1')非主程式,因此未被執行
[60, 58, 37, 16, 10, 96, 11, 47, 8, 93]

範例3: #使用from
#使用from
from EX08_02_1 import tools
if __name__ == '__main__':
    print('模組範例檔_2')

tool = tools()
print(tool.generate_random_nums(10))
範例4: # import...as...用法
# import...as...用法
import EX08_02_1 as ex
if __name__ == '__main__':
    print('模組範例檔_2')

tool = ex.tools()
print(tool.generate_random_nums(10))

範例3、4之Out皆同範例2

The Python Standard Library

https://docs.python.org/3.5/library/index.html

OS Module -- Miscellaneous operating system interfaces

提供顯示系統環境參數與指令功能函數

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
  • —對檔案或目錄更換名稱
  • —src引數是原本的資料夾
  • dst引數是修改後的資料夾名稱
os.renames('old.txt','new.txt'),'d:\\temp'

os.remove(path, *, dir_fd=None)
  • —移除檔案
  • path引數傳入檔案位置
  • 不會移除資料夾
os.removedirs(name)
  • 移除空的資料夾
os.listdir(path='.')
  • 輸出path引數位置的目錄和檔案名稱
—os.chdir(path)
  • 切換目錄到path引數位置
os.getcwd()
  • 顯示目前所在的目錄位置
os.mkdir(path[, mode])
  • 建立資料夾
  • path引數是建立 /刪除目錄的位置
  • mode引數是Unix平台使用的
os.rmdir(path)
  • 刪除目錄 (資料夾需空的才能刪除)
os.path.getsize(path)
  • 取得檔案大小
範例:
In[24]: os.path.getsize('C:\\Qt\\Qt5.5.1\\InstallationLog.txt')
Out[24]: 249342      #單位為byte

os.path.getctime(path)
  • 取得檔案的建立 日期
os.path.getmtime(path)
  • 取得檔案的修改日期
os.path.getatime(pah)
  • 取得檔案的存取日期
範例:
In[25]: os.path.getctime('C:\\Qt\\Qt5.5.1\\InstallationLog.txt')
Out[25]: 1450242104.5591452     #19700101000000秒的秒差值

os.path.isfile(path)
  • 判斷傳入的path引數是否為檔案
os.path.isdir(path)
  • 判斷傳入的path引數是否為目錄

random Module -- Generate pseudo-random numbers


random.random()
  • 隨機產生0.0<=x<1.0之間的數字
範例:
In[33]: random.random()
Out[33]: 0.6161858237684328

random.uniform(num1, num2)
  • 隨機產生num1<=x<num2的數字
範例:
In[34]: random.uniform(10,20)
Out[34]: 14.398467660358468

random.randint(1,10)
  • 產生一個1到10的數字
範例:
In[35]: random.randint(5,10)
Out[35]: 8

random.randrange(0,101)
  • 產生一個0到100的數字
範例:
In[36]: random.randrange(0,101)
Out[36]: 66

random.choice()
  • 將傳入的內容隨機取得
範例:
In[38]: members = ['Cash','Mary','Tom','Victor','Han']
In[39]: random.choice(members)
Out[39]: 'Tom'
In[40]: random.choice(members)
Out[40]: 'Tom'
In[41]: random.choice(members)
Out[41]: 'Tom'
In[42]: random.choice(members)
Out[42]: 'Victor'
In[43]: random.choice(members)
Out[43]: 'Cash'


random.shuffle()
  • 將傳入的序列型態資料內的項目順序以隨機順序產生
範例:
In[44]: members = ['Cash','Mary','Tom','Victor','Han']
In[45]: random.shuffle(members)
In[46]: members
Out[46]: ['Victor', 'Mary', 'Cash', 'Han', 'Tom']


random.sample()
  • 將傳入的序列項目以指定的長度顯示一個隨機項目值的序列
範例:
In[47]: members = ['Cash','Mary','Tom','Victor','Han']
In[48]: random.sample(members,3)
Out[48]: ['Cash', 'Victor', 'Mary']
In[49]: random.sample(members,3)
Out[49]: ['Victor', 'Cash', 'Han']
In[50]: random.sample(members,3)
Out[50]: ['Han', 'Mary', 'Victor']


time Module -- Time access and conversions


time.time()
  • 取得系統時間
範例:
In[51]: import time
In[52]: time.time()
Out[52]: 1463400683.5634313        #單位為 .xxxxx
In[53]: time.time()
Out[53]: 1463400690.88585

time.sleep(num)
  • 設定暫停時間
  • num = 停頓的秒數
範例:
#倒數十秒
In[68]: for i in range(10,-1,-1):
...     print(i)
...     time.sleep(1)

time.localtime()
  • 取得當地時間
回傳的格式如下:
time.struct_time(tm_year, tm_mon, tm_mday, tm_hour,
tm_min, tm_sec, tm_wday, tm_yday_, tm_isdst)

範例1:
In[54]: time.localtime()
Out[54]: time.struct_time(tm_year=2016, tm_mon=5, tm_mday=16, tm_hour=20, tm_min=12, tm_sec=47, tm_wday=0, tm_yday=137, tm_isdst=0)

範例2:
In[55]: t = time.localtime()
In[56]: t.tm_hour
Out[56]: 20
In[57]: t.tm_mon
Out[57]: 5

time.gmtime()
  • 取得UTC時間
time.strftime()
  • 設定時間格式以字串形式輸出 
time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())

範例:
In[63]: time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
Out[63]: '2016-05-16 20:20:22'

sys Module -- System-specific parameters and functions

https://docs.python.org/3/library/sys.html#module-sys

sys.argv[0]
  • 會回傳此程式檔案的位置與名稱
sys.argv
帶入參數以list形式儲存
sys.builtin_module_names
  • 回傳Python程式語言內所有內置模組名稱
sys.modules.keys()
  • 得知目前已經載入的模組
sys.platform
  • 取得目前作業系統的版本
sys.exit()
  • 宣告sys.exit(0)終止程式
sys.version
  • 回傳目前安裝在系統上的Python版本
  • 格式:’(#build_number, build_date, build_time)[compiler]’
sys.api_version
  • 回傳Python直譯器的C API版本
sys.version_info
  • 回傳一個tuple型態的值
  • (‘主要版本’, ’次要版本’, ’小版本’)
sys.winver
  • 回傳的版本數字是註冊在Windows裡的Python版本
sys.path
  • 定義Python搜尋模組的路徑

shutil Module -- High-level file operations

https://docs.python.org/3/library/shutil.html#module-shutil
比較高階的應用層,提供數個針對檔案操作的功能
shutil = shell + until

shutil.copytree(src, dst)
  • 複製整個目錄,包含目錄內的所有檔案
shutil.copy(src, dst)
  • 複製檔案
shutil.rmtree(path)
  • 移除整個目錄,包含目錄內的所有檔案
shutil.move(src, dst)
  • 移動檔案,移動時也可以進行更換檔案名稱
shutil.copystat(src, dst)
  • 複製檔案,會連同檔案屬性一 同複製
ertools.combinations(iterable, r)
  • Return r length subsequences of elements from the input iterable.

範例:In[38]: for a in combinations('ABCD',2):
...     print(a)
...     
Out:
('A', 'B')
('A', 'C')
('A', 'D')
('B', 'C')
('B', 'D')
('C', 'D')

沒有留言:

張貼留言