6.22 练习

6–1. 字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分?

>>> a='t'
>>> b='letters'
>>> a in b
True
>>> b.find(a)
2
>>> b.index(a)
2
>>> b.rfind(a)
3
>>> b.rindex(a)
3

6–2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为1的标识符,并且可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 keyword.kelist)来帮你.

import string
import keyword
alphas = string.letters + '_'
nums = string.digits

print 'Welcome to the Identifier Checker v2.0'
print 'Testees must be at least 1 chars long.'
myInput = raw_input('Identifier to test? ')

if len(myInput) >= 1:
    if myInput[0] not in alphas:
        print '''invalid: first symbol must be alphabetic'''
    else:
        for otherChar in myInput[1:]:
            if otherChar not in alphas + nums:
                print '''invalid: remaining symbols must be alphanumeric'''
                break

        else:
            if myInput in  keyword.kwlist:
                print '''invalid: symbols can't be a keyword of python'''
            else:
                print "okay as an identifier"

6–3. 排序
(a) 输入一串数字,从大到小排列之.

input_nums=raw_input('Please input numbers: ')
nums=[]
for n in input_nums:
    nums.append(n)
nums.sort()
nums.reverse()
print ''.join(nums)

感觉写的很繁琐,在QQ群里一问有人写出以下代码
input_nums=raw_input('Please input numbers: ')
print ''.join(sorted(list(input_nums), reverse=True))

(b) 跟 a 一样,不过要用字典序从大到小排列之. (Do the same thing, but for strings and in reverse alphabetical (largest-to-smallest lexicographic) order.)

没搞懂,字符串排序不就是这样排的吗?

6–4. 算术. 更新上一章里面你的得分测试练习方案,把测试得分放到一个列表中去.你的代码应该可以计算出一个平均分,见练习 2-9 和练习 5-3.

#2-9 代码
list1=[1,2,3,4,5]
sum =0
for i in list1:
    sum+=i
avg = float(sum/len(list1)) #当时这样写看来是不对的
print avg

#5-3 代码
def judge(score):
    if 90<=score<=100:
        return 'A'
    elif score>=80:
        return 'B'
    elif score>=70:
        return 'C'
    elif score>=60:
        return 'D'
    else:
        return 'F'

list1=[1,2,3,4,5]
avg = float(sum(list1))/len(list1) 
print avg

6–5. 字符串
(a)更新你在练习 2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符.

不管是中文还是英文,这个题目我都没搞懂

(b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者 cmp()内建函数)。附加题:在你的方案里加入大小写区分.

#来源于网络
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)判断一个字符串是否重现(后面跟前面的一致).附加题:在处理除了严格的回文之外,加入对例如控制符号和空格的支持。

暂时不会

(d)接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串.

def add_reverse(a_str):
    return a_str+a_str[::-1]

6–6. 字符串.创建一个 string.strip()的替代函数:接受一个字符串,去掉它前面和后面的空格(如果使用 string.*strip()函数那本练习就没有意义了)

def strip(string):
    while string[0]==' ':
        string=string[1:]
    while string[-1]==' ':
        string=string[:-1]
    return string

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) 

# 生成一个列表
fac_list = range(1, num_num+1) 
print "BEFORE:", `fac_list`#bug1

# 初始化
i = 0 

# 循环判断
while i < len(fac_list): 

    # 找出约束,bug2
    if num_num % fac_list[i] != 0: 
        del fac_list[i]
        continue

    # bug3
    i = i + 1 

# bug4
print "AFTER:", `fac_list`

6–8. 列表.给出一个整数值,返回代表该值的英文,比如输入 89 返回”eight-nine”。附加题:能够返回符合英文语法规则的形式,比如输入“89”返回“eighty-nine”。本练习中的值限定在家 0到 1,000.

"""参考网上代码"""
dict1 = {"1" :"one" , "2" : "two" , "3" : "three" , "4" : "four" , "5" : "five" ,"6" : "six", "7" : "seven" , "8" : "eight" , "9" : "nine", "0" : "" }
dict2 = {"1" :"ten" , "2" : "twenty" , "3" : "thirty" , "4" : "forty" , "5" : "fifty" ,"6" : "sixty", "7" : "seventy" , "8" : "eighty" , "9" : "ninety", "0" : "" }
dict3 = {"1" :"one hundred" , "2" : "two hundred" , "3" : "three hundred" , "4" : "four hundred" , "5" : "five hundred" ,"6" : "six hundred", "7" : "seven hundred" , "8" : "eight hundred" , "9" : "nine hundred", "0" : "" }
dictAll={ 1: dict1 ,2: dict2 , 3: dict3 }
def fun(strNum):
    if int (strNum)>1000 or int(strNum)<0:
        return "Invalid Number,Plase input again"
    length = len(strNum)
    strTemp = ""
    if len(strNum) ==4:
        strTemp = "One Thousand"
        return strTemp
    for i in range(length):
        strTemp += dictAll[length- i][strNum[i]] +" "
    return strTemp

