列舉幾個常用的python內(nèi)置模塊

1另患、getpass

2纽乱、os

3、sys

4昆箕、subprocess

5鸦列、hashlib

6租冠、json

7、pickle

8薯嗤、shutil

9顽爹、time

10、datetime

11骆姐、re

12镜粤、random

13、configparser

14诲锹、traceback

15繁仁、yaml

16、itertools

17归园、logging

1黄虱、getpass模塊詳解

pwd = getpass.getpass("請輸入密碼:") #輸入密碼不可見

yh = getpass.getuser() #顯示當(dāng)前登錄系統(tǒng)用戶名;

2、os模塊

os.getcwd() #獲取當(dāng)前工作目錄庸诱,即當(dāng)前python腳本工作的目錄路徑

os.chdir("dirname") #改變當(dāng)前腳本工作目錄捻浦;相當(dāng)于shell下cd

os.curdir #返回當(dāng)前目錄: ('.')

os.pardir #獲取當(dāng)前目錄的父目錄字符串名:('..')

os.makedirs('dirname1/dirname2') #可生成多層遞歸目錄

os.removedirs('dirname1') #若目錄為空,則刪除桥爽,并遞歸到上一級目錄朱灿,如若也為空,則刪除钠四,依此類推

os.mkdir('dirname') #生成單級目錄盗扒;相當(dāng)于shell中mkdir dirname

os.rmdir('dirname') #刪除單級空目錄,若目錄不為空則無法刪除缀去,報錯侣灶;相當(dāng)于shell中rmdir dirname

os.listdir('dirname') #列出指定目錄下的所有文件和子目錄,包括隱藏文件缕碎,并以列表方式打印

os.remove() #刪除一個文件

os.rename("oldname","newname") #重命名文件/目錄

os.stat('path/filename') #獲取文件/目錄信息

os.sep #輸出操作系統(tǒng)特定的路徑分隔符褥影,win下為"\",Linux下為"/"

os.linesep #輸出當(dāng)前平臺使用的行終止符,win下為"\t\n",Linux下為"\n"

os.pathsep #輸出用于分割文件路徑的字符串

os.name #輸出字符串指示當(dāng)前使用平臺咏雌。win->'nt'; Linux->'posix'

os.system("bash command") #運行shell命令凡怎,直接顯示

os.environ #獲取系統(tǒng)環(huán)境變量

os.path.abspath(path) #返回path規(guī)范化的絕對路徑

os.path.split(path) #將path分割成目錄和文件名二元組返回

os.path.dirname(path) #返回path的目錄。其實就是os.path.split(path)的第一個元素

os.path.basename(path) #返回path最后的文件名赊抖。如何path以/或\結(jié)尾统倒,那么就會返回空值。即os.path.split(path)的第二個元素

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.join(path1[, path2[, ...]]) #將多個路徑組合后返回,第一個絕對路徑之前的參數(shù)將被忽略

os.path.getatime(path) #返回path所指向的文件或者目錄的最后存取時間

os.path.getmtime(path) #返回path所指向的文件或者目錄的最后修改時間

3骗卜、sys模塊

sys.argv #命令行參數(shù)List宠页,第一個元素是程序本身路徑

sys.exit(n) #退出程序,正常退出時exit(0)

sys.version #獲取Python解釋程序的版本信息

sys.maxint #最大的Int值

sys.path #返回模塊的搜索路徑寇仓,初始化時使用PYTHONPATH環(huán)境變量的值

sys.platform #返回操作系統(tǒng)平臺名稱

sys.stdout.write('please:')

val = sys.stdin.readline()[:-1]

4举户、subprocess模塊

執(zhí)行系統(tǒng)命令

os.system

commands.* --廢棄,3.x中被移除

result = commands.getoutput('cmd')

以上執(zhí)行shell命令的相關(guān)的模塊和函數(shù)的功能均在 subprocess 模塊中實現(xiàn)遍烦,并提供了更豐富的功能俭嘁。

call

執(zhí)行命令,返回狀態(tài)碼

ret = subprocess.call(["ls", "-l"], shell=False)

ret = subprocess.call("ls -l", shell=True)

shell = True 服猪,允許 shell 命令是字符串形式

check_call

