Python核心编程第六章课后练习答案

本文提供了一系列Python编程练习,包括字符串处理、排序、数字转换等任务,旨在帮助读者提高Python编程技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2. 字符串标示符, 修改6-1的idcheck.py脚本,使之可以检测长度为一的标示符,并且可以识别python关键字, 对后一个要求,你可以用keyword模块(特别是keyword.kwlist)来辅助

源代码:

'This is a module of idcheck for keyword'


import keyword
import string


kw = keyword.kwlist
num = string.digits
letters = string.letters
alpha = letters + '_'
alphalist = alpha + num


myInput = raw_input('请输入标识符:')


if len(myInput) == 1:               #首先判断输入是否是长度为1的字符串
    if (myInput[0] not in alpha):
        print 'invalid:first char must be letter or _'
    else:
        print 'this is a id len 1'


if len(myInput) > 1:                #当输入字符串长度大于1时
    if myInput[0] not in alpha:     #判断首字母是否是满足要求
        print 'invalid:first char must be letter or _'
    
    else:               
        
        if myInput in kw:           #判断是否是关键字
            print 'invalid:this is keyword'
        else:                       #判断之后的字符是否满足要求
            for otherchar in myInput[1:]:
                if otherchar not in alphalist:
                    print 'invalid:input must be in alphalist'
                    break
            else:       #else一定要是和for循环处于同一级别,是要在循环结束之后判断是否是合法字符
                print'id is identifier'
                

3. 排序

  (a) 输入一串数字,并从大到小排列之.

  (b)跟a一样,不过要用字典顺序从大到小排列 


源代码:

'This is a module for paixu'


string = raw_input("input num(end with '!')").split()       #加入split()函数是为了去除空格




#以自然数的形式从大到小输出


List = []
for each in string:
    List.append(int(each))
test = sorted(List)[::-1]           #从小到大输出
print test


#以字典的形式(按字典中每个元素的首字母)从大到小输出


Dict = []
for each in string:
    Dict.append(each)


test2 = sorted(Dict)[::-1]          #从小到大输出
print test2


5. 字符串

  (a)更新你在练习2-7里面的方案, 使之可以每次向前向后都显示一个字符串的一个字符.

  (b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符cmp()內建函数). 附加题: 在你的方案中加入大小写区分.

  (c)判断一个字符串是否重现(后面跟前面一致), 附加题: 在处理了严格的回文之外,加入对例如控制符号和空格的支持.

  (d) 接受一个字符在其后面加一个反向拷贝,构成一个回文字符串.

源代码:

(b):

#coding:utf-8
str1 = raw_input("Enter a string1 -->")
str2 = raw_input("Enter a string2 -->")


if len(str1) != len(str2):
    print'str1 not match str2'
else:
    for char in range(0,len(str1)):
        if str1[char] != str2[char]:
            print 'str1 not match str2'
            break
    else:
        print'str1 match str2'


6. 字符串, 创建一个string.strip()的替代函数: 接受一个字符串,去掉它前面和后面的空格(如果使用string.*strip()函数那本练习就没有意义了)

源代码:

#coding=utf-8


'此函数可用来取代string.strip()函数'




string = raw_input('Enter the string:')


first, last = 0, 0


if string[0] == ' ' and string[len(string) - 1] == ' ':     #前后都有空格
    print 'first and last all owm space'
    for char in string:             #判断第一个字符是否是空格以及空格的个数
        if char == ' ':
            first += 1
        else:
            #print string[first:]
            break
    for char in string[::-1]:       #判断最后一个字符是否是空格以及空格的个数
            if char == ' ':
                last += 1
            else:
                print string[first:len(string) - last]
                print last
                break
            
elif string[0] == ' ':              #前面有空格后面没空格
    print 'least  first one space'
    for char in string:
        if char == ' ':
            first += 1
        else:
            print string[first:]
            break
    
elif string[len(string) - 1] == ' ':        #后面有空格前面没空格
    print 'least last one space'
    for char in string[::-1]:
            if char == ' ':
                last += 1
            else:
                print string[:len(string)-last]
                print last
                break
else:                                   #前后都没有空格
    print 'no space'
    print string