if __name__ == "__main__":
    while True:
        strNum = raw_input("请输入一个数字,按q退出: ")
        if strNum.lower() == 'q' :
            break
        print fun (strNum)

6–9. 转换.为练习 5-13 写一个姊妹函数, 接受分钟数, 返回小时数和分钟数. 总时间不变,并且要求小时数尽可能大.

'''没想出来分钟是个位时怎么输出0:00的格式'''
def change_time():
    time=int(raw_input("input a time (minutes)  :  "))
    after_time=divmod(time,60)
    print "%d:%d"% (after_time[0],after_time[1])

6–10.字符串.写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转.比如,输入”Mr.Ed”,应该返回”mR.eD”作为输出.

'''参考网上代码'''
def Str1(testStr):
    result = testStr.swapcase()
    return result

if __name__ == "__main__":
    while True:
        testStr = raw_input("Input your strings(q to quit):")
        if testStr.lower() == "q":
            break
        print Str1(testStr)

Example 6.4 有 bug 的程序(buggy.py)

这是一个用于练习 6-7 的程序,判断这个程序是干什么的,在”#”处添加你的注释,找出其中的错
误,并修改之.

#!/usr/bin/env python 

# 
num_str = raw_input('Enter a number: ') 

#  
num_num = int(num_str) 

# 
fac_list = range(1, num_num+1) 
print "BEFORE:", 'fac_list' 

# 
i = 0 

# 
while i < len(fac_list): 

    # 
    if num_num % fac_list[i] == 0: 
        del fac_list[i] 

    # 
    i = i + 1 

# 
print "AFTER:", 'fac_list' 

6–11.转换
(a)创建一个从整数到 IP 地址的转换程序,如下格式: WWW.XXX.YYY.ZZZ.
(b)更新你的程序,使之可以逆转换.

不懂转换规则

6–12.字符串
(a)创建一个名字为 findchr()的函数,函数声明如下:
def findchr(string, char) findchr()要在字符串 string 中查找字符 char,找到就返回该值的索引,否则返回-1.不能用
string.*find()或者 string.*index()函数和方法

def findchr(string, char):
    index = -1
    for i, ch in enumerate(string):
        if (ch == char):
            index = i
            break
    return index

(b)创建另一个叫 rfindchr()的函数,查找字符 char 最后一次出现的位置.它跟 findchr()工作类似,不过它是从字符串的最后开始向前查找的.

def rfindchr(string, char):
    index = -1
    for i, ch in enumerate(string[::-1]):
        if (ch == char):
            index = len(string)-i-1
            break
    return index

(c)创建第三个函数,名字叫 subchr(),声明如下:
def subchr(string, origchar, newchar)
subchr()跟 findchr()类似,不同的是,如果找到匹配的字符就用新的字符替换原先字符.返回修改后的字符串.

def subchr(string,origchar,newchar):
    s=''
    for ch in string:
        if ch == origchar:
            s+=newchar
        else:
            s+= ch
    return s

6–13.字符串.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(string):
    index = max(string.rfind('+'), string.rfind('-'))
    if index > 0:
        if string[index-1] == 'e':
            index = max(string.rfind('+', 0, index-1), string.rfind('-', 0, index-1))
        real = float(string[0:index])
        imag = float(string[index:len(string)-1])
    else:
        if 'j' in string:
            real = 0
            imag = float(string[0:len(string)-1])
        else:
            real = float(string)
            imag = 0
    return complex(real, imag)

6–14.随机数.设计一个”石头,剪子,布”游戏,有时又叫”Rochambeau”,你小时候可能玩过,下面是规则.你和你的对手,在同一时间做出特定的手势,必须是下面一种手势:石头,剪子,布.胜利者从下面的规则中产生,这个规则本身是个悖论.
(a) 布包石头.
(b)石头砸剪子,
(c)剪子剪破布.
在你的计算机版本中,用户输入她/他的选项,计算机找一个随机选项,然后由你的程序来决定一个胜利者或者平手.注意:最好的算法是尽量少的使用 if 语句.

'''网上抄的'''
import random

def rochambeau(string):
    dict1 = {"stone"  : "1" ,"swear" :"2" ,"cloth":"3"  }
    dictall = {"11" :"equal" ,"12" :"win" ,"13" :"lose" ,"22":"equal" ,"23" :"win" ,"21" :"lose" ,"33":"equal" ,"31":"win" ,"32" :"lose"   }
    randnum = random.randrange(1,4)
    return "You are : %s"  %dictall[dict1[string]+str(randnum)]

if __name__ == "__main__":
    while True: 
        string = raw_input("please input your choose(stone,seear or cloth):(quit by q)")
        if string.lower() == 'q':
            break
        if (string != 'stone') and (string != 'swear') and (string != 'cloth'):
            print "error input" 
            continue
        print rochambeau(string)

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

