天天看點

進擊python第4篇:初探子產品

子產品,用一砣代碼實作了某個功能的代碼集合,任何python程式都可以作為子產品導入,n個 .py 檔案組成的代碼集合就稱為子產品。

but 為什麼要引入子產品概念?主要原因是代碼重用(code reuse)。請記住:為了讓代碼可重用,請将它子產品化!!!

子產品分為三種:

  • 自定義子產品
  • 内置子產品
  • 開源子產品

定義子產品

1.單個py檔案就可作為子產品

進擊python第4篇:初探子產品

2.為了組織好子產品,将它們分組為包(package),當子產品存儲在py檔案中時,包就是子產品所在的目錄。記住:為了讓python将其作為包對待,必須包含一個名為__init__.py的子產品

進擊python第4篇:初探子產品

接下來,如何使用子產品?就需要将放置在定義的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/ (>_<)

進擊python第4篇:初探子產品

标準庫:一些最愛

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部落格