python-Computing with Strings课后题

翻译:显示评估以下每个字符串表达式的结果。

解:(a)The Knights who say,ni!  "The Knights who say,"+s2表示字符串连接

(b) spamspamspamni!ni!      3*s1+2*s2表示字符串重复的次数为乘以整数

      (c)p                                    s1[1]表示取出字符串第1个位置的字符

(d)pa                     s1[1:3]表示取出字符串第1到第3位置的字符(不包括第三)

(e) ani     s1[2]+s2[:2]表示s1字符串的第2个字符与s2字符串的前两个字符相连

(f) spam!  s2[-1]表示s2第2个字符,即-1+3(3为s2字符串的长度,即len(s2)==3)

(g)SPAM                         upper(s1)表示将s1字符串的所有字母变为大写,而lower()是将所有字母变为小写。

(h) NI! NI! NI!     ljust(s1,4)表示从左边开始数,s1字符串占4个字符,若s1是5个字符,那么就紧挨着,若s1是3个字符,那么s1右边多一个空格。同样,rjust是从右边开始数,即左边会多出空格。

翻译:给定与前一个问题相同的初始语句,显示一个Python表达式,它可以通过对s1和s2执行字符串操作来构造以下每个结果。

解:(a) string.upper(s2[:2])     

(b) 2+s1+s2

(c) string.ljust(string.capitalize(s1)+ string.rjust(string.upper(s2),4),11)*3    

(d) s1[:3]+s2[0]

(e)string. split(s1,"a")  (f) s1[:2]+s1[3]或者replace(s1,"a","")

翻译: 显示将由以下每个程序片段生成的输出。

解:(a)a;a;r;d;v;a;r;k     (b) Now;is;the;winter;of;our;discontent...     (c) M;ss;ss;pp  (d)scrt

       (e) tfdsfu   ord(ch)表示将每个字母转换为数字(int型的),加1后再转换为字母

翻译:显示由以下每个字符串格式化操作产生的字符串。 如果操作不合法,请解释原因。

(a) Looks like spam and eggs for breakfast  

(b) There is 1 spam 4 you

(c)报错。原因:一个s%只能对应一个字符串

(d) 2.30 2.35 %w.hf/d/s这个东西的w表示字符所占宽度,若小于字符串实际宽度,则以实际为准。比如说%10.2f %(1.364)则结果是1.36,但是前面有6个空格;h代表保留h位小数;f为float类型,d为int类型,s为string类型

(e) 2.30000 2.34680

(f) Time left 01:37.37  %02d%(1)表示1这个整数,但是这个整数占两个字符,并且前面用0来填充

(g)报错。原因:%d代表输入的是整数,而”14”是个字符串,故报错

翻译:解释为什么公钥加密对于保护Internet上的通信比私有(共享)密钥加密更有用。

解:公钥是可以公开发送给对方的,而密钥,不能公开传送,所以要用公钥加密,这样,只有有私钥的人才能打开取出来。

翻译:某位CS教授给出了5分测验,这些测验按照5-A,4-B,3-C,2-D,1-F,0-F等级进行评分。编写一个接受测验分数作为输入的程序 并打印出相应的等级。

(感觉这个题出错了,应该是1-E,0-F;注意python没有||和&&运算符,有and和or)

解:score=input("输入分数: ")

if((score==0)or(score==1)):

    print "F"

elif(score==2):

    print "D"

elif(score==3):

    print "C"

elif(score==4):

    print "B"

elif(score==5):

    print "A"

翻译:某位CS教授给出了100分的考试,分数为90-100:A,80-89:B,70-79:C,60-69:D,<60:F。 编写一个接受考试成绩作为输入的程序,并打印出相应的成绩。

解:score=input("输入分数:")

if((score>=90)and(score<=100)):

    print "A"

elif((score>=80)and(score<=89)):

    print "B"

elif((score>=70)and(score<=79)):

    print "C"

elif((score>=60)and(score<=69)):

    print "D"

elif(score<60):

    print "F"

print score

翻译:首字母缩略词是通过将短语中的单词的第一个字母取出并从中制作单词而形成的单词。 例如,RAM是“随机存取存储器”的首字母缩写。编写一个程序,允许用户键入短语并输出该短语的首字母缩写词。 注意:首字母缩略词应全部为大写,即使短语中的单词未大写。

解:法一:string=raw_input("请输入短语:")

#将短语的每个单词首字母变大写

string1=capwords(string)

#定义一个空字符串用来存放输出结果

string2=""

#遍历短语的每个单词

for ch in split(string1):

    #取每个单词的第一个字母

    string2+=ch[0]

print string2   

法二:string=raw_input("请输入短语:")

string1=capwords(string)

string2=""

arr=split(string1)

for i in range(len(arr)):

    string2=string2+arr[i][0]

print string2

(明显地,法一简单)

翻译:数字学家声称能够根据名称的“数值”确定一个人的性格特征。 名称的值是通过总结名称字母的值来确定的,其中'a'是1,'b'是2,'c'是3等,直到'z'是26。例如, 名字“Zelle”的价值为26+5+12+12+5=60(顺便说一下,这个数字恰好是一个非常吉利的数字)。 编写一个程序,计算作为输入提供的单个名称的数值。

ASCII码中: "A"==65; "Z"==90; "a"==97;"z"==122;

解:name=raw_input("请输入你的名字:")

#将名字的字母全变为小写

name1=lower(name)

#定义一个加分器

ans=0

