Python基本语法之运算符功能与用法详解
本文实例讲述了Python基本语法之运算符功能与用法。分享给大家供大家参考,具体如下:
前言
在前面的博文介绍了Python的数据结构之后,接下来结合Python操作符来对Python程序中的数据进行处理。操作符/运算符的使用,可简洁地表示内建类型的对象处理。主要是对程序中的数据进行逻辑操作、算术操作、比较操作等动作行为,本质是将在程序中会非常常用的程序操作封装成成类或函数后,再以字符的形式调用,使执行程序语言更加简洁和符合国际化。
软件环境
- 操作系统
- UbuntuKylin14.04
- 软件
- Python2.7.6
- IPython4.0.0
身份运算符
身份运算符用来判断两个变量的引用对象是否指向同一个内存对象,即id(varibale1)?=id(variable2)。
is:判断两个标识符是不是引用自一个对象
isnot:判断两个标识符是不是引用自不同对象
需要注意的是:is和==的意义并不相同。
In[11]:[]==[] Out[11]:True In[12]:[]is[] Out[12]:False
概括性而言,is是判断两个变量是否引用同一个对象,而==则是判断两个变量引用的对象的值是否一致。要很好的理解两者间的区别需要从Python对象的三要素说起。
Python对象的三要素:id、type、value
- id:是对象的唯一标识,是对象在内存中的存储地址。
- type:是对象的数据类型
- value:是对象的值,是对象在内存中存放的数据。
其中is的判断依据是对象的id,==的判断依据是对象value,例如:
In[25]:name1={'fan':'jmilk'} In[26]:name2=name1.copy() In[27]:name1==name2 Out[27]:True In[28]:name1isname2 Out[28]:False In[29]:id(name1),id(name2) Out[29]:(140197805793640,140197805796720)
上述例子,name2是name1调用copy()函数后返回的一个新的对象,所以两者的id()不相等,而两个变量在内存和中的vale却是相等的。
算术运算符
**注:**Python除法需要注意的方面(Python2.x版本,3.x版本不存在此问题)
1.Python中int型的数值相除,只能得到int型不会返回小数。若返回值需要精确到小数时,有两种方法。
方法一:除数或被除数需要有一者为float型数值。
In[75]:float(1)/2 Out[75]:0.5
方法二:import未来支持的语言特征division(精确除法)
Python的'/'除法默认使用截断除(TruncatingDivision),导入division模块后,Python才会默认使用精确除法。当导入了精确除后,若想再使用截断除,可以使用取整除'//',同时也被成为地板除。
In[92]:%%filetestFloat.py from__future__importdivision a=1 b=2 printa/b ....:printa//b ....: OverwritingtestFloat.py In[93]:runtestFloat.py 0.5 0
随便介绍两个内建函数round(number[,ndigits])、divmod(x,y)
round(x[,n]):给定一个浮点数x,并按照指定精度返回一个浮点数对象,官方文档如下:
In[109]:round.__doc__ Out[109]:'round(number[,ndigits])->floatingpointnumber\n\nRoundanumbertoagivenprecisionindecimaldigits(default0digits).\nThisalwaysreturnsafloatingpointnumber.Precisionmaybenegative.'
例子:
In[124]:round(1.11111111111,5) Out[124]:1.11111
除了使用这种方法获取指定精度的浮点数外,还可以使用%格式化来输出指定精度的浮雕数。
In[125]:a=1.1111111111 In[126]:print'%.5f'%a 1.11111
%格式化可以非常灵活的得到满足需求的输出数据的格式,以后我们会继续了解。
divmod(x,y):计算x,y的取整除和余数,并以元组类型返回。官方文档:
In[131]:divmod.__doc__ Out[131]:'divmod(x,y)->(quotient,remainder)\n\nReturnthetuple((x-x%y)/y,x%y).Invariant:div*y+mod==x.'
例子:
In[133]:divmod(7,5) Out[133]:(1,2)
比较运算符
位移运算符
位移运算符是非常有效率的计算方法之一,在对数学运算和对程序执行效率要求高的程序中推荐使用。除了位移运算符之外,Python的按位运算符也是非常有效率的一种数据处理方法,之后会详细的介绍。
自变运算符
自变运算符可以减少一定的代码量,更重要的是,使用自变运算符可以加快Python程序在内存中的执行效率。
值得注意的是:Python出于避免语法歧义的初衷,在Python语法中并没有自增i++或者++i的语法,++i只作用于数学运算操作符,如:
In[18]:i=1 In[19]:++i Out[19]:1 In[20]:+-i Out[20]:-1 In[21]:--i Out[21]:1
Operator
Description
+=
a+=b⇒a=a+b
-=
a-=b⇒a=a-b
*=
a*=b⇒a=a*b
/=
a/=b⇒a=a/b
%=
a%=b⇒a=a%b
**=
a**=b⇒a=a**b
//=
a//=b⇒a=a//b
顺便来比较一下i=i+1、i+=1、i++三者间执行效率的高低(对一般编程语言而言)。
最低i=i+1
(1).读取右i的地址
(2).i+1
(3).读取左i的地址
(4).将右i+1传递给左i,编译器认为左右两个i是不一致的。
其次i+=1
(1).读取左i的地址
(2).i+1
(3).将i+1传递给i自身,编译器会认为只有同一个i
最高i++
(1).读取i的地址
(2).自增1
注意:在考虑到提升程序运行效率的同时,也要注意在使用i+=1的时候可以会莫名其妙的出现语法错误,这种时候可以考虑是否为数据类型的类型隐式转换错误。
以上的比较只是针对一般的编程语言而言,在Python中因为存在可变对象和非可变对象,而且不存在i++自增语言。但是使用自变运算符,的确可以有效的减少代码量和使程序更加简洁。
位运算符
Operator
Description
x|y
按位或(有1则1)
x&y
按位与(有0则0)
x^y
位异或(不同为1,相同为0)
~x
取反
在Python中|、&等运算符的意义不在于处理逻辑关系,而是二进制数据的位运算,数字以二进制形式的补码存储和计算,以原码结果来显示。若数字为正值,他的补码就是原码本身。若数字为负值,则他的补码为源码减一再按位取反。两个数字的计算本质是两个二进制补码的计算。
数字计算的实现原理:
1的原码:00000001,补码:00000001(二进制的首个数字代表符号,不可以改变)
-1的原码:10000001,补码:11111111
In[67]:-1&1 Out[67]:1
即:
11111111
00000001
—————
00000001
其结果原码为00000001(正数的补码就是原码本身)
In[68]:-1|1 Out[68]:-1
即:
11111111
00000001
—————
11111111
其结果原码为10000001(负数的原码为补码减一再按位取反,首个数字代表符号不可以改变)
所以,从数字计算的底层实现可以看出。位移运算符是计算效率非常高的一种计算方法,尤其可以避免类似执行乘法时,所带来的非常繁复的操作和实现过程。
逻辑运算符
Operator
Description
and
逻辑与
or
逻辑或
not
逻辑非
在Python只能够将and、or、not三种运算符用作于逻辑运算,而不像C、Java等编程语言中可以使用&、|、!,更加不能使用简单逻辑于&&、简单逻辑或||等逻辑运算符。由此可见,Python始终坚持着“只用一种最好的方法,来解决一个问题”的设计理念。
成员关系运算符
成员运算符能够判断一个指定对象是否是作为一个容器中的元素,由此来判断两个对象间的关系。
容器:包含了其他对象的引用的数据类型。
In[72]:1inlist Out[72]:True In[73]:4inlist Out[73]:False In[74]:4notinlist Out[74]:True In[75]:1notinlist Out[75]:False
Python真值表
最后
运算符在程序中一直都充当着非常重要的角色,可能是编程的过程中并不会完全用的上,但是建立一个由自己编写起来的运算符文档,在往后的程序编写中会变得非常的方便。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。