Python基本语法之运算符功能与用法详解


Posted in Python onOctober 22, 2019

本文实例讲述了Python基本语法之运算符功能与用法。分享给大家供大家参考,具体如下:

前言

在前面的博文介绍了Python的数据结构之后,接下来结合Python操作符来对Python程序中的数据进行处理。操作符/运算符的使用,可简洁地表示内建类型的对象处理。主要是对程序中的数据进行逻辑操作、算术操作、比较操作等动作行为,本质是将在程序中会非常常用的程序操作封装成成类或函数后,再以字符的形式调用,使执行程序语言更加简洁和符合国际化。

软件环境

  • 操作系统
    • UbuntuKylin 14.04
  • 软件
    • Python 2.7.6
    • IPython 4.0.0

身份运算符

身份运算符用来判断两个变量的引用对象是否指向同一个内存对象,即id(varibale1) ?= id(variable2)。
is:判断两个标识符是不是引用自一个对象
is not:判断两个标识符是不是引用自不同对象
需要注意的是: 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]: name1 is name2
Out[28]: False
In [29]: id(name1),id(name2)
Out[29]: (140197805793640, 140197805796720)

上述例子,name2是name1调用copy( )函数后返回的一个新的对象,所以两者的id( )不相等,而两个变量在内存和中的vale却是相等的。

算术运算符

Operator Description
+\- 加\减,其中'+'可以重载为连接符,连接两个字符或字符串
*\** 乘\求平,其中*可以重载为重复
/\%\// 除\求余\取整除,其中%可以重载为格式化,取整除返回商的整数部分

**注:**Python除法需要注意的方面(Python 2.x版本,3.x版本不存在此问题)

1.Python中int型的数值相除,只能得到int型不会返回小数。若返回值需要精确到小数时,有两种方法。

方法一:除数或被除数需要有一者为float型数值。

In [75]: float(1)/2
Out[75]: 0.5

方法二:import未来支持的语言特征division(精确除法)

Python的'/'除法默认使用截断除(Truncating Division),导入division模块后,Python才会默认使用精确除法。当导入了精确除后,若想再使用截断除,可以使用取整除'//',同时也被成为地板除。

In [92]: %%file testFloat.py
from __future__ import division
a = 1
b = 2
print a/b
  ....: print a//b
  ....:
Overwriting testFloat.py
In [93]: run testFloat.py
0.5
0

随便介绍两个内建函数round(number[, ndigits])、divmod(x, y)

round(x[,n]):给定一个浮点数x,并按照指定精度返回一个浮点数对象,官方文档如下:

In [109]: round.__doc__
Out[109]: 'round(number[, ndigits]) -> floating point number\n\nRound a number to a given precision in decimal digits (default 0 digits).\nThis always returns a floating point number. Precision may be negative.'

例子:

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\nReturn the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.'

例子:

In [133]: divmod(7,5)
Out[133]: (1, 2)

比较运算符

Operator Description
> 大于
小于
>= 大于等于
小于等于
== 等于,比较两个对象的value是否相等,相等为True
!= 不等于,比较两个对象的value是否不相等,不相等为True
不等于,同!= 运算符

位移运算符

位移运算符是非常有效率的计算方法之一,在对数学运算和对程序执行效率要求高的程序中推荐使用。除了位移运算符之外,Python的按位运算符也是非常有效率的一种数据处理方法,之后会详细的介绍。

Operator Description
a
>> a >> n ⇒ a/(2**n)

自变运算符

自变运算符可以减少一定的代码量,更重要的是,使用自变运算符可以加快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的原码:0000 0001 , 补码: 0000 0001 (二进制的首个数字代表符号,不可以改变)
-1的原码:1000 0001 , 补码:1111 1111

In [67]: -1 & 1
Out[67]: 1

即:

1111 1111
0000 0001
—————
0000 0001

其结果原码为 0000 0001(正数的补码就是原码本身)

In [68]: -1 | 1
Out[68]: -1

