Python作为一種高效的腳本語言,內置了很多實用的函數,同時也提供了豐富的工具模塊。 下面是總結的幾種內置對象及函數的應用技巧。
1、強大的列表解析功能
list1 = [1,2,3,4] list1 = [x*2 for x in list1] #[2,4,6,8]
lines = [line.rstrip() for line in open('filename') if line[0] == 'p']
str1 = 'abc' str2 = 'lmn' [x+y for x in str1 for y in str2] #['al', 'am', 'an', 'bl', 'bm', 'bn', 'cl', 'cm', 'cn']
2、索引和分片
#索引操作 s = 'spam' s[0] # 's' s[-1] # 'm' #分片操作 s[1:3] # 'pa' s[1:] # 'pam' s[:-1] # 'spa' s[:] # 'spam' s[::2] # 'sa' s[1::2] # 'pm' s[::-1] # 'maps' s[-1:0:-1] # 'map'
#索引操作 list1 = ['spam','SPAM','Spam'] list1[0] # 'spam' list1[-1] # 'Spam' #分片操作 list1[1:2] # ['SPAM'] list1[1:] # ['SPAM', 'Spam'] list1[:-1] # ['spam', 'SPAM'] list1[:] # ['spam', 'SPAM', 'Spam'] list1[::2] # ['spam', 'Spam'] list1[1::2] # ['SPAM'] list1[::-1] # ['Spam', 'SPAM', 'spam'] list1[-1:0:-1] # ['Spam', 'SPAM']
3、內置的eval函數可以將字符串轉換成對象
a='123' type(a) #type(eval(a)) #
4、zip函數
>>> l1 = [1,2,3,4] >>> l2 = [5,6,7,8] >>> zip(l1,l2) [(1, 5), (2, 6), (3, 7), (4, 8)]
>>> for (x,y) in zip(l1,l2): ... print x, y, '--', x+y ... 1 5 -- 6 2 6 -- 8 3 7 -- 10 4 8 -- 12
>>> keys = ['a', 'b', 'A', 'B'] >>> values = [96, 97, 65, 66] >>> d = dict(zip(keys, values)) >>> d {'a': 96, 'A': 65, 'B': 66, 'b': 97}
5、工廠函數 工廠函數有時也叫閉合(closure),一個能夠記住嵌套作用域變量值的函數,盡管那個作用域或許已經不存在了。 盡管類是最适合用作記憶狀態的,因为它們通過屬性賦值這個過程變得很明了,像這样的函數也提供了一種替代的解决方法。
>>> def maker(n): ... def action(x): ... return x ** n ... return action ... >>> f=maker(2) >>> type(f)>>> f(3) 9 >>> f(4) 16
6、匿名函數:lambda 除了def語句之外,Python還提供了一種生成函數對象的表達式形式。由於它於LISP語言中的一個工具很相似,所以稱为lambda。就像def一样,這個表達式創建了一個之後能夠調用的函數,但是它返回了一個函數而不是將這個函數賦值给一個變量名。這也就是lambda有時被稱作匿名函數的原因了。
>>> L = [(lambda x: x **2),(lambda x: x**3),(lambda x: x**4)] >>> for f in L: ... print f(2) ... 4 8 16
>>> key = 'got' >>> {'already':(lambda: 2+2),'got':(lambda: 2*4),'one':(lambda: 2**6)}[key]() 8這样一個字典也就變成了一個多路分支的工具了
>>> lower = lambda x,y: x if x < y else y >>> lower('a','b') 'a' >>> lower('b','a') 'a'
>>> import sys >>> showall = lambda x: map(sys.stdout.write,x) >>> t = showall(['spam\n','toast\n','eggs\n']) spam toast eggs >>> L = [1,2,3,4] >>> map((lambda x: x+3),L) [4, 5, 6, 7]
>>> showall = lambda x: [sys.stdout.write(line) for line in x] >>> t = showall(('bright\n','side\n','of\n','life\n')) bright side of life
def func(): x = 4 action = (lambda n: x ** n) return action f = func() print f(2) #16, 4**2
7、生成器
>>> def gensquares(n): ... for i in range(n): ... yield i ** 2 ... >>> type(gensquares(5))>>> for i in gensquares(5): ... print i,',', ... 0 , 1 , 4 , 9 , 16 ,
>>> for x in (x ** 2 for x in range(4)): ... print x, ... 0 1 4 9>>> for x in (x ** 2 for x in range(4)): ... print x, ... 0 1 4 9注意:如果生成器表達式是在其他括號之內的話,就像在那些函數調用之中,生成器自身的括號就不是必須的了。盡管這样,在下面第二個sorted調用中,還是需要額外的括號。
>>> sum(x ** 2 for x in range(4)) 14 >>> sorted(x ** 2 for x in range(4)) [0, 1, 4, 9] >>> sorted((x ** 2 for x in range(4)), reverse=True) [9, 4, 1, 0] >>> import math >>> map(math.sqrt, (x ** 2 for x in range(4))) [0.0, 1.0, 2.0, 3.0]
1、math模塊
>>> import math >>> math.pi 3.1415926535897931 >>> math.e 2.7182818284590451 >>> math.sin(2*math.pi/180) 0.034899496702500969
2、random模塊
>>> import random >>> random.random() 0.40019449172525789 >>> random.random() 0.063811948555701825 >>> random.randint(1,10) 3 >>> random.randint(1,10) 2 >>> random.choice(['a', 'b', 'c']) 'a' >>> random.choice(['a', 'b', 'c']) ‘c'
3、decimal模塊
>>> print 0.1+0.1+0.1-0.3 5.55111512313e-17 >>> from decimal import Decimal >>> Decimal('0.1')+Decimal('0.1')+Decimal('0.1')-Decimal('0.3') Decimal("0.0")
4、re正則表達式 re模塊能夠處理正則表達式的操作
>>> import re >>> ptn1 = re.compile('he')
>>> import re >>> p1 = re.compile('h') >>> str1 = 'hello world' >>> md = p1.match(str1) >>> print md <_sre.SRE_Match object at 0x7f28e95c3238> >>> md.group() 'h' >>> md.start() 0 >>> md.end() 1 >>> md.span() (0, 1) >>> p2 = re.compile('llo') >>> md2 = p2.search(str1) >>> md2.group() 'llo' >>> md2.span() (2, 5) >>> p3 = re.compile('\d+') >>> str2 = '12abc3de45' >>> print p3.findall(str2) ['12', '3', '45'] >>> iterator = p3.finditer(str2) >>> iterator>>> for match in iterator: ... print match.span() ... (0, 2) (5, 6) (8, 10)
5、用pickle存儲Python的原生對象(對象的序列化以及反序列化) pickle模塊是能夠讓我們直接在文件中存儲幾乎任何Python對象的高級工具,也並不要求我們把字符串轉換來轉換去。
# 向文件中存儲數據 >>> data = {'a':97, 'b':98, 'A':65, 'B':66} >>> datafile = open('data.txt','w') >>> import pickle >>> pickle.dump(data,datafile) >>> datafile.close() # 讀取存儲的數據 >>> datafile = open('data.txt') >>> data = pickle.load(datafile) >>> data {'a': 97, 'A': 65, 'B': 66, 'b': 98}
6、文件中打包二進制數據的存儲與解析 struct模塊能夠構造並解析打包的二進制數據。
# 存儲 >>> f = open('data.bin','wb') >>> import struct >>> bytes = struct.pack('>i4sh', 7, 'spam', 8) >>> bytes '\x00\x00\x00\x07spam\x00\x08' >>> f.write(bytes) >>> f.close() # 讀取 >>> f = open('data.bin','rb') >>> data = f.read() >>> data '\x00\x00\x00\x07spam\x00\x08' >>> values = struct.unpack('>i4sh', data) >>> values (7, 'spam', 8)
7、進程模塊工具
os/sys | 包含基本進程管理函數 |
subprocess | Python基本庫中多進程相關模塊 |
signal | Python基本庫中信號相關模塊 |
>>> import os >>> print os.system('ls')
>>> import os >>> os.execl('/usr/bin/kate')
import sys try: filename = sys.argv[1] print filename except: print "Usage:", sys.argv[0], "filename" sys.exit(1)
import subprocess pingP = subprocess.Popen(args='ping -c 4 www.sina.com', shell=True) pingP.wait() print pingP.pid print pingP.returncode注:在Linux下,當shell为"False"時,Popen將調用os.execvp執行對應的程序。而shell为"True"時,如果命令为字符串,Popen直接調用系統shell來執行指定的程序。如果命令为一個序列,則其第一項是定義命令字符串,其他項为命令的附加参數。
import subprocess retcode = subprocess.call(['ls','-l']) #調用ls -l 命令