《Python核心编程》第二版第八章练习题答案 第三部分
第八章的习题在这一部分结束
8–12. (整数)位操作. 编写一个程序, 用户给出起始和结束数字后给出一个下面这样的表格,
分别显示出两个数字间所有整数的十进制, 二进制, 八进制和十六进制表示. 如果字符是可打印的
ASCII 字符, 也要把它打印出来, 如果没有一个是可打印字符, 就省略掉 ASCII 那一栏的表头.
解答:
#!/usr/bin/python
# -*- coding:utf-8 -*-
#Filename:8_12.py
'''
Created on 2012-8-14
@author: wanglei
'''
def output(rangelist):
print " DEC BIN OCT HEX"
print "-------------------------"
for i in rangelist:
print "%3s %3s %3s %3s" %(i,bin(i)[2:],oct(i)[1:],hex(i)[2:])
def outputwithascii(rangelist):
print " DEC BIN OCT HEX ASCII"
print "-----------------------------------"
for i in rangelist:
print "%3s %3s %3s %3s %3s" %(i,bin(i)[2:],oct(i)[1:],hex(i)[2:],chr(i))
def run():
rangelist=[]
beg=input("请输入起始数据: ")
end=input('请输入结束数据: ')
if beg<0 or end<0: #输入的数字不能为负数
print "输入的数不能为负数!"
sys.exit()
if beg<end:
rangelist=range(beg,end+1)
elif beg>end: #若起始值小于终止值,则进行逆序处理,注意,此处end值要-1
rangelist=range(beg,end-1,-1)
else:
print "两次输入的数相同,请重新输入!"
sys.exit()
if beg in range(33,127) or end in range(33,127):
outputwithascii(rangelist)
else:
output(rangelist)
run()
测试数据:
请输入起始数据: 9
请输入结束数据: 18
DEC BIN OCT HEX
-------------------------
9 1001 11 9
10 1010 12 a
11 1011 13 b
12 1100 14 c
13 1101 15 d
14 1110 16 e
15 1111 17 f
16 10000 20 10
17 10001 21 11
18 10010 22 12
请输入起始数据: 98
请输入结束数据: 123
DEC BIN OCT HEX ASCII
-----------------------------------
98 1100010 142 62 b
99 1100011 143 63 c
100 1100100 144 64 d
101 1100101 145 65 e
102 1100110 146 66 f
103 1100111 147 67 g
104 1101000 150 68 h
105 1101001 151 69 i
106 1101010 152 6a j
107 1101011 153 6b k
108 1101100 154 6c l
109 1101101 155 6d m
110 1101110 156 6e n
111 1101111 157 6f o
112 1110000 160 70 p
113 1110001 161 71 q
114 1110010 162 72 r
115 1110011 163 73 s
116 1110100 164 74 t
117 1110101 165 75 u
118 1110110 166 76 v
119 1110111 167 77 w
120 1111000 170 78 x
121 1111001 171 79 y
122 1111010 172 7a z
123 1111011 173 7b {
写了两个函数,一个输出不带ascii码表的结果,一个输出带ascii码表的结果,程序对用户输入的值进行判断,落在可打印的字符范围则
调用outputwithascii()进行输出,否则调用output()输出
8–13. 程序执行性能. 在 8.5.2 节里, 我们介绍了两种基本的迭代序列方法: (1) 通过序列
项, 以及 (2) 通过序列索引遍历. 该小节的末尾我们指出后一种方法在序列很长的时候性能不佳.
(在我的系统下, 性能差了将近两倍[83%]) 你认为它的原因是什么?
为了验证直接迭代序列要比索引迭代快,我写了一小段代码来测试:
#!/usr/bin/python
# -*- coding:utf-8 -*-
#Filename:8_13.py
'''
Created on 2012-8-14
@author: wanglei
'''
import time
def compare():
strtime=time.clock()
alist=range(1000000)
for i in range(len(alist)):
print alist[i],
#for i in alist:
# print i,
endtime=time.clock()
print "运行时间: ",(endtime-strtime)
compare()
输出结果:
运行时间: 27.7364464237
运行时间: 35.151471639
结果竟然是通过索引运行时间更短一些,这个问题后面再研究一下,后续补上相关思考