【作业题01】
rec=int(input()) if rec==0: print("Hello World") elif rec>0: print('He\nll\no \nWo\nrl\nd\n') elif rec<0: print('H\ne\nl\nl\no\n \nW\no\nr\nl\nd\n')
【作业题02】
写这题的时候遇到很多问题。先介绍一下我自己原本的思路。
首先我想到的是要从输入的字符串中分别识别出参与运算的数字和运算符。
因为参与运算的算式数字的个数和位置不确定,并且包含有数量和位置不确定的空格。
首先我想到的是,先去除输入字符串中的空格。
采用【replace】函数:
replace函数是字符串类型拥有的方法(即它需要一个字符串对象进行调用)
该方法有两个传入参数string.replace("a","b")---->将string中的a字符用字符b替代。
此时字符串中只剩下参与运算的数字和运算符。所以我根据运算符类型将字符串分类(分支语句),并且根据运算符将字符串进行分隔。从而得到参与运算的两个数以及运算类型。
需要用到关键字【in】以及函数【split】
if "+" in rec: li=rec.split('+',1) a=int(li[0])+int(li[1]) print("{:.2f}".format(a)) elif "-" in rec: li=rec.split('-',1) a=int(li[0])-int(li[1]) print("{:.2f}".format(a)) elif "*" in rec: li=rec.split('*',1) a=int(li[0])*int(li[1]) print("{:.2f}".format(a)) elif "/" in rec: li=rec.split('/',1) a=int(li[0])/int(li[1]) print("{:.2f}".format(a))
但是运行结果不尽人意主要是由于:当负数参与运算时,可能会被分类至减法运算中。此时,不光是运算类型错误,split函数也会错误地拆分原字符串(会在负号而非减号时就拆分字符串)
目前我不知道如何解决这个问题。(按照这一思路执行下去地话)
本题老师的参考答案为
s = input() print("{:.2f}".format(eval(s)))
只有两行代码!
用s接收传入字符串,用eval函数去掉字符串最外层的引号,并且执行内部语句。
从这里学到几点
- 语句中的空格并不影响语句的执行 10+11 与 10 + 11没有区别(但是1 1+10就不行,每个int变量内部不能有空格)
- 我们不能够掌握不知道的东西。好的工具可以提高效率。之前我不知道要用eval方法所以要解决更加复杂的问题。
- 要灵活运用知识。其实老师上课的时候有提到过【eval】函数,但是因为不熟悉,加上思维惯性上来就想到的是字符串的识别而不是执行运算语句。
【练习题03】
这题我的思路是识别字符串,根据每个字符的类型转入不同的分支语句。再用一个【list】列表接收转换后的数据。由于list在打印时会附带[ ]及, ([1,2,3])
可以采用replace函数去除以上符号。也可以用一个空的字符串调用join函数,将空值插入列表的每个元素之间。
list01=[]
for a in rec :
if a=="0":
list01.append("零")
elif a=="1":
list01.append("一")
elif a=="2":
list01.append("二")
elif a=="3":
list01.append("三")
elif a=="4":
list01.append("四")
elif a=="5":
list01.append("五")
elif a=="6":
list01.append("六")
elif a=="7":
list01.append("七")
elif a=="8":
list01.append("八")
elif a=="9":
list01.append("九")
print("".join(list01))
但是因为写练习的时候运行出了正确结果我就没有查看老师的标准答案。其实这个题标准答案也是采用了eval函数。如果当时看了答案,作业题02应该会写的。
template = "零一二三四五六七八九" s = input() for c in s: print(template[eval(c)], end="")
这里应使用了索引(真的很巧妙,可能很入门级,但是对于我而言真的觉得很巧妙)
我们将零一二三四五六七八九看作一个序列(字符串本身就可以由string[i]来指向字符串的每一个字符),然后输入的阿拉伯数字刚好作为数组的序号i。
但是也有与我的代码相同的部分,就是采用了【for】循环遍历字符串。
这里的for循环和java里的好像不是很相似。(因为python的每个变量不用声明,还是暂时有一些不习惯)
这里的意思是,遍历字符串s,在每一次的循环中,用c指向正在遍历到的单个字符(注意这里单个字符还是字符串类型,每个字符都有引号)
对该字符用eval函数去掉引号,作为template的序号。end=""表示每个输出之间没有间隔。