8. 列表, 给出一个整型值,返回代表该值的英文, 比如输入89返回"eight-nine". 附件题: 能够返回符合英文语法规则的形式, 比如输入"89" 返回"eighty-nine". 本练习中的值限定在0~1000.

源代码:

#coding=utf-8
units = [
'zero','one','two','three','four','five','six','seven','eight','nine','ten',
'eleven','twelve','thirteen','forteen','fifteen','sixteen','seventeen',
'eighteen','nineteen'
]
tens = ['twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety']
hundreds = ['hundreds']




while True:
    myInput = raw_input("Enter the num -->(input 'quit' to quit):")       #字符串输入
    if myInput == 'quit':
        break
    myInput_num = int(myInput)                      #将字符串输入转整型
    Input_num = []                                  #列表


 
    for i in myInput:                   #将输入的字符串转化为列表
        Input_num.append(int(i))


    if myInput_num < 20:                  #20以下的英文输出
        print units[myInput_num]




    elif myInput_num < 100:             #100以下的输出
        if Input_num[1] == 0:
            print tens[Input_num[0] - 2]
        else:
            print (tens[Input_num[0] - 2] + '-' + units[Input_num[1]])
        


    elif myInput_num < 1000:
        if (Input_num[2] == 0 and Input_num[1] == 0):     #第二、三位等于0(注:此语句需要放在最前,如果后两句先执行的话,会包含这种情况,最后一位会输出zero)
            print units[Input_num[0]] + ' ' + 'hundreds'
        elif Input_num[1] == 0:       #第二位等于0
            print units[Input_num[0]] + ' ' + 'hundreds' + ' '+ 'and' + ' ' + units[Input_num[2]]
        elif Input_num[2] == 0:     #第三位等于0
            print units[Input_num[0]] + ' ' + 'hundreds' + ' '+ 'and' + ' ' + tens[Input_num[1] - 2] 
        else:                       #每一位都不等于0
            print units[Input_num[0]] + ' ' + 'hundreds' + ' '+ 'and' + ' ' + tens[Input_num[1] - 2] + '-' + units[Input_num[2]]
         


9. 转换, 为练习5-13 写一个姊妹函数,接受分钟数,返回小时数和分钟数.总时间不变,并且要求小时数尽可能大.
        
源代码:

#coding=utf-8
'this is a module of translate minute to hour and minute'


while True:
    temp = raw_input("Enter the minute(input 'quit' to quit):")


    if temp == 'quit':
        break
    
    time = int(temp)
    hour = time // 60
    minute = time % 60
    if minute == 0:
        print 'After trans -->: %d hour' % hour
    else:
        print 'After trans -->: %d hour %d minute' % (hour, minute)


10. 字符串, 写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转.比如,输入"Mr.Ed", 应该返回"mR.eD"作为输出.

源代码:

#coding=utf-8


"this is a module of change 'A' to 'a' or change 'a' to 'A'"


string = raw_input('Input the string you want to change:')
print string.swapcase()             #大小写转化函数

11. 转换.

  (a) 创建一个从整形到IP地址的转换程序, 如下格式: WWW.XXX.YYY.ZZZ

  (b) 更新你的程序, 使之可以逆转换.


源代码:

#coding=utf-8


"""this is a module of tranfer 'int' to ip address"""


def int_transfer():         #将ip地址转化为整型
    """
    raw_input 返回类型是str,而split()函数是可以将字符串通过
    指定分隔符和次数将对象分割为列表的函数,所以返回类型是列表


    """
    int_num = raw_input("input 12 nums with space split:").split()
    


    """
    join()函数是可以将字符串、元组、列表中的元素以指定的分隔符连接生成
    一个新的字符串,返回类型是字符串
    """
    ip_address = '.'.join(int_num)
    print ip_address


def ip_transfer():          #将整型数据转化为ip地址


    ip_address = raw_input("input ip address:").split('.')


    int_num = ' '.join(ip_address)


    print int_num


if __name__ == '__main__':
    int_transfer()
    ip_transfer()


