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,例如:
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 |
最后
运算符在程序中一直都充当着非常重要的角色,可能是编程的过程中并不会完全用的上,但是建立一个由自己编写起来的运算符文档,在往后的程序编写中会变得非常的方便。
python学习笔记之运算符的更多相关文章
- Python学习笔记之运算符之一
算数运算符 +加法运算符 -减法运算符 *乘法运算符 /除法运算符 //整除运算符 **乘积运算符(幂运算符) %取模运算符(取余) #!/usr/bin/python # -*- coding: U ...
- Python学习笔记----数据类型 运算符 循环 条件判断
1. Python安装 在官网www.python.org下载安装程序,可以支持的操作系统linux,windows,mac. Python版本:2.x和3.x,分别有x86和x64. 在Window ...
- Python学习笔记:运算符
逻辑运算符: + 加 - 减 * 乘 / 除 % 取模-返回除法的余数 ** 幂-返回x的y次方 // 整除 比较运算符: == 等于-比较对象是否相等 != ...
- Python 学习笔记 - 不断更新!
Python 学习笔记 太久不写python,已经忘记以前学习的时候遇到了那些坑坑洼洼的地方了,开个帖子来记录一下,以供日后查阅. 摘要:一些报错:为啥Python没有自增 ++ 和自减 --: 0x ...
- python学习笔记(一)、列表和元祖
该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.通用的序列操作 有几种操作适用于所有序列,包括索引.切片.相加.相乘和成员资格检查.另外,Pyt ...
- python学习笔记目录
人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...
- Deep learning with Python 学习笔记(1)
深度学习基础 Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据 ...
- 【目录】Python学习笔记
目录:Python学习笔记 目标:坚持每天学习,每周一篇博文 1. Python学习笔记 - day1 - 概述及安装 2.Python学习笔记 - day2 - PyCharm的基本使用 3.Pyt ...
- Python学习笔记 (2.1)标准数据类型之Number(数字)
Python3中,数字分为四种——int,float,bool,complex int(整型) 和数学上的整数表示没啥区别,没有大小限制(多棒啊,不用写整数高精了),可正可负.还可表示16进制,以 0 ...
随机推荐
- 【Netty】WebSocket
一.前言 前面学习了codec和ChannelHandler之间的关系,接着学习WebSocket. 二.WebSocket 2.1. WebSocket介绍 WebSocket协议允许客户端和服务器 ...
- 使用wamp扩展php时出现服务未启动的解决方法
今天在使用wamp扩展php的插件时,出现了如下图所示的错误提示 网上查了查,都说是端口原因,修改Apache的 80端口,但是并没有解决问题. 最后我终于找到了解决方法,步骤很简单,如下: 首先,在 ...
- Asp.Net Core写个共享磁盘文件Web查看器
本篇和大家分享的是一个磁盘文件查看系统,严格来说是使用NetCore写的一个Web系统应用,由于NetCore跨平台特性,我生成了exe的运行包,只需要配置运行电脑ip+端口,即可在浏览器中通过IP+ ...
- wpf XAML xaml 进行 数据绑定,Resource DataContext ElementName
先做个声明:这里绑定都在前台实现,至于后台怎么写,那比前台简单多了,但更常用的是xaml中绑定.我们分析下最简单的字符串绑定来弄清楚原理,其他的类推就是. 数据绑定主要是要弄清楚两个东西,一个是源So ...
- jquery表单序列化
$(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.json" ...
- angular路由最基本的实例---简单易懂
<!DOCTYPE html> <html lang="en" ng-app="myapp"> <head> <met ...
- POJ 1207 3N+1 Problem
更简单的水题,穷举法即可. 需要注意的点: 1.i 和 j的大小关系不确定,即有可能 i>j 2.即使i>j,最后输出的结果也要严格按照输出,亦即如果输入10,1,则对应输出也应为 10 ...
- js 动态 key value
问题描述: 如果var mykey = 'a'; 我们试图 a = {mykey: 'b'} 来达到 a = { 'a': 'b'}的效果,但是mykey直接被作为键值,无法达到要求 解决办法: a ...
- MongoDB--数据库管理
<strong>1.mongod 启动项注释(默认不能生成路径,需手动建立)</strong><br /><span style="white-sp ...
- 手把手教你从基础学习JQuery
JQuery JQuery 语法 1.jQuery("选择器").action();通过选择器调用事件函数 但jQuery中,jQuery可以用$代替,即$("选择器&q ...