執(zhí)行命令供填,如果執(zhí)行狀態(tài)碼是 0 ,則返回0罢猪,否則拋異常

subprocess.check_call(["ls", "-l"])

subprocess.check_call("exit 1", shell=True)

check_output(此下兩條命令在2.6執(zhí)行失敗近她,要是2.7應(yīng)該才可以)

執(zhí)行命令,如果狀態(tài)碼是 0 膳帕,則返回執(zhí)行結(jié)果粘捎,否則拋異常

subprocess.check_output(["echo", "Hello World!"])

subprocess.check_output("exit 1", shell=True)

subprocess.Popen(...)

用于執(zhí)行復(fù)雜的系統(tǒng)命令

參數(shù):

args: #shell命令,可以是字符串或者序列類型(如:list危彩,元組)

bufsize: #指定緩沖攒磨。0 無緩沖,1 行緩沖,其他 緩沖區(qū)大小,負(fù)值 系統(tǒng)緩沖

stdin, stdout, stderr: #分別表示程序的標(biāo)準(zhǔn)輸入、輸出恬砂、錯誤句柄

preexec_fn: #只在Unix平臺下有效咧纠,用于指定一個可執(zhí)行對象(callable object),它將在子進程運行之前被調(diào)用

close_sfs: #在windows平臺下泻骤,如果close_fds被設(shè)置為True漆羔,則新創(chuàng)建的子進程將不會繼承父進程的輸入、輸出狱掂、錯誤管道演痒。所以不能將close_fds設(shè)置為True同時重定向子進程的標(biāo)準(zhǔn)輸入、輸出與錯誤(stdin, stdout, stderr)趋惨。

shell: #同上

cwd: #用于設(shè)置子進程的當(dāng)前目錄

env: #用于指定子進程的環(huán)境變量鸟顺。如果env = None,子進程的環(huán)境變量將從父進程中繼承。

universal_newlines: #不同系統(tǒng)的換行符不同讯嫂,True -> 同意使用 \n

startupinfo與createionflags #只在windows下有效

將被傳遞給底層的CreateProcess()函數(shù)蹦锋,用于設(shè)置子進程的一些屬性,如:主窗口的外觀欧芽,進程的優(yōu)先級等等

import subprocess

ret1 = subprocess.Popen(["mkdir","t1"])

ret2 = subprocess.Popen("mkdir t2", shell=True)

5莉掂、hashlib模塊

用于加密相關(guān)的操作,代替了md5模塊和sha模塊千扔,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 憎妙,MD5 算法

import hashlib

######## md5

hash = hashlib.md5()

hash.update('admin')

print hash.hexdigest()

######## sha1

hash = hashlib.sha1()

hash.update('admin')

print hash.hexdigest()

######## sha256

hash = hashlib.sha256()

hash.update('admin')

print hash.hexdigest()

######## sha384

hash = hashlib.sha384()

hash.update('admin')

print hash.hexdigest()

######## sha512

hash = hashlib.sha512()

hash.update('admin')

print hash.hexdigest()

以上加密算法雖然依然非常厲害,但時候存在缺陷曲楚,即:通過撞庫可以反解厘唾。所以,有必要對加密算法中添加自定義key再來做加密龙誊。

import hashlib

######## md5

hash = hashlib.md5('898oaFs09f')

hash.update('admin')

print hash.hexdigest()

還不夠吊抚垃?python 還有一個 hmac 模塊,它內(nèi)部對我們創(chuàng)建 key 和 內(nèi)容 再進行處理然后再加密

import hmac

h = hmac.new('wueiqi')

h.update('hellowo')

print h.hexdigest()

6,7载迄、json 和 pickle

用于序列化的兩個模塊

json讯柔,用于字符串 和 python數(shù)據(jù)類型間進行轉(zhuǎn)換

pickle,用于python特有的類型 和 python的數(shù)據(jù)類型間進行轉(zhuǎn)換

Json模塊提供了四個功能:dumps护昧、dump魂迄、loads、load

pickle模塊提供了四個功能:dumps惋耙、dump捣炬、loads、load

pickle

import pickle

data = {'k1' : 123, 'k2' : 'hello'}

p_str = pickle.dumps(data) #序列化

print p_str

