《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

结果竟然是通过索引运行时间更短一些,这个问题后面再研究一下,后续补上相关思考

 

 

 

posted on 2012-08-14 16:53  温柔的暴力  阅读(1197)  评论(0编辑  收藏  举报

导航