目录

前言

在前面的博文介绍了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 << n ⇒ a*(2**n)
>> 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

最后

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

Jmilk

Python基本语法_运算符详解的更多相关文章

  1. Python基本语法_异常处理详解

    目录 目录 异常 异常类型 异常处理 触发异常raise 传递异常 assert语句触发异常 捕获异常tryexceptelse 捕捉多个异常 tryfinally语句 自定义异常 withas触发异 ...

  2. python基础语法_闭包详解

    https://www.cnblogs.com/Lin-Yi/p/7305364.html 闭包有啥用??!! 很多伙伴很糊涂,闭包有啥用啊??还这么难懂!  3.1装饰器!!!装饰器是做什么的??其 ...

  3. Python基本语法_输入/输出语句详解

    目录 目录 前言 输入 raw_input input raw_input 和 input 的区别 输出 print print 基本格式化输出 print复杂格式化输出 flags标志位 width ...

  4. Python基本语法_控制流语句_if/while/for

    目录 目录 前言 软件环境 If 语句 While循环 break continue for 循环 遍历String 遍历Tuple 遍历List 遍历Dictionary 最后 前言 控制流语句用于 ...

  5. Markdown语法说明(详解版)

    ####date: 2016-05-26 20:38:58 tags: Markdown tags && Syntax ##Markdown语法说明(详解版)杨帆发表于 2011-11 ...

  6. Python安装、配置图文详解(转载)

    Python安装.配置图文详解 目录: 一. Python简介 二. 安装python 1. 在windows下安装 2. 在Linux下安装 三. 在windows下配置python集成开发环境(I ...

  7. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  8. Python中格式化format()方法详解

    Python中格式化format()方法详解 Python中格式化输出字符串使用format()函数, 字符串即类, 可以使用方法; Python是完全面向对象的语言, 任何东西都是对象; 字符串的参 ...

  9. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

随机推荐

  1. 更改命令行,完全显示hostname

    刚装完一台新服务器,想让命令行的能显示全部的hostname,查阅资料后,将$PS1的参数修改即可 1,echo $PS1 2,将其中的/h换成/H即可 3,我是在/etc/profile中加了一行 ...

  2. C++ GB2312 和 utf8 在win32下 互转

    string ANSItoUTF8(const char* strAnsi) { //获取转换为宽字节后需要的缓冲区大小,创建宽字节缓冲区,936为简体中文GB2312代码页 , NULL, NULL ...

  3. WEB 服务应用 Nginx之安装篇

    一.Nginx 源码包安装与配置 1.环境准备 操作系统.内核版本: CentOS 6.8  2.6.32-642.el6.x86_64 Nginx 软件版本: nginx-1.10.2 2.创建Ng ...

  4. 时序数据库influxDB存储数据grafana展示数据

    一.influxDB简介 InfluxDB是一款用Go语言编写的开源分布式时序.事件和指标数据库,无需外部依赖.该数据库现在主要用于存储涉及大量的时间戳数据,如DevOps监控数据,APP metri ...

  5. dedecms织梦移站后替换数据库中文件路径命令

    1.系统设置路径替换 update dede_sysconfig set value='http://afish.cnblogs.com' where varname='cfg_basehost'; ...

  6. java8学习之Collector源码分析与收集器核心

    之前已经对流在使用上已经进行了大量应用了,也就是说对于它的应用是比较熟悉了,但是比较欠缺的是对于它底层的实现还不太了解,所以接下来准备大量通过阅读官方的javadoc反过来加深对咱们已经掌握这些知识更 ...

  7. Java8使用lambda遍历List、Set、map

    public static void main(String[] args){ Map<String,String> map= new HashMap<>(); map.for ...

  8. 4.3 jmu-Java-03面向对象-06-继承覆盖综合练习-Person、Student、Employee、Company (20 分)中的一些问题

    1.Employee类的equals 由于题目要求//首先调用父类的equals方法,如果返回true.再比较company与salary.//比较salary属性时,使用DecimalFormat ...

  9. redis的数据类型和基本操作

    Redis 的Key Redis 的 key 是字符串类型,但是 key 中不能包括边界字符,由于 key 不是 binary safe的字符串,所以像"my key"和" ...

  10. oozie 启动过程中--- Existing PID file found during start. Removing/clearing stale PID file.

    如果oozie使用kill -9 暴力杀死了tomcat,再启动的时候,会出问题,需要删除tomcat的pid文件 彻底停止oozie的tomcat的进程,然后删除pid文件 rm -rf  /exp ...