6.22 练习
初学python,如果代码有问题,欢迎指正。
#!/usr/bin/python # -*- coding: utf-8 -*- #6–1. 字符串.string 模块中是否有一种字符串方法或者函数 #可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分? import string ss = "I'm chinese." substr = 'chinese' index = ss.find(substr) if index == -1: print("Not found.") else: print("Found.")
#!/usr/bin/python # -*- coding: utf-8 -*- # 6–2. 字符串标识符.修改例6-1 的idcheck.py 脚本,使之可以检测长度为一的标识符,并且 # 可以识别Python 关键字,对后一个要求,你可以使用keyword 模块(特别是keyword.kelist)来帮你. import string import keyword alphas = string.letters + '_' nums = string.digits kw = keyword.kwlist def idcheck(check_string): ''' check the string is a python key word ''' print '''Welcome to the Identifier Checker v1.0 Testees must be at least 2 chars long.''' if len(check_string) == 1: if check_string[0] not in alphas[:-1]: print '''invalid: first symbol must be alphabetic''' else: print "okay as an identifier" elif len(check_string) > 1: if check_string in kw: print("This a Python keyword") elif check_string[0] not in alphas: print '''invalid: first symbol must be alphabetic''' else: for otherChar in check_string[1:]: if otherChar not in alphas + nums: print '''invalid: symbol must be alphanumeric''' break; else: print "okay as an identifier" else: print("Not input.") chk_string = raw_input("Please input the identifier: ") idcheck(chk_string)
#!/usr/bin/python #-*- coding:utf-8 -*- #6–3. 排序 #(a) 输入一串数字,从大到小排列之. #(b) 跟a 一样,不过要用字典序从大到小排列之. #(a) list1 = [] while True: num = int(raw_input("Please input numbers, end with 0: ")) if num == 0: break; else: list1.append(num) list1.sort() print list1 #(b) list2 = [] while True: num = raw_input("Please input numbers, end with 0: ") if str == '0': break; else: list2.append(num) list2.sort() print list2
#!/usr/bin/python #6–4. 算术. 更新上一章里面你的得分测试练习方案, #把测试得分放到一个列表中去.你的代码应该可以计 #算出一个平均分,见练习2-9 和练习5-3. numbers = [1, 2, 3, 4, 5] print(sum(numbers)/len(numbers))
#!/usr/bin/python # -*- coding: utf-8 -*- #6–5. 字符串 # (a)更新你在练习2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符. # (b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者cmp()内建函数)。 # 附加题:在你的方案里加入大小写区分. # (c)判断一个字符串是否重现(后面跟前面的一致).附加题:在处理除了严格的回文之外, # 加入对例如控制符号和空格的支持。 # (d)接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串. #(a) def show_char(a_string): ret_string = '' for i in range((len(a_string)+1)//2): if i == len(a_string)-i-1: ret_string += a_string[i] else: ret_string += a_string[i] + a_string[-i-1] return ret_string #(b) def is_same(first_string, second_string): if len(first_string) is not len(second_string): return False else: for i in range(len(first_string)): if first_string[i] is not second_string[i]: return False return True #(c) def is_repeated(a_string): for ch in a_string: if a_string.find(ch) != a_string.rfind(ch): return False else: return True; #(d) def palindromic(a_string): return a_string + a_string[-1::-1] #Test the_string = raw_input("Input a string: ") #(a) #print(show_char(the_string)) #(b) # first_string = raw_input("Input first string: ") # second_string = raw_input("Input second string: ") # print(is_same(first_string, second_string)) #(c) # print(is_repeated(the_string)) #(d) #print(palindromic(the_string))
#!/usr/bin/python # -*- coding: utf-8 -*- #6–6. 字符串.创建一个string.strip()的替代函数:接受一个字符串, #去掉它前面和后面的空格(如果使用string.*strip()函数那本练习就没有意义了) def my_strip(a_string): ret_string = "" tmp_string = "" for i in range(len(a_string)-1, 0, -1): if a_string[i] != ' ': tmp_string = a_string[:i+1] break for i in range(len(tmp_string)): if tmp_string[i] != ' ': ret_string = tmp_string[i:] break return ret_string the_string = raw_input("Input a string: ") print(my_strip(the_string))
#!/usr/bin/python # -*- coding: utf-8 -*- #6–7. 调试.看一下在例6.5 中给出的代码(buggy.py) # (a)研究这段代码并描述这段代码想做什么.在所有的(#)处都要填写你的注释. # (b)这个程序有一个很大的问题,比如输入6,12,20,30,等它会死掉,实际上它不能处理任何的偶数,找出原因. # (c)修正(b)中提出的问题. #提示用户输入一个数字 num_str = raw_input('Enter a number: ') #把用户输入的数字字符串转换为数字 num_num = int(num_str) #生成一个从1到用户输入数字的列表 fac_list = range(1, num_num+1) #bug1 原本想把列表作为字符串输出 # print "BEFORE:", 'fac_list' print "BEFORE:", `fac_list` #定义变量i用于遍历列表用 i = 0 #遍历列表 while i < len(fac_list): #找出约束 #bug2 #if num_num % fac_list[i] == 0: if num_num % fac_list[i] != 0: del fac_list[i] #bug3 #i = i + 1 continue i += 1 #bug4 #print "AFTER:", 'fac_list' print "AFTER:", `fac_list`
#!/usr/bin/python # -*- coding: utf-8 -*- # 6–8. 列表.给出一个整数值,返回代表该值的英文,比如输入89 返回"eight-nine"。 # 附加题:能够返回符合英文语法规则的形式, # 比如输入“89”返回“eighty-nine”。本练习中的值限定在0到1,000. dict_number = { '0' : 'zero', '1' : 'one', '2' : 'tow', '3' : 'three', '4' : 'four', '5' : 'five', '6' : 'six', '7' : 'seven', '8' : 'eight', '9' : 'nine' } def num_to_en(num_str): ret_str = "" i = 0 for i in range(len(num_str)-1): ret_str += dict_number[num_str[i]] ret_str += '-' else: ret_str += dict_number[num_str[i+1]] return ret_str the_num = raw_input("Please input the number: ") print(num_to_en(the_num))
#!/usr/bin/python # -*- coding: utf-8 -*- # 6–9. 转换.为练习5-13 写一个姊妹函数, 接受分钟数, 返回小时数和分钟数. # 总时间不变,并且要求小时数尽可能大. minute = int(raw_input("Please input the minutes: ")) hour = "" hour_minute = divmod(minute, 60) print hour_minute[0], ':', hour_minute[1]
#!/usr/bin/python # -*- coding: utf-8 -*- # 6–10.字符串.写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转. # 比如,输入"Mr.Ed",应该返回"mR.eD"作为输出. import string def reverse_case(a_string): ret_string = "" for ch in a_string: if ch in string.ascii_uppercase: ret_string += str.lower(ch) elif ch in string.ascii_lowercase: ret_string += str.upper(ch) else: ret_string += ch return ret_string the_string = raw_input("Plese input a string: ") print(reverse_case(the_string))
#!/usr/bin/python # -*- coding: utf-8 -*- # 6–11.转换 # (a)创建一个从整数到IP 地址的转换程序,如下格式: WWW.XXX.YYY.ZZZ. # (b)更新你的程序,使之可以逆转换. def num_to_ip(a_num): src = int(a_num) str_ip = "" tmp = src//(256**3) str_ip += str(tmp) str_ip += '.' src -= tmp*(256**3) tmp = src//(256**2) str_ip += str(tmp) str_ip += '.' src -= tmp*(256**2) tmp = src//(256) str_ip += str(tmp) str_ip += '.' src -= tmp*256 str_ip += str(src) return str_ip # num = raw_input("Input a number to ip: ") # print(num_to_ip(num)) def ip_to_num(ip): num_list = ip.split('.') num_list.reverse() ret_num = 0 for i in range(len(num_list)): ret_num += int(num_list[i])*pow(256, i) return ret_num ip = raw_input("Input a ip to number: ") print(ip_to_num(ip))
#!/usr/bin/python # -*- coding: utf-8 -*- #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()类似,不同的是, # 如果找到匹配的字符就用新的字符替换原先字符.返回修改后的字符串. #(a) def findchr(string, char): index = -1 for i in range(len(string)): if char == string[i]: index = i break return index # test findchr print(findchr('abcdeabcde', 'a')) print(findchr('abcde', 'f')) #(b) def rfindchr(string, char): index = -1 for i in range(len(string)): if char == string[len(string)-1-i]: index = len(string)-1-i break return index # test rfindchr print(rfindchr('abcdeabcde', 'a')) print(rfindchr('abcde', 'f')) #(c) def subchr(string, origchar, newchar): newstring = string for i in range(len(newstring)): if origchar == newstring[i]: newstring = newstring[:i] + newchar + string[i+1:] newstring = subchr(newstring, origchar, newchar) return newstring # test subchr print(subchr('abcdeabcde', 'a', 'f')) print(str.replace('abcdeabcde', 'a', 'f'))
好困啊,两个晚上了,做到12题。效率太低了。
#!/usr/bin/python # -*- coding: utf-8 -*- # 6–1.字符串.string 模块包含三个函数,atoi(),atol(),和atof(), # 它们分别负责把字符串转换成整数,长整型,和浮点型数字. # 从Python1.5 起,Python 的内建函数int(),long(),float()也 # 可以做相同的事了, complex()函数可以把字符串转换成复数. # (然而1,5 之前,这些转换函数只能工作于数字之上)string 模 # 块中并没有实现一个atoc()函数,那么你来实现一个,atoc(), # 接受单个字符串做参数输入,一个表示复数的字符串,例如, # '-1.23e+4-5.67j',返回相应的复数对象.你不能用eval()函数, # 但可以使用complex()函数,而且你只能在如下的限制之下使用 # complex():complex(real,imag)的real 和imag 都必须是浮点值. def atoc(complexstring): i = 1 while i < len(complexstring): if complexstring[i] == 'e': i += 1 elif complexstring[i] in ['+', '-']: real = complexstring[:i] image = complexstring[i:] break i += 1 print real, image[:-1] return complex(float(real), float(image[:-1])) print(atoc("-1.23e+4-5.67j"))
#!/usr/bin/python # -*- coding: utf-8 -*- # 6–14.随机数.设计一个"石头,剪子,布"游戏,有时又叫"Rochambeau", # 你小时候可能玩过,下面是规则.你和你的对手,在同一时间做出特 # 定的手势,必须是下面一种手势:石头,剪子,布.胜利者从下面的规 # 则中产生,这个规则本身是个悖论. # (a) the paper covers the rock,布包石头. # (b)石头砸剪子, # (c)剪子剪破布.在你的计算机版本中,用户输入她/他的选项,计算 # 机找一个随机选项,然后由你的程序来决定一个胜利者或者平手. # 注意:最好的算法是尽量少的使用if 语句. import random lpaperrock = ["paper", "rock", "shears"] dpaperrock = {"paper":'1', "rock":'2', "shears":'3'} drule = {'12':'WIN', '23':'WIN', '31':'WIN', '11':'Draw', '22':'Draw', '33':'Draw', '21':'Fail', '32':'Fail', '13':'Fail'} def rochambeau(a_string): robot = random.randrange(1, 4) print print(drule[dpaperrock[a_string]+str(robot)]) print("robot is " + str(lpaperrock[robot-1])) rochambeau("paper")