慕客学习Python温度转换 format 格式化字符串 eval函数 关于string if语句

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语句

 

你可能感兴趣的:(python,training)