python核心编程v2.0 第六章习题答案

答案若有问题,欢迎评论指出

1.string.find 检测 str是否包含在string中;2.3版本过后,in 操作符也可作此用途。

2.

import string
import keyword

# identifier check
def test():

    alphas = string.letters+'_'
    nums = string.digits
    while True:
        myInput = raw_input('test\n')
        # len > 0
        if len(myInput)>1:
            if myInput[0] not in alphas:
                print "invaild"
            else:
                for otherchar in myInput[1:]:
                    if otherchar not in alphas+nums:
                        print "invaild"
                        break
                else:
                    print "ok"
         #len = 0
        elif len(myInput) == 1:
            if myInput[0] not in alphas:
                print "invaild"
        # check if it's a keyword
        if myInput in keyword.kwlist:
            print "it's a keyword"

if __name__ == '__main__':
    #python key word
    print keyword.kwlist
    test()

3.
1).

num = 7
i = 0
list = []

while i<num :
    number = int(raw_input('input a number\n'))
    list.append(number)
    i = i+1
print list

list.sort(reverse=True)
print list

2)字典序:字符串排序使用

number = raw_input('input a number\n')

4.

#coding=utf-8
from __future__ import division #floor除法

def grade(number1) :
    grd = ''
    if 90<=number1<=100 :
        grd = 'A'
    elif 80<=number1<=89 :
        grd = 'B'
    elif 70<=number1<=79 :
        grd = 'C'
    elif 60<=number1<=69 :
        grd = 'D'
    elif number1<=60 :
        grd = 'F'
    else:
        print "not vaild"
    return grd

if __name__ == '__main__' :
    num = 3
    sum = 0
    j = 0
    list = []
    while j<num:
        gra = int(raw_input('input a number') )
        print grade(gra)
        list.append(gra)
        j = j+1
    print list
    i = 0
    while i < len(list):
        sum = sum + list[i]
        i = i + 1
    print sum / len(list)

5.
1)

print "input a string"
x = raw_input()

i = 0
print x[-1],x[i+1]

i = 1
while i<len(x)-1:
    print x[i-1],x[i+1]
    i = i+1

print x[i-1],x[0]

结果

input a string
tobe
e o
t b
o e
b t

2)

while True:
    string1 = raw_input('1\n')
    string2 = raw_input('2')
    s1 = string1.upper()
    s2 = string2.upper()
    for i,j in zip(s1,s2):
        if i is not j:
            print 'wrong'
            break
    else:
        print 'same'

附加:直接zip(string1,string2)即可
3)

while True:
    string = raw_input('input a string')

    if cmp(string,string[::-1]) == 0 :
        print  'a palindrome'
    else:
        print 'not palindrome'

附加:支持字符串中出现空格

string = string.replace(' ','')

4)

string = raw_input('input a string')
string = string + string[::-1]
print string

6.

def strip2 (string):
    #删除字符串开头的空格
    i = 0
    while i< len(string):
        if string[i] == ' ':
            string = string [i+1:]
            i = i + 1
        else:
            break
    #删除字符串结尾的空格,由于空格不好显示,这个地方用$代替
    i = -1
    while i>-len(string)-1:
        if string[i] == '$':
            string = string[:i]
        else:
            break
    return string



if __name__ == '__main__':
    while True:
        string = raw_input('input a string\n')
        print strip2(string)

7.源代码在输入一个数后,列出一个list,中间是不能整除该数的数。
错误在del删除后,i实际已经指向下一个数了。源程序输入偶数是不会死机的,只是结果应该不是本来想要的结果。

# recipt user input
num_str = raw_input('enter a number:\n')
num_num = int(num_str)

#creat list
fac_list = range(1,num_num+1)
print 'before:',fac_list

#find the divisor and delete
i = 0
while i<len(fac_list):
    if num_num%fac_list[i] == 0:
        del fac_list[i]
    else:
        i = i+1

print 'after:',fac_list

8.附加题,原题只需按位读取判断即可,只处理了比较麻烦的0,1,2

def deal(list):
    i = 0
    list2 = []
    while i<len(list):
        #index1
        if i == 0:
            if list[i] == '0':
                list2.append('zero')
            elif list[i] == '1':
                list2.append('one')
            elif list[i] == '2':
                list2.append('two')
         #index2
        elif i == 1:
            if list[i] == '0':
                list2.append('and')

            elif list[i] == '1':
                if list[i-1] == '0':
                    list2[i-1] = 'ten'


                if list[i-1] == '1':
                    list2[i-1] = 'elevent'


                if list[i-1] == '2':
                    list2[i-1] = 'twelve'


            elif list[i] == '2':
                list2.append('tweenty')
        #index3
        elif i == 2 :
            if list[i] == '0':
                list2.append('and')
            elif list[i] == '1':
                list2.append('one hundred ')
            elif list[i] == '2':
                list2.append('two hundred ')
        #index4
        elif i == 3 :
            if list[i] == '1':
                list2.append('one thousand ')
            elif list[i] == '2':
                list2.append('two thousand ')
        i = i+1

    list2.reverse()
    return list2