loadsed = pickle.loads(p_str) #反序列化

print loadsed

序列化到文件

li = ['wsyht',11,22,'ok','yes']

pickle.dump(li,open('test.txt','w')) #序列化到文件

pickle.load(open('test.txt')) #從文件反序列化出來

json

import json

data = {'k1':123,'k2':'abc'}

str = json.dumps(data)

stt= json.loads(str)

序列化到文件

li = ['wsyht',11,22,'ok','yes']

json.dump(li,open('test.txt','w')) #序列化到文件

json.load(open('test.txt')) #從文件反序化出來

8绽榛、shutil模塊

shutil.make_archive(base_name, format,...)

創(chuàng)建壓縮包并返回文件路徑贱勃,例如:zip接剩、tar

base_name: 壓縮包的文件名江耀,也可以是壓縮包的路徑养盗。只是文件名時,則保存至當(dāng)前目錄届腐,否則保存至指定路徑铁坎,

如:www =>保存至當(dāng)前路徑

如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/

format: 壓縮包種類,“zip”, “tar”, “bztar”犁苏,“gztar”

root_dir: 要壓縮的文件夾路徑(默認(rèn)當(dāng)前目錄)

owner: 用戶硬萍,默認(rèn)當(dāng)前用戶

group: 組,默認(rèn)當(dāng)前組

logger: 用于記錄日志围详,通常是logging.Logger對象

將 /Users/wupeiqi/Downloads/test 下的文件打包放置當(dāng)前程序目錄

import shutil

ret = shutil.make_archive("wwwwwwwwww", 'gztar', root_dir='/Users/wupeiqi/Downloads/test')

將 /mnt下的文件打包放置 /tmp目錄

import shutil

ret = shutil.make_archive("/tmp/www", 'gztar', root_dir='/mnt') #2.6用不了朴乖,2.7或許可以

類似于高級API,而且主要強大之處在于其對文件的復(fù)制與刪除操作更是比較支持好。

相關(guān)API介紹

copyfile(src, dst)

從源src復(fù)制到dst中去买羞。當(dāng)然前提是目標(biāo)地址是具備可寫權(quán)限袁勺。拋出的異常信息為

IOException. 如果當(dāng)前的dst已存在的話就會被覆蓋掉。

copyfile( src, dst) 從源src復(fù)制到dst中去畜普。當(dāng)然前提是目標(biāo)地址是具備可寫權(quán)限魁兼。拋出的異常信息為IOException. 如果當(dāng)前的dst已存在的話就會被覆蓋掉

copymode( src, dst) 只是會復(fù)制其權(quán)限其他的東西是不會被復(fù)制的

copystat( src, dst) 復(fù)制權(quán)限、最后訪問時間漠嵌、最后修改時間

copy( src, dst) 復(fù)制一個文件到一個文件或一個目錄

copy2( src, dst) 在copy上的基礎(chǔ)上再復(fù)制文件最后訪問時間與修改時間也復(fù)制過來了,類似于cp –p的東西

copy2( src, dst) 如果兩個位置的文件系統(tǒng)是一樣的話相當(dāng)于是rename操作盖呼,只是改名儒鹿;如果是不在相同的文件系統(tǒng)的話就是做move操作

copytree(olddir,newdir,True/Flase) 把olddir拷貝一份newdir,如果第3個參數(shù)是True几晤,則復(fù)制目錄時將保持文件夾下的符號連接约炎,如果第3個參數(shù)是False,則將在復(fù)制的目錄下生成物理副本來替代符號連接

shutil.rmtree("te") 刪除一個目錄

import shutil

shutil.copyfile('f:/temp.txt', 'f:/os.txt') #復(fù)制文件

shutil.copytree('f:/temp', 'f:/os') #復(fù)制目錄

######## zip的用法

shutil 對壓縮包的處理是調(diào)用 ZipFile 和 TarFile 兩個模塊來進行的蟹瘾,詳細(xì):

import zipfile

壓縮

z = zipfile.ZipFile('laxi.zip', 'w')

z.write('a.log') #壓縮包寫入a.log

z.write('data.data') #寫入data文件

z.close()

解壓

z = zipfile.ZipFile('laxi.zip', 'r')

z.extractall()

z.close()

9圾浅、time模塊