#遍历名字中所有的字母

for ch in name1:

    #score为每个字母的分数,由于ASCII码中"a"为97,故减去96

    score=ord(ch)-96

    ans+=score

print ("哎呦,不错哦,你名字的分数竟然是%d" % (ans))

翻译:将解决方案扩展到上一个问题,以允许计算完整的名称,例如“John Marvin Zelle”或“John Jacob Jingleheimer Smith。”总值只是每个名称的数值之和。

(这个题和上一道的区别:先将名字split,然后每个单词按照上一道题的方法去解就行,只需要加一个for循环就行)

解:name=raw_input("请输入你的名字:")

#将名字的字母全变为小写

name1=lower(name)

#定义一个加分器

ans=0

#遍历名字中所有的单词

for chs in split(name1):

    #遍历单词中所有的字母

    for ch in chs:

        #score为每个字母的分数,由于ASCII码中"a"为97,故减去96

        score=ord(ch)-96

        ans+=score

print ("哎呦,不错哦,你名字的分数竟然是%d" % (ans))

翻译:凯撒密码是一种简单的替换密码,它基于将明文消息的每个字母移动到字母表中位置的固定数字(称为密钥)的想法。 例如,如果键值为2,则单词“Sourpuss”将被编码为“Uqwtrwuu”。原始消息可以通过使用键的否定来“重新编码”它来恢复。

编写一个可以编码和解码凯撒密码的程序。 程序的输入将是一串明文和密钥的值。 输出将是一个编码消息,其中原始消息中的每个字符都被替换为在ASCII字符集中移动它们的关键字符。 例如,如果ch是字符串中的字符而key是要移位的数量,那么替换ch的字符可以计算为:chr(ord(ch)+ key)。

解: string=raw_input("输入字符串:")

key=input("输入密匙:")

string1=""

for ch in string:

    string1+=chr(ord(ch)+key)

print string1

翻译:上一个练习的一个问题是它没有处理当我们“掉落”字母表(或ASCII编码)时的情况。 真正的凯撒密码以圆形方式进行移位,其中“z”之后的下一个字符是“a”。 将解决方案修改为上一个问题,使其成为循环。 您可以假设输入仅包含字母和空格。

解:string=raw_input("输入字符串:")

key=input("输入密匙:")

string1=""

for ch in string:

    value=ord(ch)+key

    if(value>122):

        value=value-26

    string1+=chr(value)

print string1

翻译:编写一个程序,计算用户输入的句子中的单词数。

解:sentence=raw_input("输入句子:")

number=len(split(sentence))

print number

翻译:编写一个程序,计算用户输入的句子中的平均单词长度。

解:sentence=raw_input("输入句子:")

#number为单词数

number=len(split(sentence))

#length为句子的总字母数

length=0

for word in split(sentence):

    #将每个单词的字母数加到length里面

    length+=len(word)

#aveLen为总字母数除以单词数

aveLen=length/number

print aveLen

翻译:从第1章开始编写Chaos程序的改进版本,允许用户输入两个初始值和迭代次数,然后打印一个格式良好的表,显示值如何随时间变化。 例如,如果起始值为.25和.26,迭代次数为10次,则表格可能如下所示:

解:看不懂啥意思,pass

  翻译:在第2章中编写未来价值计划的改进版本。您的计划将提示用户投资金额,年化利率和投资年数。 然后,该程序将输出格式良好的表格,该表格逐年跟踪投资的价值。 您的输出可能如下所示:

解:看不懂啥意思,pass

翻译:重做任何以前的编程问题,使它们面向批处理(使用文本文件进行输入和输出)

解:pass

翻译:字数。 Unix / Linux系统上的一个常见实用程序是一个名为“wc”的小程序。该程序分析文件以确定其中包含的行数,字数和字符数。 编写自己的wc版本。 程序应接受文件名作为输入,然后打印三个数字,显示文件中的行数,单词和字符。

解:fName=raw_input("请输入文件名:")

infile=open(fName,"r")

# 行数

lineNum=0

# 单词数

wordNum=0

# 字符数

chrNum=0

# 遍历文件的全部行

for line in infile.readlines():

    #python不支持++和--操作,只有+=和+-

    # 行数加1

    lineNum+=1

    # 遍历每行的每个单词

    for word in split(line):

        # 由于文件中通过空格分割后的并不是真的单词,那就通过它的首个字符是不是字母来判断是不是单词,若是,单词数加一

        if(((word[0]>="A")and(word[0]<="Z"))or((word[0]>="a")and(word[0]<="z"))):

            wordNum+=1

#字符数为读取整个文件,整个文件读取后是一个string类型,所以可直接获取它的长度。

# 这个时候为什么不用infile.read(),因为上面已经把这个文件读了一遍,再读就是接着上面的读,即是空的,所以要重新再读一遍

chrNum=len(open(fName,"r").read())

print("该文本一共有%d行" %lineNum)

print("该文本一共有%d单词" %wordNum)

print("该文本一共有%d字符" %chrNum)

总结

open(fname,"r")以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

open(fname,"w")打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

open(fname,"a")打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

read()方法读取的是整个文本,返回类型为string

readline()方法从字面意思可以看出,该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。

readlines()方法读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。

#读操作有read、readline和readlines函数;写操作有write、writelines,切记没有writeline

file.write(str)的参数是一个字符串,就是你要写入文件的内容.

  file.writelines(sequence)的参数是序列,比如列表,它会迭代帮你写入文件

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值