即:

1111 1111
0000 0001
—————
1111 1111

其结果原码为1000 0001(负数的原码为补码减一再按位取反,首个数字代表符号不可以改变)

所以,从数字计算的底层实现可以看出。位移运算符是计算效率非常高的一种计算方法,尤其可以避免类似执行乘法时,所带来的非常繁复的操作和实现过程。

逻辑运算符

Operator Description
and 逻辑与
or 逻辑或
not 逻辑非

在Python只能够将and、or、not三种运算符用作于逻辑运算,而不像C、Java等编程语言中可以使用&、|、!,更加不能使用简单逻辑于&&、简单逻辑或||等逻辑运算符。由此可见,Python始终坚持着“只用一种最好的方法,来解决一个问题”的设计理念。

成员关系运算符

成员运算符能够判断一个指定对象是否是作为一个容器中的元素,由此来判断两个对象间的关系。
容器:包含了其他对象的引用的数据类型。

Operator Description
in 当一个对象存在一个容器中时为Ture
not in 当一个对象不在一个容器中时为True
In [72]: 1 in list
Out[72]: True
In [73]: 4 in list
Out[73]: False
In [74]: 4 not in list
Out[74]: True
In [75]: 1 not in list
Out[75]: False

Python真值表

Object Constant Value
“” False
“Str” True
0 False
1 True
()空元组 False
[]空列表 False
{}空字典 False
None False

最后

运算符在程序中一直都充当着非常重要的角色,可能是编程的过程中并不会完全用的上,但是建立一个由自己编写起来的运算符文档,在往后的程序编写中会变得非常的方便。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
flask中使用SQLAlchemy进行辅助开发的代码
Feb 10 Python
使用Python中的greenlet包实现并发编程的入门教程
Apr 16 Python
python使用range函数计算一组数和的方法
May 07 Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 Python
python实现数据库跨服务器迁移
Apr 12 Python
Django实现网页分页功能
Oct 31 Python
使用python动态生成波形曲线的实现
Dec 04 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
python开发入门——set的使用
Sep 03 Python
分享提高 Python 代码的可读性的技巧
Mar 03 Python
关于Python中进度条的六个实用技巧分享
Apr 05 Python
Python获取字典中某个key的value
Apr 13 Python
基于Python实现拆分和合并GIF动态图
Oct 22 #Python
python  logging日志打印过程解析
Oct 22 #Python
安装2019Pycharm最新版本的教程详解
Oct 22 #Python
Python列表list常用内建函数实例小结
Oct 22 #Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 #Python
Python异常模块traceback用法实例分析
Oct 22 #Python
Python多线程爬取豆瓣影评API接口
Oct 22 #Python
You might like
php 图片上添加透明度渐变的效果
2009/06/29 PHP
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
jquery实现图片左右间隔滚动特效(可自动播放)
2013/05/08 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
Ztree新增角色和编辑角色回显问题的解决
2016/10/25 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
详解使用vue脚手架工具搭建vue-webpack项目
2017/05/10 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
JS打印彩色菱形的实例代码
2018/08/15 Javascript
JS实现的简单分页功能示例
2018/08/23 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
JavaScript中import用法总结
2019/01/20 Javascript
js中let能否完全替代IIFE
2019/06/15 Javascript
package.json中homepage属性的作用详解
2020/03/11 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
python爬虫实战之爬取京东商城实例教程
2017/04/24 Python
python迭代dict的key和value的方法
2018/07/06 Python
78行Python代码实现现微信撤回消息功能
2018/07/26 Python
python使用tornado实现登录和登出
2018/07/28 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
2019/02/18 Python
python简单实现AES加密和解密
2019/03/28 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
旅游管理毕业生自荐书
2014/02/02 职场文书
党员批评与自我批评
2014/02/12 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
地球一小时宣传标语
2014/06/24 职场文书
postgreSQL数据库基础知识介绍
2022/04/12 PostgreSQL