三種表示主式:

1、時間戳 1970年1月1日后的秒

2憾朴、元組包含了:年狸捕、日、星期等...time.struct_time

3众雷、格式化的字符串 2014-11-11 11:11 print time.time()

時間戳形式存在

print time.time()

print time.mktime(time.localtime()) #print (time.localtime())此為元組形式灸拍,這一整句意思是把元組形式轉(zhuǎn)化成時間戳形式

元組形式存在

print time.gmtime() #可加時間戳參數(shù)

print time.localtime() #可加時間戳參數(shù)

print time.strptime('2014-11-11','%Y-%m-%d') #字符串形式轉(zhuǎn)換成元組形式

字符串形式存在

print time.strftime('%Y-%m-%d') #默認(rèn)當(dāng)前時間,必須記住砾省,工作中用得最多

print time.strftime('%Y-%m-%d',time.localtime()) #默認(rèn)當(dāng)前時間

print time.asctime()

print time.asctime(time.localtime())

print time.ctime(time.time())

時間的三種表示方式演示

import time

print time.time()

1469014348.5 #秒鸡岗,時間戳的方式

print time.gmtime()

time.struct_time(tm_year=2016, tm_mon=7, tm_mday=20, tm_hour=11, tm_min=25, tm_sec=53, tm_wday=2, tm_yday=202, tm_isdst=0)

print time.strftime('%Y-%m-%d %H:%M:%S')

2016-07-20 19:36:16

10、datetime模塊

import datetime

'''

datetime.date:表示日期的類编兄。常用的屬性有year, month, day

datetime.time:表示時間的類轩性。常用的屬性有hour, minute, second, microsecond

datetime.datetime:表示日期時間

datetime.timedelta:表示時間間隔,即兩個時間點之間的長度

timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

strftime("%Y-%m-%d")

'''

import datetime

print datetime.datetime.now()

print datetime.datetime.now() - datetime.timedelta(days=5)

11狠鸳、re模塊

compile

match search findall

group groups

正則表達式常用格式:

字符:\d \w \t .

次數(shù):* + ? {m} {m,n}

示例:

!#/usr/bin/env python

coding:utf-8

import re

result1 = re.match('\d+', '1afsfweasfcxvsfd123') #在你給的字符串起始位置去匹配,\d從數(shù)字開始找揣苏,+表示一個到多個

if result1: #當(dāng)result1等于True的時候,就是匹配碰煌,如果匹配就輸出里面的內(nèi)容

print result1.group()  #用group方法把他匹配的內(nèi)容輸出出來

else:

print 'nothing'

result2 = re.search('\d+', 'alsfj3af') #在整個內(nèi)容里面去匹配舒岸,\d從數(shù)字開始找,+表示一個到多個

if result2:

print result2.group()    #用group方法把他匹配的內(nèi)容輸出出來

result3 = re.findall('\d+', 'asfaf11sf22lj33') #只要匹配全都拿出來

print result3

com = re.compile('\d+')

print com.findall('asfaf11sf22lj33')

result5 = re.search('(\d+)\w*(\d+)','aasflsjfa12aaljsf22lj13bb')

print result5.group() #所有匹配內(nèi)容輸出

print result5.groups() #只把括號\d芦圾,也就是組里面的內(nèi)容輸出

result6 = re.search('a{3,5}','aaaaaa') #匹配3到5次的aaaaa輸出出來

print result6.group()

總結(jié):

match:只在第一個字符串開始找蛾派,如果沒有匹配,則不再繼續(xù)找,如果第一個字符串中有洪乍,則只輸出第一個

searh: 在所有內(nèi)容里找眯杏,直到找到為止,但只輸出找到的第一個

findall:把所有找到的匹配的內(nèi)容壳澳,都通過列表的形式打印出來

compile: 編譯之后再去匹配岂贩,這樣可以加快匹配的速度

group: 把他匹配的內(nèi)容輸出出來

groups:分組

匹配的字符:

\d:表示數(shù)字的意思

\w: 代表下劃線,字母巷波,數(shù)字

\t:制表符萎津,除了回車以外的所有字符

匹配的次數(shù):

  • 大于等于0,0到多個
  • 大于等于1抹镊,1個到多個

