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个。你可以让用户来选者水平排序或者垂直排序
略