我已经崩溃了,为了不打击学习热情,这些题目就放了她吧

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

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

6–18. zip() 内建函数 在 6.13.2 节里面关于 zip()函数的例子中,zip(fn,ln)返回的是什么?

#zip()返回元组

6–19.多列输出.有任意项的序列或者其他容器,把它们等距离分列显示.由调用者提供数据和输出格式.例如,如果你传入 100 个项并定义 3 列输出,按照需要的模式显示这些数据.这种情况下,应该是两列显示 33 个项,最后一列显示 34 个.你可以让用户来选择水平排序或者垂直排序.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: WinRAR 6.22 是一款常用的压缩文件工具。它具有简便易用的界面和多种功能,可以帮助用户对文件和文件夹进行快速、有效的压缩和解压缩操作。 WinRAR 6.22 支持的压缩文件格式多种多样,包括RAR、ZIP、CAB、ARJ、LZH、ACE、TAR等等。用户可以根据自己的需求选择适合的压缩格式,以提高存储效率和文件传输速度。 该软件还具备强大的压缩算法,可以实现高度的文件压缩率,节省存储空间。用户可以通过设置压缩级别、选择压缩方式等操作,根据需要平衡压缩比和压缩速度。 除了压缩文件,WinRAR 6.22 还具备解压缩功能。用户可以将压缩文件解压缩到指定位置,快速获取原始文件。同时,软件还支持密码保护功能,用户可以设置密码来保护压缩文件中的内容,加强文件的安全性。 此外,WinRAR 6.22 还提供了文件分卷压缩功能,用户可以将大文件分成多个部分进行压缩,方便存储和传输。解压缩时,只需解压一个分卷文件即可,便于操作和管理。 总之,WinRAR 6.22 是一款功能全面、操作简便的压缩文件工具。无论是压缩文件还是解压缩文件,它都能提供高效、安全的操作体验,满足用户的各种需求。无论是个人用户还是企业用户,都可以从中受益。 ### 回答2: WinRAR 6.22是一个流行的压缩工具。它可以帮助用户有效地压缩和解压缩文件,节省存储空间并方便文件传输。 WinRAR 6.22具有许多强大的功能。首先,它支持各种文件格式的压缩和解压缩,包括RAR、ZIP、ISO、7Z等。这意味着无论用户需要压缩哪种类型的文件,WinRAR都可以帮助他们完成任务。 其次,WinRAR 6.22具有高度的压缩率,可以显著减小文件大小,从而节省硬盘空间和带宽。用户可以使用不同的压缩级别来平衡压缩率和压缩时间。同时,WinRAR还支持多卷压缩,可以将大文件分割成多个小文件进行传输或存储。 此外,WinRAR 6.22还提供了强大的加密功能,可以保护用户的文件安全。用户可以为压缩文件设置密码,以确保只有授权的人可以访问其中的内容。 还有其他一些实用的功能,例如创建自解压缩文件、修复受损的压缩文件、预览压缩文件的内容等等。WinRAR还提供了直观的界面和易于使用的操作,使用户能够轻松地完成各种压缩和解压缩任务。 总之,WinRAR 6.22是一个功能强大且易于使用的压缩工具,适用于各种文件的压缩和解压缩需求。它提供了高度的压缩率、可靠的文件加密以及其他实用的功能,使用户能够方便地管理和传输文件。无论是个人用户还是商业用户,都会发现WinRAR 6.22是一个不可或缺的工具。 ### 回答3: WinRAR 6.22 是一款非常流行的压缩文件管理软件。它的主要功能是能够将多个文件或文件夹压缩成一个压缩文件,以减小文件的大小并方便传输。同时,它还可以解压缩各种类型的压缩文件。 WinRAR 6.22 具有以下一些主要特点和功能。首先,它支持创建和解压缩众多的压缩文件格式,包括RAR、ZIP、7z等等。无论是哪种格式,我们都可以在WinRAR中方便地进行操作。 其次,WinRAR 6.22 允许用户设置密码来保护压缩文件中的数据。这一功能对于包含私密信息的文件非常重要,可以确保文件只能被授权的人员访问。 另外,WinRAR 6.22 还支持分卷压缩,即将一个大文件分割成多个较小的压缩文件。这样做有利于存储和传输,特别是当需要将大文件拆分在多个存储设备或介质上时。 此外,WinRAR 6.22 还具备可靠的压缩和解压缩算法,可以保证数据的完整性和准确性。它能够压缩文件并还原其原始状态,同时最大限度地减小文件大小。 除此之外,WinRAR 6.22 还提供了一个直观友好的用户界面,使得用户可以轻松地操作和管理压缩文件。它还具备快速的压缩和解压缩速度,能够高效地处理大型文件。 总之,WinRAR 6.22 是一款高效、稳定和功能丰富的压缩文件管理软件。它提供了多种压缩和解压缩选项,支持众多文件格式,且操作简单便捷。无论从个人使用还是商业用途,WinRAR 都是一个不错的选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值