? 0或1

{m} 次數(shù)锉屈,如a{6},出現(xiàn)6次a的進行匹配

{m,n} 如a{3,7} 出現(xiàn)3到7次的就進行匹配

例子1:

法1

ip = '12.23.84.dsfa.23s.3234lsjfw+23sfaf192.168.32.43_w342d@#9436'

import re

re.findall('[0-9]{1,3}',ip)

['12', '23', '84', '23', '323', '4', '23', '192', '168', '32', '43', '342', '943', '6']

re.findall('[0-9]{1,3}.[0-9]{1,3}',ip)

['12.23', '192.168', '32.43']

re.findall('[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}',ip)

['12.23.84', '192.168.32']

re.findall('[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}',ip)

['192.168.32.43']

法2:

re.findall('(\d+)',ip)

['12', '23', '84', '23', '3234', '23', '192', '168', '32', '43', '342', '9436']

re.findall('(.+\d+){1,3}',ip)

['.84', '.23', '.3234', '.43']

re.findall('(?:.+\d+){1,3}',ip) #?:表示匹配括號的那一組數(shù)據(jù)垮耳,必須連著

['.23.84', '.23', '.3234', '.168.32.43']

re.findall('[0-9]{1,3}(?:.+\d+){3}',ip)

['192.168.32.43']

法3:

re.findall('(?:\d+.+){3}\d{1,3}',ip)

['192.168.32.43']

法4:

re.findall('(?:\d{1,3}.){3}\d{1,3}',ip)

['192.168.32.43']

12颈渊、random模塊

import random

print random.random()

print random.randint(1,2)

print random.randrange(1,10)

隨機驗證碼實例:

import random

checkcode = ''

for i in range(4):

current = random.randrange(0,4)

if current != i:

    temp = chr(random.randint(65,90))

else:

    temp = random.randint(0,9)

checkcode += str(temp)

print checkcode

13、ConfigParser模塊

用于對特定的配置進行操作终佛,當(dāng)前模塊的名稱在 python 3.x 版本中變更為 configparser俊嗽。

1.讀取配置文件

-read(filename) 直接讀取ini文件內(nèi)容

-sections() 得到所有的section,并以列表的形式返回

-options(section) 得到該section的所有option

-items(section) 得到該section的所有鍵值對

-get(section,option) 得到section中option的值铃彰,返回為string類型

-getint(section,option) 得到section中option的值绍豁,返回為int類型

2.寫入配置文件

-add_section(section) 添加一個新的section

-set( section, option, value) 對section中的option進行設(shè)置

     需要調(diào)用write將內(nèi)容寫入配置文件。

[root@test1 mnt]# cat data.txt

[sec_a]

a_key1 = 20

a_key2 = 10

[sec_b]

b_key1 = 121

b_key2 = b_value2

b_key3 = $r

b_key4 = 127.0.0.1

import ConfigParser

cf = ConfigParser.ConfigParser()

cf.read("data.txt")

['data.txt']

secs = cf.sections() #獲得所有區(qū)域

print 'sections:', secs

sections: ['sec_b', 'sec_a']

opts = cf.options("sec_a")

print 'options:', opts

options: ['a_key1', 'a_key2']

for sn in secs:

... print cf.options(sn) #打印出每個區(qū)域的所有屬性

...

['b_key4', 'b_key1', 'b_key2', 'b_key3']

['a_key1', 'a_key2']

str_val = cf.get("sec_a", "a_key1")

int_val = cf.getint("sec_a", "a_key2")

print "value for sec_a's a_key1:", str_val

value for sec_a's a_key1: 20

print "value for sec_a's a_key2:", int_val

value for sec_a's a_key2: 10

cf.set("sec_b", "b_key3", "new-$r")

cf.set("sec_b", "b_newkey", "new-value")

cf.add_section('a_new_section')

cf.set('a_new_section', 'new_key', 'new_value')

cf.write(open("data.txt", "w"))

cf.has_section('a_new_section') #判斷存不存在[sec_a]

True

cf.remove_section('sec_a') #刪除[sec_a]

True

cf.has_section('a_section') #判斷存不存在[sec_a]

False

cf.write(open("data.txt", "w"))

14牙捉、traceback模塊

