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变化时,程序就打印用等号表示的进度条。