python核心编程第二版第八章答案

8.1
(a)C语句被执行
(b)D语句被执行
(c)B语句被执行
8.2循环

def jishu():
    f = int(input('please input start number'))
    t = int(input('please input least number'))
    i = int(input('plaese input increment number'))
    j = f
    while j <= (t-i):
        #为了保证j的输出不会大于t,因此限定条件是j <= t-i
        j += i
        print(j)
jishu()

8.3 range()
(a)range(10)
(b)range(3,19,3)
(c)range(-20,870,220)

8.4素数。

def isprime():
    x = int(input('please input a number'))
    y = int(x/2)
    #把输入的数值除以2,舍弃后面的小数点
    while y > 1:
        if x % y == 0:
            print(False)
            break
        else:
            y -= 1
    if y == 1:
        print(True)

isprime()

8.5约数

def getfactors(num):
    a = [num]
    b = num

    c = int(b / 2)
    #从输入数的一半开始计算
    while c >= 1:
        if b % c == 0:
            a.append(c)
        c -= 1
    print(a)

getfactors(50)

8.6结合上面2个函数,来给出任意一个数的素因子。

def isprime(num):
    y = int(num/2)
    #把输入的数值除以2,舍弃后面的小数点
    while y > 1:
        if num % y == 0:
            return False
            break
        else:
            y -= 1
    if y == 1:
        return True


def getfactors(num):
    a = [num]
    b = num
    #从输入数的一半开始计算
    c = int(b / 2)
    while c >= 1:
        if b % c == 0:
            a.append(c)
        c -= 1
**加粗样式**    return a

def suyinzi(num):
    a = isprime(num)
    b = []
    if a ==True:
        #当要处理的数为素数时,返回1和他本身
        print(1,num)
    else:
        c = int(num)
        while c >=2:
            #当被处理的数一直大于2时,一直进行找因数的循环
            for i in range(1,int(c+1)):
                #历遍从1到c的数,添加因数
                if c%i == 0:
                    #如果有数能被整除,并且是素数,那么就在列表中增加这个数
                    if isprime(i):
                        b.append(i)
                        c /= i
        print(b)
suyinzi(63)

8.7完全数

def isperfect(num):
    a = []
    b = num

    c = int(b / 2)
    while c >= 1:
        if b % c == 0:
            a.append(c)
        c -= 1
    if sum(a) == num:
        print('good')
    else:
        print('bed')
isperfect(8)

8.8阶乘,指定N,返回N!。

def jiecheng(num):
    if num == 1:
    #基线条件是num=1时
        return 1
    else:
    #递归条件是num大于1时
        return num*jiecheng(num-1)

print(jiecheng(6))

8.9 斐波那契数列。下一个值是序列中前2个值之和。

def feibo(num1,num2):
    a = [num1,num1]
    for i in range(2,num2):
        #循环从第三个数开始添加到第num2个数
        b=a[i-1]+a[i-2]
        a.append(b)
    print(a[num2-1])
    #第n个数在列表的索引为n-1
    print(a)
feibo(1,10)

8.10文本处理。统计一句话中的元音,辅音以及单词的个数。附加题:编写处理这些特殊情况的代码。
由于我英文有点差,没看懂题意,此题答案转载自https://blog.csdn.net/czd327917086/article/details/6691435

def counteng(string):
    '''8-10 统计一下一句话中元音,辅音,和单词的个数,忽略元音和辅音等特殊情况'''
    # 所谓特殊情况就是某些单词用元音开头,但是不发元音,有些单词辅音开头但是发元音
    # 如果要处理这些特殊单词,那么需要有特殊单词表或者规律,这个我就不做了,不难实现
    # 思路:匹配单词,如果符合特殊规则或者单词表,那么元音[辅音]数量相应减1或者加1
    # 我这里只要处理 a,e,i,o,u的个数即可    
    # 所谓单词数,特别是英文中,比较容易,只要用空格分隔就可
    words = len(string.split())
    string=string.upper()#换成大写,方便一点
    yuans = fus = 0
    # 统计元音数
    for i in string:
        # 只处理那啥字母,不处理特殊符号
        # 大写元音的 ord 是65,69,73,79,85
        # 大写字母即ord 65-90
        n = ord(i)
        if n in xrange(65,91):
            if n in [65,69,73,79,85]:
                yuans+=1
            else:
                fus+=1
    return [yuans,fus,words]

8.11文本处理。

def nameshuru():
    names = []
    e = 0
    while True:
        a = str(input('''please input name,if you want quit input q\n'''))
        b = a.strip()
        #先把名字首尾的空格去掉
        c = b.split(',',1)
        #把名字根据逗号分成2部分
        if c[0] == 'q':
            #如果输入了q,那么退出输入
            break
        else:
            if len(c) == 1:
                #如果c长度为1,那么就是输入了空格,把名字根据空格重新隔开,然后再颠倒相加
                e += 1
                #错误+1
                c = b.split(' ',1)
                d = c[1]+','+c[0]
                names.append(d)
            else:
                d = b
                names.append(d)
    names.sort()
    print(names)

nameshuru()

8.12位操作。

def out():
    '''8-12 输入整数1,整数2,显示一张表格,包括十进制,二进制,八进制,十六进制和ASCII'''
    # ASCII中 0-32 127 这34个是控制符,不用输出
    # 超过127的数字也不用输出,因为没有对应的ASCII
    num1 = int(raw_input('Enter begin value:').strip())
    num2 = int(raw_input('Enter end value:').strip())
    # 这里的dl,bl,ol,hl,al表示每一列的宽度
    dl,bl,ol,hl,al = \
    len(str(num2))+5,len(bin(num2))+3,len(oct(num2))+4,len(hex(num2))+3,5
    # 输出标题,居中
    print 'DEC'.center(dl),'BIN'.center(bl),'OCT'.center(ol),'HEX'.center(hl),'ASCII'.center(al)
    # 输出横线
    print '-'*(sum([dl,bl,ol,hl,al])+5)
    ascii = ''
    for i in xrange(num1,num2+1):
        # Ascii 只有在这个区间内才显示
        if 32<i<127:ascii = chr(i)
        print str(i).center(dl),bin(i)[2:].center(bl),oct(i)[1:].center(ol),hex(i)[2:].center(hl),ascii.center(al)
        ascii=''

此题答案转载自https://blog.csdn.net/czd327917086/article/details/6691435

8.13程序执行性能。再8.5.2节中,我们介绍了2种迭代序列方法:(1)通过序列项(2)通过序列索引遍历。我们指出后一种方法在序列很长的时候性能不佳,你认为他的原因是什么?
因为它可能重复计算了序列的长度for i in range(list),由于每次迭代都要重新计算一次序列长度,所以消耗的时间变多了,而序列项不存在这样的问题。

你可能感兴趣的:(python)