python核心编程--第六章 6.22 练习
时间:2014-05-26 05:45:39
收藏:0
阅读:420
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")
评论(0)