#just deal 0,1,2
if __name__ == '__main__':
    while True:
        list1 = list(raw_input('input a number'))
        list1.reverse()
        list2 = deal(list1)
        print '-'.join(list2)

结果

input a number121
one hundred -tweenty-one
input a number110
one hundred -ten
input a number102
one hundred -and-two
input a number222
two hundred -tweenty-two

9.

while True:
    time = int(raw_input('input minite :\n'))

    h = time/60
    t = time%60
    print 'time is %d hour %d minite' %(h,t)

10.

while True:
    string = raw_input('input a string:\n')
    string = string.swapcase()
    print string

11.
1)

index = 123232423434
index = str(index)
list = []
list.append(index[0:3])
list.append(index[3:6])
list.append(index[6:9])
list.append(index[9:12])
string = '.'.join(list)
print string

2)

string = '123.231.224.232'
string = string.replace('.','')
string = int(string)
print string

12.
1)

def findchr(string ,char):
    i = 0
    while i < len(string):
        if string[i] == char:
            return i
            break
        i = i + 1
    else:
        return -1

if __name__ == '__main__':
    string = 'asd'
    char = 'c'
    index = findchr(string,char)
    print index

2)

def rfindchr(string,char):
    i = -1
    while i>-len(string)-1:
        if string[i] == char:
            return i
            break
        i = i - 1
    else:
        return 1


if __name__ == '__main__':
    string = 'asd'
    char = 'x'
    index = rfindchr(string,char)
    print index

3)

def subchr(string,origchar,newchar):
    i = 0
    while i < len(string):
        if string[i] == origchar:
            #string类型不能直接对元素赋值
            string = string[:i]+newchar+string[i+1:]
        i = i + 1
    return string
if __name__ == '__main__':
    string = 'asdsadwaffefas'
    char = 's'
    newchar = 'x'
    string = subchr(string,char,newchar)
    print string

13.
只处理了简单的浮点数,指数型浮点数未处理

def atoc(string):
    i = 0
    while i<len(string):
        if string[i] == '+' or string[i] == '-':
            real = float(string[:i])
            image = float(string [i+1:len(string)-1])
        i = i+1
    return complex(real=real,imag=image)


if __name__ == '__main__':
    string = '23.2+2.5J'
    print atoc(string)

14.

import random

def Rochambeau(t,list2,list3):
    if t in list2:
        return 'user win'
    elif t in list3:
        return  'squaring'
    else:
        return 'computer win'


if __name__ == '__main__':
    while True:
        list = ['s','j','b']
        user = raw_input('select from s,j,b')
        computer = random.choice(list)
        print 'computer choose %s' % computer
        t = (user,computer)
        #预存胜利与平局情况,避免多次用if比较
        list2 = [('s','j'),('j','b'),('b','s')]
        list3 = [('s','s'),('j','j'),('b','b')]
        print Rochambeau(t,list2,list3)


15.
1)
未考虑闰年

day1 = '16/10/20'
day2 = '16/9/20'

list1 = day1.split('/')
list2 = day2.split('/')

for i in range(len(list1)):
    list1[i] = int(list1[i])

for i in range(len(list2)):
    list2[i] = int(list2[i])

daylist=[31,28,31,30,31,30,31,31,30,31,30,31]
#year = 365,day1>day2
if list1[0]>list2[0]:
    y = (list1[0]-list2[0]-1)*365
    m= 0
    for i in range(1,list1[1]):
        m  = m +daylist[i]
    sum1 = m+ list1[2]
    m2 = 0
    for j in range(1,list2[1]):
        m2 = m2 +daylist[j]
    sum2 = m2 +list2[2]
    sum = y +sum1 +365-sum2

elif list1[0]==list2[0]:
    m = 0
    for i in range(1, list1[1]):
        m = m + daylist[i]
    sum1 = m + list1[2]
    m2 = 0
    for j in range(1, list2[1]):
        m2 = m2 + daylist[j]
    sum2 = m2 + list2[2]
    sum = sum1 - sum2

print sum

可以参考
http://www.cnblogs.com/hello–the-world/archive/2012/07/27/2612180.html
两个日期对另一日期求差的天数,再对两个差求差。且考虑了闰年,只需中间的闰月及结束那年的闰月情况。对结束那年的闰月情况考虑不周全

2)

# -*- coding: utf-8 -*-
import time

daylist=[31,28,31,30,31,30,31,31,30,31,30,31]
year =  time.localtime().tm_year
mouth = time .localtime().tm_mon
day = time.localtime().tm_mday