[root@test1 mnt]# cat test.py

!/usr/bin/env python

coding:utf-8

import traceback

try:

1/0  

except Exception,e:

#print e

traceback.print_exc(file=open('tb.txt','w+'))

else:

print 'success'

15妹田、yaml模塊的使用

yaml在python上的具體實現(xiàn):PyYaml

將yaml寫成配置腳本test.yaml ,以下介紹如何讀寫yaml配置。

使用python的yaml庫PyYAML鹃共。http://pyyaml.org/

安裝到python lib下后就可以正常使用了鬼佣。

加載yaml

import yaml

f = open('test.yaml') #讀取文件

x = yaml.load(f) #導(dǎo)入

print x

f.close()

import yaml

f = open('d:/newtree.yaml', "w")

yaml.dump(dataMap, f)

f.close()

16、itertools模塊的使用

[root@test1 mnt]# cat test.py

######## count(1)

import itertools

natuals = itertools.count(1) #count創(chuàng)建無限個迭代器

for n in natuals:

    print n

######## cycle()

cycle()會把傳入的一個序列無限重復(fù)下去:

import itertools

cs = itertools.cycle('ABC') # 注意字符串也是序列的一種

for c in cs:

... print c

######## repeat()

repeat()負(fù)責(zé)把一個元素?zé)o限重復(fù)下去霜浴,不過如果提供第二個參數(shù)就可以限定重復(fù)次數(shù):

ns = itertools.repeat('A', 10)

for n in ns:

... print n

...

打印10次'A'

######## takewhile()

natuals = itertools.count(1)

ns = itertools.takewhile(lambda x: x <= 10, natuals)

for n in ns:

... print n

...

打印出1到10

######## chain()

for c in itertools.chain('ABC', 'XYZ'):

print c

迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'

######## groupby()

groupby()把迭代器中相鄰的重復(fù)元素挑出來放在一起:

for key, group in itertools.groupby('AAABBBCCAAA'):

... print key, list(group) # 為什么這里要用list()函數(shù)呢晶衷?

...

A ['A', 'A', 'A']

B ['B', 'B', 'B']

C ['C', 'C']

A ['A', 'A', 'A']

######## groupby()

實際上挑選規(guī)則是通過函數(shù)完成的,只要作用于函數(shù)的兩個元素返回的值相等阴孟,這兩個元素就被認(rèn)為是在一組的晌纫,而函數(shù)返回值作為組的key。如果我們要忽略大小寫分組永丝,就可以讓元素'A'和'a'都返回相同的key:

for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):

... print key, list(group)

...

A ['A', 'a', 'a']

B ['B', 'B', 'b']

C ['c', 'C']

A ['A', 'A', 'a']

######## imap()

for x in itertools.imap(lambda x, y: x * y, [10, 20, 30], itertools.count(1)):

... print x

itertools

閱讀: 5044

Python的內(nèi)建模塊itertools提供了非常有用的用于操作迭代對象的函數(shù)锹漱。

首先,我們看看itertools提供的幾個“無限”迭代器:

import itertools

natuals = itertools.count(1)

for n in natuals:

... print n

...

1

2

3

...

因為count()會創(chuàng)建一個無限的迭代器慕嚷,所以上述代碼會打印出自然數(shù)序列哥牍,根本停不下來毕泌,只能按Ctrl+C退出。

cycle()會把傳入的一個序列無限重復(fù)下去:

import itertools

cs = itertools.cycle('ABC') # 注意字符串也是序列的一種

for c in cs:

... print c

...

'A'

'B'

'C'

'A'

'B'

'C'

...

同樣停不下來嗅辣。

repeat()負(fù)責(zé)把一個元素?zé)o限重復(fù)下去撼泛,不過如果提供第二個參數(shù)就可以限定重復(fù)次數(shù):

ns = itertools.repeat('A', 10)

for n in ns:

... print n

...

打印10次'A'

無限序列只有在for迭代時才會無限地迭代下去,如果只是創(chuàng)建了一個迭代對象澡谭,它不會事先把無限個元素生成出來愿题,事實上也不可能在內(nèi)存中創(chuàng)建無限多個元素。

無限序列雖然可以無限迭代下去蛙奖,但是通常我們會通過takewhile()等函數(shù)根據(jù)條件判斷來截取出一個有限的序列:

