python学习笔记之运算符

  • 目录
  • 前言
  • 软件环境
  • 身份运算符
  • 算术运算符
  • 比较运算符
  • 位移运算符
  • 自变运算符
  • 位运算符
  • 逻辑运算符
  • 成员关系运算符
  • 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,例如:

 1 In [25]: name1 = {'fan':'jmilk'}
 2 
 3 In [26]: name2 = name1.copy()
 4 
 5 In [27]: name1 == name2
 6 Out[27]: True
 7 
 8 In [28]: name1 is name2
 9 Out[28]: False
10 
11 In [29]: id(name1),id(name2)
12 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才会默认使用精确除法。当导入了精确除后,若想再使用截断除,可以使用取整除’//’,同时也被成为地板除。

 1 In [92]: %%file testFloat.py
 2 from __future__ import division
 3 a = 1
 4 b = 2
 5 print a/b
 6    ....: print a//b
 7    ....: 
 8 Overwriting testFloat.py
 9 
10 In [93]: run testFloat.py
11 0.5
12 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 << n ⇒ a*(2**n)

>>

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

自变运算符

自变运算符可以减少一定的代码量,更重要的是,使用自变运算符可以加快Python程序在内存中的执行效率。 值得注意的是:Python出于避免语法歧义的初衷,在Python语法中并没有自增 i++ 或者 ++i的语法, ++i 只作用于数学运算操作符,如:

 1 In [18]: i = 1
 2 
 3 In [19]: ++i
 4 Out[19]: 1
 5 
 6 In [20]: +-i
 7 Out[20]: -1
 8 
 9 In [21]: --i
10 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

最后

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Go语言中的Array、Slice、Map和Set使用详解

Array(数组) 内部机制 在 Go 语言中数组是固定长度的数据类型,它包含相同类型的连续的元素,这些元素可以是内建类型,像数字和字符串,也可以是结构类型,元...

33780
来自专栏C/C++基础

多字节与宽字符串的相互转换

说到多字节字符串与宽字符串,不得不说一下多字节字符与宽字符。多字节字符实际上是由多个字节来表示一个字符,在各个国家和地区采用不同的编码方案,不同编码方案字符码值...

17420
来自专栏从流域到海域

《笨办法学Python》 第38课手记

《笨办法学Python》 第38课手记 注意这是第三版的《笨办法学Python》的内容,我后来发现第三版存在很大的问题,就放弃了第三版开始使用第四版,第四版的第...

35780
来自专栏Play & Scala 技术分享

你真的了解Java中的负数?

526120
来自专栏SeanCheney的专栏

《利用Python进行数据分析·第2版》第3章 Python的数据结构、函数和文件3.1 数据结构和序列3.2 函数3.3 文件和操作系统3.4 结论

本章讨论Python的内置功能,这些功能本书会用到很多。虽然扩展库,比如pandas和Numpy,使处理大数据集很方便,但它们是和Python的内置数据处理工具...

47960
来自专栏程序员互动联盟

【编程基础】C++比C牛逼的七个点

1. 函数检测增强 ? 在C语言中,重复定义多个同名的全局变量是合法的,在C++中,不允许定义多个同名的全局变量。 C语言中多个同名的全局变量最终会被链接到全局...

36050
来自专栏codingforever

经典算法巡礼(一) -- 排序之冒泡排序

事实上,她重复地遍历需要排序的元素,一次比较相邻的两个元素,如果不满足预先定义的比较条件,则交换;否则继续下一组元素比较,直至遍历完成需要排序的所有元素。当然,...

4020
来自专栏代码世界

Python基础数据类型之int、bool、str

数据类型:int  bool  str  list  元祖  dict  集合 int:整数型,用于各种数学运算。 bool:只有两种,True和False,用...

34660
来自专栏marsggbo

c++学习笔记之继承篇

一 继承方式 public ? protected ? private ? 二 多继承和多重继承 举个例子就明白了 多继承 :农民工就算是多继承。 graph...

24250
来自专栏一枝花算不算浪漫

[C#基础]基础知识一: 面向对象的基本知识.

437170

扫码关注云+社区

领取腾讯云代金券