zoukankan      html  css  js  c++  java
  • 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却是相等的。

    算术运算符

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

    **注:**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
    
    Round a number to a given precision in decimal digits (default 0 digits).
    This 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)
    
    Return the tuple ((x-x%y)/y, x%y).  Invariant: div*y + mod == x.'

    例子:

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

    比较运算符

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

    位移运算符

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

    OperatorDescription
    << 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
    OperatorDescription
    += 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++自增语言。但是使用自变运算符,的确可以有效的减少代码量和使程序更加简洁。

    位运算符

    OperatorDescription
    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(负数的原码为补码减一再按位取反,首个数字代表符号不可以改变)
    所以,从数字计算的底层实现可以看出。位移运算符是计算效率非常高的一种计算方法,尤其可以避免类似执行乘法时,所带来的非常繁复的操作和实现过程。

    逻辑运算符

    OperatorDescription
    and 逻辑与
    or 逻辑或
    not 逻辑非

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

    成员关系运算符

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

    OperatorDescription
    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真值表

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

    最后

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

    Jmilk

    相关阅读:

  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13311080.html
Copyright © 2011-2022 走看看