natuals = itertools.count(1)

ns = itertools.takewhile(lambda x: x <= 10, natuals)

for n in ns:

... print n

...

打印出1到10

itertools提供的幾個迭代器操作函數(shù)更加有用:

chain()

chain()可以把一組迭代對象串聯(lián)起來潘酗,形成一個更大的迭代器:

for c in itertools.chain('ABC', 'XYZ'):

print c

迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'

groupby()

groupby()把迭代器中相鄰的重復(fù)元素挑出來放在一起:

for key, group in itertools.groupby('AAABBBCCAAA'):

... print key, list(group) # 為什么這里要用list()函數(shù)呢?

...

A ['A', 'A', 'A']

B ['B', 'B', 'B']

C ['C', 'C']

A ['A', 'A', 'A']

實際上挑選規(guī)則是通過函數(shù)完成的雁仲,只要作用于函數(shù)的兩個元素返回的值相等崎脉,這兩個元素就被認(rèn)為是在一組的,而函數(shù)返回值作為組的key伯顶。如果我們要忽略大小寫分組,就可以讓元素'A'和'a'都返回相同的key:

for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):

... print key, list(group)

...

A ['A', 'a', 'a']

B ['B', 'B', 'b']

C ['c', 'C']

A ['A', 'A', 'a']

imap()

imap()和map()的區(qū)別在于骆膝,imap()可以作用于無窮序列祭衩,并且,如果兩個序列的長度不一致阅签,以短的那個為準(zhǔn)掐暮。

for x in itertools.imap(lambda x, y: x * y, [10, 20, 30], itertools.count(1)):

... print x

注意imap()返回一個迭代對象,而map()返回list政钟。當(dāng)你調(diào)用map()時路克,已經(jīng)計算完畢:

r = map(lambda x: x*x, [1, 2, 3])

r # r已經(jīng)計算出來了

[1, 4, 9]

當(dāng)你調(diào)用imap()時,并沒有進行任何計算:

r = itertools.imap(lambda x: x*x, [1, 2, 3])

r

<itertools.imap object at 0x103d3ff90>

r只是一個迭代對象

itertools

閱讀: 5044

Python的內(nèi)建模塊itertools提供了非常有用的用于操作迭代對象的函數(shù)养交。

首先精算,我們看看itertools提供的幾個“無限”迭代器:

import itertools

natuals = itertools.count(1)

for n in natuals:

... print n

...

1

2

3

...

因為count()會創(chuàng)建一個無限的迭代器,所以上述代碼會打印出自然數(shù)序列碎连,根本停不下來灰羽,只能按Ctrl+C退出。

cycle()會把傳入的一個序列無限重復(fù)下去:

import itertools

cs = itertools.cycle('ABC') # 注意字符串也是序列的一種

for c in cs:

... print c

...

'A'

'B'

'C'

'A'

'B'

'C'

...

同樣停不下來鱼辙。

repeat()負(fù)責(zé)把一個元素?zé)o限重復(fù)下去廉嚼,不過如果提供第二個參數(shù)就可以限定重復(fù)次數(shù):

ns = itertools.repeat('A', 10)

for n in ns:

... print n

...

打印10次'A'

無限序列只有在for迭代時才會無限地迭代下去,如果只是創(chuàng)建了一個迭代對象倒戏,它不會事先把無限個元素生成出來怠噪,事實上也不可能在內(nèi)存中創(chuàng)建無限多個元素。

無限序列雖然可以無限迭代下去杜跷,但是通常我們會通過takewhile()等函數(shù)根據(jù)條件判斷來截取出一個有限的序列:

natuals = itertools.count(1)

ns = itertools.takewhile(lambda x: x <= 10, natuals)

for n in ns:

... print n

...

打印出1到10

itertools提供的幾個迭代器操作函數(shù)更加有用:

chain()

chain()可以把一組迭代對象串聯(lián)起來傍念,形成一個更大的迭代器:

for c in itertools.chain('ABC', 'XYZ'):

print c

迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'

groupby()

groupby()把迭代器中相鄰的重復(fù)元素挑出來放在一起:

for key, group in itertools.groupby('AAABBBCCAAA'):

