子產品,用一砣代碼實作了某個功能的代碼集合,任何python程式都可以作為子產品導入,n個 .py 檔案組成的代碼集合就稱為子產品。
but 為什麼要引入子產品概念?主要原因是代碼重用(code reuse)。請記住:為了讓代碼可重用,請将它子產品化!!!
子產品分為三種:
- 自定義子產品
- 内置子產品
- 開源子產品
定義子產品
1.單個py檔案就可作為子產品

2.為了組織好子產品,将它們分組為包(package),當子產品存儲在py檔案中時,包就是子產品所在的目錄。記住:為了讓python将其作為包對待,必須包含一個名為__init__.py的子產品
接下來,如何使用子產品?就需要将放置在定義的path路徑中的子產品導入
路徑(linux環境下):
>>> import sys,pprint
>>> pprint.pprint(sys.path)
['',
'/usr/lib64/python26.zip',
'/usr/lib64/python2.6',
'/usr/lib64/python2.6/plat-linux2',
'/usr/lib64/python2.6/lib-tk',
'/usr/lib64/python2.6/lib-old',
'/usr/lib64/python2.6/lib-dynload',
'/usr/lib64/python2.6/site-packages',
'/usr/lib/python2.6/site-packages']
>>>
列印sys子產品(python解釋器相關)中path變量,可以看出是清單,是以:
>>> sys.path.append('/root/')
>>> pprint.pprint(sys.path)
['',
'/usr/lib64/python26.zip',
'/usr/lib64/python2.6',
'/usr/lib64/python2.6/plat-linux2',
'/usr/lib64/python2.6/lib-tk',
'/usr/lib64/python2.6/lib-old',
'/usr/lib64/python2.6/lib-dynload',
'/usr/lib64/python2.6/site-packages',
'/usr/lib/python2.6/site-packages',
'/root/']
>>>
導入方法:
import module
from module.xx.xx import xx
from module.xx.xx import xx as rename
from module.xx.xx import *
探究子產品
Python之是以應用越來越廣泛,在一定程度上也依賴于其為程式員提供了大量的子產品以供使用,那如何獲知子產品能做什麼?授之以魚不如授之以漁
以copy子產品為例
1.使用tab鍵
參考readline和rlcompleter子產品,做如下操作
[root@test site-packages]# cd /usr/lib/python2.6/site-packages
[root@test site-packages]# vim tab.py
1 #!/usr/bin/python
2 import sys
3 import readline
4 import rlcompleter
5 import os
6 readline.parse_and_bind('tab: complete')
7 histfile =os.path.join(os.environ['HOME'],'.pythonhistory')
[root@test site-packages]# python
>>> import tab,copy
>>> copy. #tab鍵
copy.Error( copy.__package__ copy._deepcopy_dispatch
copy.PyStringMap copy.__reduce__( copy._deepcopy_inst(
copy._EmptyClass copy.__reduce_ex__( copy._deepcopy_list(
copy.__all__ copy.__repr__( copy._deepcopy_method(
copy.__class__( copy.__setattr__( copy._deepcopy_tuple(
copy.__delattr__( copy.__sizeof__( copy._keep_alive(
copy.__dict__ copy.__str__( copy._reconstruct(
copy.__doc__ copy.__subclasshook__( copy._test(
copy.__file__ copy._copy_dispatch copy.copy(
copy.__format__( copy._copy_immutable( copy.deepcopy(
copy.__getattribute__( copy._copy_inst( copy.dispatch_table
copy.__hash__( copy._copy_with_constructor( copy.error(
copy.__init__( copy._copy_with_copy_method( copy.name
copy.__name__ copy._deepcopy_atomic( copy.t(
copy.__new__( copy._deepcopy_dict(
2.dir
>>> import copy
>>> [n for n in dir(copy) if not n.startswith('_')]
['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't']
3.help
使用help擷取子產品具體功能
>>> help(copy.copy)
Help on function copy in module copy:
copy(x)
Shallow copy operation on arbitrary Python objects.
See the module's __doc__ string for more info.
4.第三方開發工具pycharm
當然最快捷的就是使用第三方工具
下載下傳位址:http://www.jetbrains.com/pycharm/download/
快速激活方法:http://idea.lanyus.com/ (>_<)
标準庫:一些最愛
1.os
用于提供通路多個作業系統級别的操作
os.mkdir('dirname') 生成單級目錄;相當于shell中mkdir dirname
os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.rmdir('dirname') 删除單級空目錄,若目錄不為空則無法删除,報錯;相當于shell中rm dirname
os.removedirs('dirname1') 若目錄為空,則删除,并遞歸到上一級目錄,如若也為空,則删除,依此類推
os.listdir('dirname') 列出指定目錄下的所有檔案和子目錄,包括隐藏檔案,并以清單方式列印
os.sep 輸出作業系統特定的路徑分隔符,win下為"\\",Linux下為"/"
os.system("bash command") 運作shell指令,直接顯示,但拿不到傳回值
os.name 輸出字元串訓示目前使用平台。win->'nt'; Linux->'posix'
os.path.exists(path) 如果path存在,傳回True;如果path不存在,傳回False
os.path.isabs(path) 如果path是絕對路徑,傳回True
os.path.isfile(path) 如果path是一個存在的檔案,傳回True。否則傳回False
os.path.isdir(path) 如果path是一個存在的目錄,則傳回True。否則傳回False
os.path.getatime(path) 傳回path所指向的檔案或者目錄的最後通路時間
os.path.getmtime(path) 傳回path所指向的檔案或者目錄的最後修改時間
os.system:用于運作外部程式,例如啟動浏覽器
unix中:os.system(‘/usr/bin/firefox’)
windows:os.system(r’c:\”Program Files”\”Mozilla FireFox”\firefox.exe’)
注意:将Program Files和Mozilla FireFox作為整體字元串放入引号,以免程式誤解;同此,window引用特有函數—os.startfile:
windows:os.system(r’c:\Program Files\Mozilla FireFox\firefox.exe’)
為了更簡潔,啟動浏覽器引入了webbrowser子產品:
>>> import webbrowser
>>> webbrowser.open('http://www.baidu.com')
True
之後網頁就以預設的浏覽器打開,簡潔吧?
2.fileinput
前面介紹了檔案操作open()或file(),同此fileinput子產品可輕松地周遊文本檔案中的所有行
fileinput.filename 傳回正在處理的檔案名
fileinput.lineno 傳回處理過的行數,數值是累加的
fileinput.filelineno 傳回目前檔案處理的行數
fileinput.nextfile 會關閉目前檔案,跳到下一檔案
fileinput.close 結束疊代
fileinput.input 子產品中最重要的函數,傳回用于for循環周遊對象
3.Json/Pickle
用于序列化的兩個子產品
- · json,用于字元串 和 python資料類型間進行轉換
- · pickle,用于python特有的類型 和 python的資料類型間進行轉換
Json子產品提供了四個功能:dumps、dump、loads、load
pickle子產品提供了四個功能:dumps、dump、loads、load
json和xml共同作用都是不同語言、程式之間的資料交換,充當翻譯角色
import pickle
import json
#json用于處理常用的資料類型如字典、序列
dic = {
'lzl':{"age":22},
'bruce':{'age':25}
}
li = [1,2,'a','v']
###dumps 不會寫入,是以需用write寫入檔案
# transfer = json.dumps(dic)
# transfer1 = json.dumps(li)
# print type(transfer) #<type 'str'>
# print type(transfer1)#<type 'str'>
# with open('to_disk.txt','r+') as obj:
# obj.write(transfer+'\n')
# obj.write(transfer1)
###dump 會寫入檔案
with open('to_disk.txt','w') as obj:
json.dump(dic,obj)
###loads讀取
# with open('to_disk.txt','rb') as obj1:
# ret = json.loads(obj1.read())
# print ret,type(ret)
with open('to_disk.txt','rb') as obj1:
ret = json.load(obj1)
print ret,type(ret)#<type 'dict'>
#pikle
# with open('to_disk.txt','w') as obj:
# ret = pickle.dump(dic,obj)
# print type(ret) #<type 'NoneType'>
pickle為python特有且處理的資料類型較json多
4.time
時間相關的操作,時間有三種表示方式:
- · 時間戳 1970年1月1日之後的秒,即:time.time()
- · 格式化的字元串 2014-11-11 11:11, 即:time.strftime('%Y-%m-%d')
- 結構化時間 元組包含了:年、日、星期等... time.struct_time 即:time.localtime()
時間戳
>>> time.time()
1453536914.157
>>> time.mktime(time.localtime())
1453536984.0
格式化的字元串
>>> time.strftime('%Y-%m-%d',time.localtime())
'2016-01-23'
>>> time.asctime()
'Sat Jan 23 16:36:36 2016'
>>> time.ctime(time.time())
'Sat Jan 23 16:37:27 2016'
結構化時間
>>> time.strptime('2014-11-11', '%Y-%m-%d')
time.struct_time(tm_year=2014, tm_mon=11, tm_mday=11, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=315, tm_isdst=-1)
print time.gmtime() #可加時間戳參數
print time.localtime() #可加時間戳參數
>>> t= time.localtime()
>>> t
time.struct_time(tm_year=2016, tm_mon=1, tm_mday=23, tm_hour=16, tm_min=54, tm_sec=42, tm_wday=5, tm_yday=23, tm_isdst=0)
>>> t.tm_yday #通過類似索引擷取
23
5.random
random子產品包含傳回随機數的函數,模拟或用于任何産生随機輸出的程式
random() 傳回0<n<=1之間的随機實數
uniform(a,b) 傳回随機實數n ,a<=n<b
shuffle(seq[,random]) 傳入可變序列,對元素進行随機移位
sample(seq,n) 從序列中選擇n個随機且獨立的元素
模拟投色子機制:
1 from random import randrange
2 num = input('how many dice?')
3 sides = input('how many sides per die?')
4 n = 0
5 for i in range(num):n += randrange(sides) + 1
6 print 'The total points is :',n
輸出:
how many dice?4
how many sides per die?6
The total points is : 17
以上為學習要點筆記記錄,更多參考武sir部落格