避免「懸掛 else」
映射對象(好比字典)的一個最大好處就是它的搜索操做比相似 if-elif-else
語句或是 for 循環這樣的序列查詢要快不少.
if ...:
....
elif ...:
....
.
.
.
.
else:
...
能夠用這個替代:
if <> in ():
....
else:
....
還能夠用字典代替:
msgs = {'create': 'create item',
'delete': 'delete item',
'update': 'update item'}
default = 'invalid choice... try again!'
action = msgs.get(user.cmd, default)
條件表達式(即"三元操做符"):X if C else Y
example:
x, y = 4, 3
x if x
直接迭代序列要比經過索引迭代快,因此從性能上考慮要直接迭代序列。
enumerate() 函數:enumerate 函數用於遍歷序列中的元素以及它們的下標:
>>> nameList = ['Donn', 'Shirley', 'Ben','Janice','David', 'Yen', 'Wendy']
>>> for i, eachLee in enumerate(nameList):
print '%d %s Lee'%(i+1,eachLee)
=== range() 的完整語法===
range(start, end, step =1)
range() 會返回一個包含全部 k 的列表, 這裏 start <= k < end , 從 start 到end , k 每
次
遞增 step . step 不能夠爲零,不然將發生錯誤.
>>> range(2, 19, 3)
[2, 5, 8, 11, 14, 17]
若是隻給定兩個參數,而省略 step, step 就使用默認值 1 .
>>> range(3, 7)
[3, 4, 5, 6]
===xrange() 內建函數===
xrange() 相似 range() , 不過當你有一個很大的範圍列表時, xrange() 可能更爲適合,由於
它不會在內存裏建立列表的完整拷貝.
與序列相關的內建函數
sorted()
reversed(),
enumerate(),
zip()
放棄循環的 break 語句, 和當即開始下一次迭代的 continue 語句.
當遇到continue 語句時, 程
序會終止當前循環,並忽略剩餘的語句, 而後回到循環的頂端. 在開始下一次迭代前,若是是條件循
環, 咱們將驗證條件表達式.若是是迭代循環,咱們將驗證是否還有元素能夠迭代. 只有在驗證成功
的狀況下, 咱們纔會開始下一次迭代.
淺談else語句:
if-else 語句,最經常使用的
for-else 語句。
while-else語句
在循環中使用時, else子句只在循環完成後執行, 也就是說 break 語句也會跳過 else 塊.
for 循環也能夠有 else 用於循環後處理(post-processing). 它和 while 循環中的
else 處理方式相同. 只要for 循環是正常結束的(不是經過 break ), else 子句就會執行
例子:
def showMaxFactor(num):
count=num/2
while count>1:
if num%count==0:
print 'thelargest factor of %d is %d'%(num,count)
break
count=count-1
else:
print num,'is prime'
for eachNum in range(10,21):
showMaxFactor(eachNum)
迭代器和 iter() 函數
reversed() 內建函數將返回一個反序訪問的迭代器. enumerate() 內建函數一樣也返回迭代器.
另外兩個新的內建函數, any() 和 all()
可迭代的有,序列,字典(鍵值),文件
map() 對全部的列表成員應用一個操做, filter() 基於一個條件表達式過
濾列表成員. 最後, lambda 容許你快速地建立只有一行的函數對象
列表解析語法:
[expr for iter_var in iterable]
這個語句的核心是 for 循環, 它迭代 iterable 對象的全部條目. 前邊的 expr 應用於序列
的每一個成員, 最後的結果值是該表達式產生的列表. 迭代變量並不須要是表達式的一部分.
例子:
[x**2 for x in range(6) ]
[expr for iter_var in iterable if cond_expr]
>>>map(lambda x: x ** 2, range(6))
[0, 1, 4, 9, 16, 25]
===矩陣樣例===
你須要迭代一個有三行五列的矩陣麼?
[(x+1,y+1)for x in range(3) for y in range(5)]
===磁盤文件樣例===
f=open('hhga.txt','r')
len([word for line in f for word in line.split()])
快速地計算文件大小
import os
>>> os.stat('hhga.txt').st_size
499L
stat模塊描述了os.stat(filename)返回的文件屬性列表中各值的意義.咱們可方便地根據stat模塊存取os.stat()中的值.
os.stat(path)執行一個stat()系統調用在給定的path上,返回一個類元組對象(stat_result對象,包含10個元素),屬性與stat結構成員相
關:st_mode(權限模式),st_ino(inodenumber),st_dev(device),st_nlink(number of hardlinks),st_uid(全部用戶的user id),st_gid(全部用戶
的groupid),st_size(文件大小,以位爲單位),st_atime(最近訪問的時間),st_mtime(最近修改的時間),st_ctime(建立的時間)
列表解析:
[expr for iter_var in iterable if cond_expr]
生成器表達式:
(expr for iter_var in iterable if cond_expr)
列表解析會返回一個列表,而生成器表達式只不返回列表更節約空間和內存。
列表:sum(【len(word) for line in data for word inline.split()】)
生成器表達式:sum(len(word) for line in data for word inline.split())
咱們經過一個尋找文件最長的行的例子來看看如何改進代碼:
最優代碼。
return max(len(x.strip()) for x in open('/etc/motd'))