... print key, list(group) # 為什么這里要用list()函數(shù)呢矫夷?

...

A ['A', 'A', 'A']

B ['B', 'B', 'B']

C ['C', 'C']

A ['A', 'A', 'A']

實際上挑選規(guī)則是通過函數(shù)完成的,只要作用于函數(shù)的兩個元素返回的值相等捂寿,這兩個元素就被認(rèn)為是在一組的口四,而函數(shù)返回值作為組的key。如果我們要忽略大小寫分組秦陋,就可以讓元素'A'和'a'都返回相同的key:

for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):

... print key, list(group)

...

A ['A', 'a', 'a']

B ['B', 'B', 'b']

C ['c', 'C']

A ['A', 'A', 'a']

imap()

imap()和map()的區(qū)別在于蔓彩,imap()可以作用于無窮序列,并且驳概,如果兩個序列的長度不一致赤嚼,以短的那個為準(zhǔn)。

for x in itertools.imap(lambda x, y: x * y, [10, 20, 30], itertools.count(1)):

... print x

...

10

40

90

注意imap()返回一個迭代對象顺又,而map()返回list更卒。當(dāng)你調(diào)用map()時,已經(jīng)計算完畢:

r = map(lambda x: x*x, [1, 2, 3])

r # r已經(jīng)計算出來了

[1, 4, 9]

當(dāng)你調(diào)用imap()時稚照,并沒有進行任何計算:

r = itertools.imap(lambda x: x*x, [1, 2, 3])

r

<itertools.imap object at 0x103d3ff90>

r只是一個迭代對象

必須用for循環(huán)對r進行迭代蹂空,才會在每次循環(huán)過程中計算出下一個元素:

for x in r:

... print x

...

1

4

9

這說明imap()實現(xiàn)了“惰性計算”,也就是在需要獲得結(jié)果的時候才計算果录。類似imap()這樣能夠?qū)崿F(xiàn)惰性計算的函數(shù)就可以處理無限序列:

r = itertools.imap(lambda x: x*x, itertools.count(1))

for n in itertools.takewhile(lambda x: x<100, r):

... print n

17上枕、logging模塊

用于便捷記錄日志且線程安全的模塊

import logging

logging.basicConfig(filename='log.log',

                format='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',

                datefmt='%Y-%m-%d %H:%M:%S %p',

                level=5)

logging.debug('debug')

logging.info('info')

logging.warning('warning')

logging.error('error')

logging.critical('critical')

logging.log(10,'log')

對于等級:

CRITICAL = 50

FATAL = CRITICAL

ERROR = 40

WARNING = 30

WARN = WARNING

INFO = 20

DEBUG = 10

NOTSET = 0

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市弱恒,隨后出現(xiàn)的幾起案子辨萍,更是在濱河造成了極大的恐慌,老刑警劉巖返弹,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锈玉,死亡現(xiàn)場離奇詭異,居然都是意外死亡义起,警方通過查閱死者的電腦和手機拉背,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來默终,“玉大人去团,你說我怎么就攤上這事∏钣迹” “怎么了土陪?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肴熏。 經(jīng)常有香客問我鬼雀,道長,這世上最難降的妖魔是什么蛙吏? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任源哩,我火速辦了婚禮鞋吉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘励烦。我一直安慰自己谓着,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布坛掠。 她就那樣靜靜地躺著赊锚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屉栓。 梳的紋絲不亂的頭發(fā)上舷蒲,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音友多,去河邊找鬼牲平。 笑死,一個胖子當(dāng)著我的面吹牛域滥,可吹牛的內(nèi)容都是我干的纵柿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼启绰,長吁一口氣:“原來是場噩夢啊……” “哼昂儒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起酬土,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎格带,沒想到半個月后撤缴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叽唱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年屈呕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棺亭。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡虎眨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镶摘,到底是詐尸還是另有隱情嗽桩,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布凄敢,位于F島的核電站碌冶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涝缝。R本人自食惡果不足惜扑庞,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一譬重、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罐氨,春花似錦臀规、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至约啊,卻和暖如春邑遏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恰矩。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工记盒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人外傅。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓纪吮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親萎胰。 傳聞我的和親對象是個殘疾皇子碾盟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容