birth = '2000/1/1'
list = birth.split('/')
for i in range(len(list)):
    list[i] = int (list[i])

y = (year-list[0]-1)*365
#leap year
for j in (list[0],year):
    if (j %4==0 and j%100!=0) or j%400==0:
         y = y +1

#出生那年是闰年,但是生在2月以后,这一年的应该不算
if (list[0] %4==0 and list[0]%100!=0) or list[0]%400==0:
    if list[1] > 2  :
        y = y -1

#2017年非闰年,不需要考虑结束这年的闰月情况,否则也应作处理

m= 0
for i in range(1,mouth):
    m  = m +daylist[i]
sum1 = m+ day

m2 = 0
for j in range(1,list[1]):
    m2 = m2 +daylist[j]
sum2 = m2 +list[2]

sum = y +sum1 +365-sum2

print sum

3)

# -*- coding: utf-8 -*-
import time

daylist=[31,28,31,30,31,30,31,31,30,31,30,31]

birth = '1994/9/23'
list1 = birth.split('/')
for i in range(len(list1)):
    list1[i] = int (list1[i])


list2 = []
list2.append(time.localtime().tm_year)
list2.append(time .localtime().tm_mon)
list2.append(time.localtime().tm_mday)


# list1>list2,返回两个年份间差的天数,考虑了闰年情况,补全了上题未考虑完整部分

def compare(list1, list2):
    y = 0
    sum = 0
    if list1[0] > list2[0]:
        # 下一年是闰年,且度过了2月
        if leapyear(list1[0]):
            if list1[1] > 2:
                y = y + 1
        # 今年是闰年,且没过2月
        if leapyear(list2[0]):
            if list2[1] <= 2:
                y = y + 1
        m = 0
        for i in range(1, list1[1]):
            m = m + daylist[i]
        sum1 = m + list1[2]

        m2 = 0
        for j in range(1, list2[1]):
            m2 = m2 + daylist[j]
        sum2 = m2 + list2[2]

        sum = y + sum1 + 365 - sum2
        return sum
    if list1[0] == list2[0]:
        m = 0
        for i in range(1, list1[1]):
            m = m + daylist[i]
        sum1 = m + list1[2]
        m2 = 0
        for j in range(1, list2[1]):
            m2 = m2 + daylist[j]
        sum2 = m2 + list2[2]
        sum = sum1 - sum2
        # 今年是闰年
        if leapyear(list1[0]) and list2[1] <= 2:
            sum = sum + 1
        return sum

#判断闰年
def leapyear(year):
    if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0:
        return True
    else:
        return False

#生日在9月,现在已经>9月了
if list2[1]>list1[1]:
    list1[0] = list2[0]+1
    print compare(list1,list2)
#现在是9月
elif list2[1]==list1[1]:
    #现在过了23日了,得等明年生日
    if list2[2]>=list1[2]:
        list1[0] = list2[0]+1
        print compare(list1,list2)
    #还未过今年生日
    else:
        list1[0]=list2[0]
        print compare(list1,list2)
#未到该月,可以过今年的生日
else:
    list1[0]=list2[0]
    print compare(list1,list2)



16.
引入numpy包,扩充矩阵处理
https://sourceforge.net/projects/numpy/files/NumPy/1.9.2/

from numpy import *

N = mat([1,2,3])
M = mat([4,5,6])

print N+M
print N*M.T

17.

def mypop(list):
    list = list[:-1]
    return list

if __name__ == '__main__':
    list = [1,2,3,4,5]
    print mypop(list)

18.

list1 = [1,2,3]
list2 = [4,5,6]
print zip(list1,list2)

结果返回配对元素的元组的list

[(1, 4), (2, 5), (3, 6)]

19.
处理行和列最后剩下的数的打印的时候函数不一样。

def makehang(number,x):
    sum = len(number)

    y = sum/x
    # print x,y
    de = sum - x*y
    # print de

    for i in range(x):
        for j in range(y):
            print number[j+i*y],
            print ' ',
        if i < x-1:
            print '\n'
        #如果是最后一行了,则打印剩下的数
        else:
            k = 1
            while k <= de:
                print number[j + i * y + k]
                k = k + 1

def makelie(number,y):
    sum = len(number)
    x = sum/y
    de = sum - x*y
    # print de

    for i in range(x):
        for j in range(y):
            print number[j+i*y],
            print ' ',
        print '\n'

    #打印剩余的数
    k = 1
    while k <= de :
        for z in range(y):
            print ' ',
        print number[j+i*y+k]
        k = k+1

if __name__ == '__main__':

    index = raw_input('c or s\n')
    number = list(raw_input('input number :\n'))
    print number

    #需要按行输出
    if  index == 'c':
        x = int(raw_input('hang:\n'))
        makehang(number,x)
    #按列输出
    else:
        y = int(raw_input('lie:\n'))
        makelie(number,y)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值