您的位置:首页 > 编程语言 > Python开发

python核心编程--第六章 6.22 练习

2014-05-23 10:59 253 查看
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")


#!/usr/bin/python
# -*- coding: utf-8 -*-

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

# (a)
# 非润年的每月的天数
monthdays = (31,28,31,30,31,30,31,31,30,31,30,31)

# 判断润年
def is_leap(year):
return (( year%4==0 and year%100!=0) or (year%400==0))

# 一年中的天数
def days_of_year(year):
days = 365
if is_leap(year):
days += 1

return days

# 两年之间的天数
def days_between_years(small_year, big_year):
days = 0
for year in range(small_year, big_year):
days += days_of_year(year)

return days

# 某年某月某日是当前年的第几天
def which_day_for_year(date):
days = int(date[2]);

for i in range(0, int(date[1])-1):
days += monthdays[i]

if is_leap(int(date[0])):
days += 1

return days

# 日期格式 YY/MM/DD
def days_between_dates(small_date, big_date):
date1 = small_date.split('/')
date2 = big_date.split('/')

if date1 < date2:
small = date1
big = date2
else:
big = date1
small = date2

days = days_between_years(int(small[0]), int(big[0]))
days -= which_day_for_year(small)
days += which_day_for_year(big)

return days

# print(days_between_dates("2014/05/24", "1990/12/31"))

# (b)

import datetime

def days_from_birth_to_now(birth_day):
now = datetime.datetime.now().strftime("%Y/%m/%d")
return days_between_dates(birth_day, now)

# print(days_from_birth_to_now("1990/12/31"))

# (c)
def days_to_birth(birthday):
now = datetime.datetime.now().strftime("%Y/%m/%d")
now_year = int(now.split('/')[0])
now_month = int(now.split('/')[1])
now_day = int(now.split('/')[2])

birth_year = int(birthday.split('/')[0])
birth_month = int(birthday.split('/')[1])
birth_day =  int(birthday.split('/')[2])

if now_month > birth_month:
next_birth = str(now_year+1)+'/'+str(birth_month)+'/'+str(birth_day)
elif now_month < birth_day.split('/')[1]:
next_birth = str(now_year)+'/'+str(birth_month)+'/'+str(birth_day)
elif now_day > birth_day:
next_birth = str(now_year+1)+'/'+str(birth_month)+'/'+str(birth_day)
else:
next_birth = str(now_year)+'/'+str(birth_month)+'/'+str(birth_day)

print now, next_birth

return days_between_dates(now, next_birth)

print days_to_birth("2013/04/24")


#!/usr/bin/python
# -*- coding: utf-8 -*-

# 6–16.矩阵.处理矩阵M 和N 的加和乘操作.

M1 = (1, 2, 3)
M2 = (4, 5, 6)
M = (M1, M2)
N1 = (1, 2)
N2 = (3 ,4)
N3 = (5, 6)
N = (N1, N2, N3)

def check_matrix(matrix):
for i in range(1, len(matrix)):
if len(matrix[i]) != len(matrix[0]):
return False

return True

def matrix_add(matrix1, matrix2):
if not (check_matrix(matrix1) and check_matrix(matrix2)):
print "矩阵无效: 行和行,列和列必须保持一致"
return []

if (len(matrix1) != len(matrix2)) or (len(matrix1[0]) != len(matrix2[0])):
print "必须是同形矩阵"
return []

ret_matrix = []
sub_matrit = []
for i in range(len(matrix1)):
for j in range(len(matrix1[i])):
sub_matrit.append(matrix1[i][j] + matrix2[i][j])
else:
ret_matrix.append(sub_matrit)
sub_matrit = []

return ret_matrix

def matrix_mul(matrix1, matrix2):
if not (check_matrix(matrix1) and check_matrix(matrix2)):
print "矩阵无效: 行和行,列和列必须保持一致"
return []

if len(matrix1) != len(matrix2[0]):
print "第一个矩阵的列数必须等于第二个矩阵的行数"
return []

ret_matrix = []
sub_matrix = []
value = 0

for i in range(len(matrix1)):
for j in range(len(matrix2[0])):
for k in range(len(matrix2)):
value += matrix1[i][k] * matrix2[k][j]
# print i, k, '*', k, j, '=', value
else:
sub_matrix.append(value)
value = 0
else:
ret_matrix.append(sub_matrix)
sub_matrix = []

return ret_matrix

def print_matrix(matrix):
for m in matrix:
print m

print
print "matrix add:"
print_matrix(M)
print "+"
print_matrix(M)
print "="
print_matrix(matrix_add(M, M))

print "matrix add:"
print_matrix(M)
print "*"
print_matrix(N)
print "="
print_matrix(matrix_mul(M, N))


#!/usr/bin/python
# -*- coding: utf-8 -*-

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

def myPop(poplist):
if poplist.count == 0:
return None

ret_value = poplist[len(poplist)-1]
del poplist[len(poplist)-1]

return ret_value

mylist = [1, 2, 3, 4, 5, 6, 7, 8]

mylist.append(len(mylist)+1)
print myPop(mylist)
print myPop(mylist)
print mylist.pop()
print mylist
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