Python学习笔记整理3之输入输出、python eval函数


Posted in Python onDecember 14, 2015

1. python中的变量:

python中的变量声明不需要像C++、Java那样指定变量数据类型(int、float等),因为python会自动地根据赋给变量的值确定其类型。如 radius = 20,area = radius * radius * 3.14159 ,python会自动的将radius看成“整型”,area看成“浮点型”。所以编程时不用再像之前那样小心翼翼的查看数据类型有没有出错,挺人性化的。

2. input和print:

先贴个小的程序

# Prompt the user to enter three numbersnumber1 = eval(input("Enter the first number: "))number2 = eval(input("Enter the second number: "))number3 = eval(input("Enter the third number: "))# Compute averageaverage = (number1 + number2 + /      number3) / 3#Display resultprint("The average of ", number1, number2, number3,  
 "is", average)

小程序中的几个知识点:

1)print的格式,print(itme1, item2, ..., itemk),如果print的内容过长,可以直接换行;
2)'/'符号,它是用来连接两个行的,如果一行内容过长可以用该符号来分割;
3)input(" "),获得输入数据,要注意的是,python2.x版本中有两个输入函数input()和raw_input(),input()输入实数时,它的值就是实数;而raw_input()不管输入的是什么,它的值都是string,所以需要用eval()函数将值转换为实数,eval()下面再深入学习;而在python3.x版本中只有一个输入函数input(),它的功能就相当于python2.x中的raw_input()函数,所以编程时要特别注意版本问题,像这样的差异还有许多。我的程序是在python3.2下解释的,如果在python2.x下,可以去掉eval()或者将input改成raw_input,结果一样。

3. eval()函数

上面的小程序中用到了eval()函数,功能是将string变成算术表达式来执行,比如eval("1+2")的结果是3。那么是不是它的功能就局限于此呢?
在这个基础上,我查了python官方文档关于eval函数的定义和解释。官网python3.4.1文档中关于eval的定义如下:
eval(expression, globals=None, locals=None)  --- 官方文档中的解释是,globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。

在继续往下之前,要先补充一点关于python命名空间的知识(引用自http://blog.sina.com.cn/s/blog_64668ff00100od2b.html),python是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值。

在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间。每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变 量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间, 任何模块均可访问它,它存放着内置的函数和异常。

当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:

1)局部名字空间 - 特指当前函数或类的方法。如果函数定义了一个局部变量 x, 或一个参数 x,Python 将使用它,然后停止搜索。

2)全局名字空间 - 特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。

3)内置名字空间 - 对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。

其实这并不难理解,说白了,就是c++中全局变量和局部变量的意思。比如你在一个函数中用了num这个变量,它首先会查找函数里,也就是局部名字空间是否有这个变量名;如果找不到,就会到函数外也就是全局名字空间中继续查找;如果再找不到,就会查找内置关键字;如果都找不到,那么就只有报NameError了。

理解了这一点,就比较容易了。python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。我们可以用print (locals())来查看该函数体内的所有变量名和变量值。继续eval()函数...

1)当后两个参数都为空时,很好理解,就是一个string类型的算术表达式,计算出结果即可。等价于eval(expression)。

2)当locals参数为空,globals参数不为空时,先查找globals参数中是否存在变量,并计算。

3)当两个参数都不为空时,先查找locals参数,再查找globals参数。

举一个小例子:

#test eval() and locals()x = 1y = 1num1 = eval("x+y")print (num1)def g():  
 x = 2  
 y = 2  
 num3 = eval("x+y") 
 print (num3)    
num2 = eval("x+y",globals())  
 # num2 = eval("x+y",globals(),locals()) 
 print (num2)g()

num1的值不用说,是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4。(PS:我的运行环境是python3.2)当然,也可以显式的定义dict对象作为eval()的参数,规则是一样的。

补充一下:locals()对象的值不能修改,globals()对象的值可以修改,写一个小程序测试一下。

#test globals() and locals()z=0def f(): 
z = 1  
print (locals())    
locals()["z"] = 2  
print (locals())  
f() globals()["z"] = 2print (z)

可以得出,两个print (locals())的结果是一样的,说明没有修改成功。而print (z)的值是2,说明修改成功了。另外,貌似locals()可以添加变量,感兴趣的可以试一下。

以上内容是小编给大家分享的Python学习笔记整理3之输入输出、python eval函数的全部叙述,希望大家喜欢。

Python 相关文章推荐
在Python的列表中利用remove()方法删除元素的教程
May 21 Python
python PIL模块与随机生成中文验证码
Feb 27 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
Python设计模式之中介模式简单示例
Jan 09 Python
全面分析Python的优点和缺点
Feb 07 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
keras获得某一层或者某层权重的输出实例
Jan 24 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 Python
使用jupyter notebook运行python和R的步骤
Aug 13 Python
Pandas之缺失数据的实现
Jan 06 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
Dec 14 #Python
分享Python字符串关键点
Dec 13 #Python
Python实时获取cmd的输出
Dec 13 #Python
一篇文章入门Python生态系统(Python新手入门指导)
Dec 11 #Python
深入源码解析Python中的对象与类型
Dec 11 #Python
Python实现各种排序算法的代码示例总结
Dec 11 #Python
Python操作MySQL数据库9个实用实例
Dec 11 #Python
You might like
php下安装配置fckeditor编辑器的方法
2011/03/02 PHP
php设计模式 Template (模板模式)
2011/06/26 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php简单获取文件扩展名的方法
2015/03/24 PHP
Yii 2.0自带的验证码使用经验分享
2017/06/19 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
动态样式类封装JS代码
2009/09/02 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
Extjs学习笔记之六 面版
2010/01/08 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
zTree 树插件实现全国五级地区点击后加载的示例
2018/02/05 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
用smtplib和email封装python发送邮件模块类分享
2014/02/17 Python
wxPython框架类和面板类的使用实例
2014/09/28 Python
django 修改server端口号的方法
2018/05/14 Python
Python中无限循环需要什么条件
2020/05/27 Python
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
清洁工表扬信
2014/01/08 职场文书
会计与审计专业自荐信范文
2014/03/15 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
担保书范本
2015/01/20 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
SQL SERVER触发器详解
2022/02/24 SQL Server
Redis过期数据是否会被立马删除
2022/07/23 Redis