Python核心编程第二版 第六章课后练习

注:我使用的python3.5。 其中range和xrange,input和raw_input已经合并

6-4.算术。把测试得分放到一个列表中去,你的代码应该可以计算一个平均分。

num = input("请输入成绩,成绩以空格分开")
totalnum = 0
numbers  = num.split(' ')
numbers  = list(map(int, numbers))
for num in numbers:
    totalnum += num
print(totalnum//len(numbers))

6-6.字符串。创建一个string.strip()的替代函数:接受一个字符串,去掉它前面和后面的空格

def astring(str1):
    if len(str1) == 1 or (str1[0] != ' ' and str1[-1] != ' '):
        return str(str1)
    elif str1[0] == ' ':
        return astring(str1[1:])
    elif str1[-1] == ' ':
        return astring(str1[:-1])

 

6-8:列表。给出一个整型值,返回代表该值得英文,比如输入89会返回“eight-nine”。附加题:能够返回符合英文语法规律的新式,比如输入89会返回“eighty-nine”。本练习中的值假定在0~1000。

方法1:按照数值大小判断形成英文格式

def astring(str1):
    a = {'0':'zero','1':'one','2':'two','3':'three','4':'four','5':'five','6':'six','7':'seven','8':'eight','9':'nine'}
    b = {'0':'ten','11':'eleven','12':'twelve','13':'thirteen','14':'fourteen','15':'fifteen','16':'sixteen','17':'seventeen','18':'eighteen','19':'nineteen'}
    c = {'2':'twenty','3':'thirty','4':'forty','5':'fifty','6':'sixty','7':'seventy','8':'eighty','9':'ninety'}
    if len(str1) == 1:
        return a[str1[0]]
    elif len(str1) == 2:
        if str1[0] == '1':
            return b[str1]
        elif str1[1] != '0':
            return c[str1[0]] + '-' + a[str1[1]]
        elif str1[1] == '0':
            return c[str1[0]]
    elif len(str1) == 3:
        if str1[1:] != '00':
            return a[str1[0]] + ' hundred and ' + astring(str1[1:])
        else:
            return a[str1[0]] + ' hundred'
    if str1 == '1000':
        return str('one thousand')

def transform(num):
    ele = str(num)
    return astring(ele)

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

def h_m(minute):  
    hours=minute//60  
    mins=minute-hours*60  
    print (minute,'minutes =',hours,'hours and',mins,'minutes')

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

def change_letter(str1):
    l = list(str1)
    for i in range(len(str1)):
        if l[i].isupper() == True:
            l[i] = l[i].lower()
        else:
            l[i] = l[i].upper()
    newS = ''.join(l)
    return newS

 6-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()类似,不同的是,如果找到匹配的字符就用新的字符替换原先字符。返回修改后的字符串。

def findchr(string, char):
    for ele in range(len(string)):
        if string[ele] == char:
            return ele
    return -1
def rfindchr(string, char):
    str1 = string[::-1]
    for ele in range(len(str1)):
        if str1[ele] == char:
            return ele
    return -1
def subchr(string, origchar, newchar):
    l = list(string)
    for ele in range(len(string)):
        if l[ele] == origchar:
            l[ele] = newchar
    newstr = ''.join(l)
    return newstr

 

6-14.随机数。设计一个“石头、剪子、布”游戏,有时又叫“Rochambeau”,你小时候可能玩过,下面是规则。你和你的对手,在同一时间做出特定的手势,必须是下面一种:石头、剪子、布。胜利者从下面的规则产生,这个规则本身是个悖论。

(a)布包石头。

(b)石头砸剪子。

(c)剪子剪破布。在你的计算机版本中,用户输入他/她的选项,计算机找一个随机选项,然后由你的程序来决定一个胜利者或者平手。注意,最好的算法是尽量少使用if语句。

import random


def Rochambeau():
    pr = '''
    s(T)one
    (S)cissors
    (C)loth
    (Q)iut
    '''
    dict1 = {'t1':u'','s2':u'','c3':u'','t2':u'玩家赢','s3':u'玩家赢','c1':u'玩家赢','t3':u'电脑赢','s1':u'电脑赢','c2':u'电脑赢'}
    while True:
        ele = str(random.randint(1,3))
        try:
            choice = input(pr).strip()[0].lower()
        except(EOFError,KeyboardInterrupt,IndexError):
            choice = 'q'
        
        if choice == 'q':
            break
        
        res = choice + ele
        print(dict1[res])

if __name__ == '__main__':
    Rochambeau()

 6-14.随机数。转换。
(a)给出两个可识别格式的日期,比如MM/DD/YY或者DD/MM/YY格式。计算出两个日期之间的天数。
(b)给出一个人的生日,计算此人从出生到现在的天数,包括所有的闰月。
(c)还是上面的例子,计算出此人下次过生日还有多少天。

MONTHDAYS=[31,28,31,30,31,30,31,31,30,31,30,31]  
LMONTHDAYS=[31,29,31,30,31,30,31,31,30,31,30,31]
def isLeapYear(year):
    if year%4 == 0 and year%100 != 0:
        return True
    if year%400 == 0:
        return True
    return False
 
def Usedday(year,month,day):
        total = 0
        if month != 1:
            if isLeapYear(year) == True:
                for m in range(month-1):
                    total = total + LMONTHDAYS[m]
                total = total + day
            else:
                for m in range(month-1):
                    total = total + MONTHDAYS[m]
                total = total + day
        else:
            total = total + day
        return total

def day2day(str1,str2):
    str1 = str1.split('/')
    str2 = str2.split('/')
    year1,year2 = int(str1[0]),int(str2[0])
    month1,month2 = int(str1[1]),int(str2[1])
    day1,day2 = int(str1[2]),int(str2[2])
    totalday = 0        
    if year2 - year1 > 1:
        for i in range(year1+1,year2-1):
            if isLeapYear(i) == True:
                totalday = totalday + 366
            else:
                totalday = totalday + 365
    ele1 = Usedday(year1,month1,day1)
    ele2 = Usedday(year2,month2,day2)
    if year2 - year1 == 0:
        return ele2 - ele1
    if isLeapYear(year1) == True:
        totalday = totalday + (366 - ele1) + ele2
    else:
        totalday = totalday + (365 - ele1) + ele2
    return totalday

 6-16.矩阵。处理矩阵M和N的加和乘操作。

没看懂是什么意思

 

6-17:方法。实现一个叫myPop()的函数,功能类似于列表的pop()方法,用一个列表作为输入,移除列表的最新一个元素,并返回它

def myPop(list1):
    del(list1[-1])
    return list1

6-19多列输出。有任意项的序列或者其他容器,把它们等距离分列显示。由调用者提供数据和输出格式。例如,如果你传入100个项并定义3列输出,按照需要的模式显示这些数据。这种情况下,应该是两列显示33个项,最后一列显示34个。你可以让用户来选者水平排序或者垂直排序

 略

posted @ 2017-09-01 18:05  闪电旅途  阅读(482)  评论(0编辑  收藏  举报