IPO Input:温度 Process:处理 Output:输出
C=(F-32)/1.8 F=C*1.8+32 这是核心
判断是C还是F,注意大小写 if str[-1] in ['F','f'] or if str[-1] in ['C','c']
这是我自己编写的:
TempStr=input('input the degree with F or C:')
if TempStr[-1] in ['F','f']:
C=(eval(TempStr[0:-1])-32)/1.8
print('after converting,the temperature is %d C',C)
if TempStr[-1] in ['C','c']:
F=eval(TempStr[0:-1])*1.8+32
print('after converting,the temperature is %d F',F)
这是运行的结果:
input the degree with F or C: 32F
Traceback (most recent call last):
after converting,the temperature is %d C 0.0
File "F:/flupytr/degree change.py", line 7, in
print('after converting,the temperature is %d F',F)
NameError: name 'F' is not defined
原来,print语句应该缩进,作为if条件判断后的内部语句,改正后
input the degree with F or C:32.88F
after converting,the temperature is %d C 0.4888888888888903
Process finished with exit code 0
发现输入32.88F,转换为摄氏度后,小数点太多,参照MOOC教案,改为如下:
print('after converting,the temperature is {:.2f}C'.format(C))
运行结果如下:
input the degree with F or C:88.88F
after converting,the temperature is %d C 31.599999999999998
after converting,the temperature is 31.60C
检查代码发现,如果输入格式不规范,会出现什么情况呢?
input the degree with F or C:32BB
Process finished with exit code 0
程序没有任何提示,所以应该再加个else语句,用以说明输入的格式不正确,代码如下:
TempStr=input('input the degree with F or C:')
if TempStr[-1] in ['F','f']:
C=(eval(TempStr[0:-1])-32)/1.8
print('after converting,the temperature is %d C',C)
print('after converting,the temperature is {:.2f}C'.format(C))
if TempStr[-1] in ['C','c']:
F=eval(TempStr[0:-1])*1.8+32
print('after converting,the temperature is %d F',F)
print('after converting,the temperature is {:.2f}F'.format(F))
else:
print('input error')
运行:
input the degree with F or C:188F
after converting,the temperature is %d C 86.66666666666667
after converting,the temperature is 86.67C
input error
发现多了一个 input error。 对照原代码,发现第二个if应为elif,不然在判断第一个if语句后又会判断第二个if语句,从而执行else的语句
现在,对MOOC提供的原码中,自己感到不熟的重要分析。一是eva()函数,二是%d 和{:.2}f
eval()为python内置函数
eval() 函数用来执行一个字符串表达式,并返回表达式的值。
http://www.cnblogs.com/dadadechengzi/p/6149930.html这篇博客讲得很全,我提出了自己的疑惑:
print locals()["x"]
print locals()["y"]
print globals()["x"]
print globals()["y"]
结果竟然全是1,不太理解
什么是内置 名字空间
第三点是eval的安全性问题
eval(expression, globals=None, locals=None) --- 官方文档中的解释是,将字符串str当成有效的表达式来求值并返回计算结果。globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。
python是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值。
当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
1)局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。
2)全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。
python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。我们可以用print (locals())来查看该函数体内的所有变量名和变量值。
第二个问题:{:2.f}F .format(F) %d
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的 % 。
https://www.cnblogs.com/wushuaishuai/p/7687728.html这篇文章有很好的解读
在课程中,老师讲到 {}表示槽,后续变量填充到槽中。{:.2f}表示将format()中的变量填充到这个位置时取小数点后2位
%d是格式化整数的,但是在这个实例中,也能输出小数了。。。仔细观看程序运行结果,发现自己犯了个低级错误,%d的用法如下:
print ("He is %d years old"%(25))
后面也有要%,而且前面不要画蛇添足,如我所写
print('after converting,the temperature is %d C',C)
应为
print('after converting,the temperature is %d'%C) 注意没有那个逗号
整体代码如下:
TempStr=input('input the degree with F or C:')
if TempStr[-1] in ['F','f']:
C=(eval(TempStr[0:-1])-32)/1.8
print('after converting,the temperature is %d C',C)
print('after converting,the temperature is %d'%C)#这才是正确的格式用法
print('after converting,the temperature is {:.2f}C'.format(C))
elif TempStr[-1] in ['C','c']:
F=eval(TempStr[0:-1])*1.8+32
print('after converting,the temperature is %d F',F)
print('after converting,the temperature is %d'%F)
print('after converting,the temperature is {:.2f}F'.format(F))
else:
print('input error')
总结:
别看程序简单,充分暴露了自己的基本功不扎实,不参考源码的话出现这么多bug
这次总共有以下知识点:
1.eval()函数
2.str[]的用法
3.{}.format()的用法
4.%d等的用法
5.if语句