首页 > 代码库 > python核心编程--第六章 6.22 练习

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

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 = http://www.mamicode.com/int(a_num)>


#!/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")