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 相关文章推荐
python list 合并连接字符串的方法
Mar 09 Python
python开发之list操作实例分析
Feb 22 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
May 25 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
对python中UDP,socket的使用详解
Aug 22 Python
Django中提示消息messages的设置方式
Nov 15 Python
Python语法之精妙的十个知识点(装B语法)
Jan 18 Python
python 链接sqlserver 写接口实例
Mar 11 Python
详解查看Python解释器路径的两种方式
Oct 15 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 Python
Python内置数据类型中的集合详解
Mar 18 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/09/30 PHP
PHP以指定字段为索引返回数据库所取的数据数组
2013/06/30 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
bootstrap Validator 模态框、jsp、表单验证 Ajax提交功能
2017/02/17 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
vue-scroller记录滚动位置的示例代码
2018/01/17 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
微信公众号平台接口开发 获取微信服务器IP地址方法解析
2019/08/14 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
Vue3为什么这么快
2020/09/23 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
Fabric 应用案例
2016/08/28 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
python对文件的操作方法汇总
2020/02/28 Python
为女性购买传统的印度服装和婚纱:Kalkifashion
2019/07/22 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
“学雷锋活动月”总结
2014/03/09 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
JS封装cavans多种滤镜组件
2022/02/15 Javascript
Redis批量生成数据的实现
2022/06/05 Redis