12. 字符串.

  (a)创建一个名为findchr()的函数,函数声明如下.

    def findchr(string,char)

    findchr()要在字符串string中查找字符char,找到就返回该值的索引,否则返回-1.不能用string.*find()或者string.*index函数和方法

  (b) 创建另一个叫rfindchr()的函数,查找字符char最后一次出现的位置.它跟findchr()工作类似,不过它是从字符串的最后开始向前查找的.

  (c) 创建第三个函数,名字叫subchr(),声明如下.

    def subchr(string,origchar,newchar)

    subchr()跟findchr()类似,不同的是如果找到匹配的字符就用新的字符替换原先的字符.返回修改后的字符串.

源代码:

#coding=utf-8
"this is a Module of replace find()"


def findchar(string, char):                 #顺序查找字符串
    #设置循环从0到两组字符串长度之差
    for i in range(0,(len(string) - len(char) + 1)):
        #判断切片后的string内容是否与char相同,相同返回索引值
        if string[i:(i + len(char))] == char :   
            return i
    #for循环结束之后,所有的字符都遍历之后没有找到返回-1
    else:
        return -1
        
def rfindchar(string, char):                #逆序查找字符串


    #当findchar()函数不等于-1有结果返回时,在此基础上加上char的长度即最后一次出现的位置
    if findchar(string, char) != -1:            
        return findchar(string, char) + len(char) - 1
    #当findchar()函数等于-1没有结果返回时,输出-1
    else:
        return -1


def subchar(string, char, newchar):         #替换查找的字符串
    if findchar(string, char) != -1:
        return string.replace(char,newchar)
        




    
if __name__ == '__main__':                  #主函数
    string = raw_input('input the string:')
    char = raw_input('input the char you want find:')
    print '顺序查找的结果为:'
    print findchar(string, char)
    
    print '逆序查找的结果为:'
    print rfindchar(string, char)


    newchar = raw_input('input the new char:')
    print subchar(string, char, newchar)

14.随机数。设计一个“石头、剪刀、布”游戏。在计算机中,用户输入选项,计算机产生一个随机选项,然后用程序决定最后的结果,尽量少用if语句

源代码:

#coding=utf-8


import random
"this is a finger-guessing game"


guess ='''a:Stone
b:Scissor
c:Paper
'''
result = [['a','b'],['b','c'],['c','a']]


while True:
    print guess,
    your_Choice = raw_input('Enter your choice(input "quit" to quit):\n')
    print 'your choice is:%s' % your_Choice
    if your_Choice == 'quit':
        break
    if your_Choice != 'a' and your_Choice != 'b' and your_Choice != 'c':
        print 'only can choose a or b or c!(只能选择a, b, c)'
        print
        continue
    temp = ['a','b','c']
    Computer_choice = random.choice(temp)
    print 'Computer choice is: %s' % Computer_choice
    if Computer_choice == your_Choice:
        print 'draw'
    elif [Computer_choice,your_Choice] in result:
        print 'computer wins !'
        print
    else:
        print 'You wins !'
        print


15.给出两个可识别的日期,比如MM/DD/YY或者DD/MM/YY格式,计算两个日期之间的天数

源代码:

#coding=utf-8


"This is a module of using function to count time"


import datetime
import math


def string_transfer_time(string):       #将字符串转化为指定的时间格式


    #strptime(string,'指定格式')函数可以将字符串转化为指定的时间格式,
    #但是需要在datetime.datetime类型下,同时返回的是datetime.datetime类型
    #实际输出看到的效果与字符串相同


    date_time = datetime.datetime.strptime(string, '%Y-%m-%d').date()


    #datetime.datetime.strptime()返回的是时间加日期的格式,所以在后面需要加上
    #日常函数的限制,另外,中间必须要是datetime ,否则其他类型中没有strptime
    #这个类型
    return date_time


def count_days(date_time1,date_time2):      #计算两个日期之间的天数
    delta = abs(date_time1 - date_time2)    #利用abs计算绝对值
    return delta.days               #delta.days可以用来计算两个日期之间的差值


if __name__ == '__main__':
    date_time1 = raw_input('请输入格式为YY-MM-DD格式的日期:')
    date_time2 = raw_input('请输入格式为YY-MM-DD格式的日期:')
    temp1 = string_transfer_time(date_time1)
    temp2 = string_transfer_time(date_time2)
    result = count_days(temp1,temp2)
    print result
    





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值