def progress(width, percent): print "%s %d%%\r" % (('%%-%ds' % width) % (width * percent / 100 * "="), percent), if percent >= 100: print sys.stdout.flush()
首先,先說明一下print的一些用法:
和C語言一樣,字符串里的匹配使用‘%’和相關的轉移類型組成的:
轉換類型 含義
d,i 帶符號的十進制整數
o 不帶符號的八進制
u 不帶符號的十進制
x 不帶符號的十六進制(小寫)
X 不帶符號的十六進制(大寫)
e 科學計數法表示的浮點數(小寫)
E 科學計數法表示的浮點數(大寫)
f,F 十進制浮點數
g 如果指數大於-4或者小於精度值則和e相同,其他情況和f相同
G 如果指數大於-4或者小於精度值則和E相同,其他情況和F相同
C 單字符(接受整數或者單字符字符串)
r 字符串(使用repr轉換任意python對象)
s 字符串(使用str轉換任意python對象)
>>> pi = 3.141592653 >>> print('%10.3f' % pi) #字段寬10,精度3 3.142 >>> print("pi = %.*f" % (3,pi)) #用*從后面的元組中讀取字段寬度或精度 pi = 3.142 >>> print('%010.3f' % pi) #用0填充空白 000003.142 >>> print('%-10.3f' % pi) #左對齊 3.142 >>> print('%+f' % pi) #顯示正負號 +3.141593
%-NType:
這樣表示顯示字符串預留的長度. 例如
print('%-10.3f' % pi)
表示顯示pi保留小數點以后3位,字符串的寬度為10.
好,現在我回到開頭的函數,並做一些說明:
現在假設width = 100, percent = 2.
可以看出,這里的字符串是嵌套的,我們首先對第一個表達式進行解析,那么
('%%-%ds' % width)
的內容是: str1 = '%-100s',這個字符串嵌套了后一個字符串的內容,也就是
(width * percent / 100 * "=")
根據python的字符串可以相乘的原理,我們得到這個字符串其實就是str2 = 100*2/100*"=",也就是兩個等號‘==’。
由於str2是嵌入在str1中的,那么我們繼續對此進行解析,這里是str1的意思就是顯示str2, 並使得字符串的寬度為100. 不足的用空格填充。
所以我們得到"== " , 2%
所以當percent變化時,程序就打印用等號表示的進度條。