美文网首页
[笔记] Python 核心编程 第五章

[笔记] Python 核心编程 第五章

作者: 四明羽客 | 来源:发表于2018-03-06 10:44 被阅读16次

    Python支持多种数字类型:整型,长整型,布尔型,双精度浮点型,十进制浮点型和复数

    Python的标准整型类型等价于C语言的有符号长整型。整型一般以十进制表示,但是Python也支持八进制和十六进制来表示整型。八进制整型数以数字‘0’开始,十六进制整型数以“0x”或者“0X”开始。

    Python中整型和长整型正在逐步统一为一种类型。
    Python2.2以前标准整型类型对象超出取值范围会溢出,但Python2.2开始就没有这种错误了;Python2.3还会有个警告,到了Python2.4彻底没有了警告,会将整型自动转为长整型。

    Python中的浮点类型类似C语言中的double类型,是双精度类型,可以用十进制或者科学计数法表示。类似这种:
    9.384e-23 等价于 9.384乘以10的负23次幂
    4.3e25 等价于 4.3乘以10的25次幂

    Python语言中关于复数的概念:

    • 虚数不能单独存在,它们总是和一个值为0.0的实数部分一起来构成一个复数
    • 复数由实数部分和虚数部分构成
    • 表示复数的语法:real+imagj
    • 实数部分和虚数部分都是浮点型
    • 虚数部分必须有后缀j或者J
    属性 描述
    num.real 该复数的实部
    num.imag 该复数的虚部
    num.conjugate() 返回该复数的共轭复数

    复数属性

    属性 描述
    num.real 该复数的实部
    num.imag 该复数的虚部
    num.conjugate() 返回该复数的共轭复数

    注:共轭复数,就是两个复数相加只剩实部的一对复数

    Python数字类型强制转换原则:

    • 如果有一个操作数是复数,另一个操作数被转为复数
    • 否则,如果有一个操作数是浮点型,另一个操作数被转为浮点型
    • 否则,如果有一个操作数是长整型,另一个操作数被转为长整型
    • 否则,两者必然都是普通的整型,无须类型转换
      数字类型之间的转换是自动进行的,无须程序员自己处理。

    数字类型都支持标准操作符(对象值比较操作符(>,<,==等),对象身份比较操作符(is, is not),逻辑操作符(and,or,not))

    算术操作符
    Python支持单目操作符正号(+)和负号(-);双目操作符+、-、*、/、%和**,分别表示加法,减法,乘法,除法,取余和幂运算。从Python2.2起,还增加了一种新的整除操作符//

    Python的除法规则:传统除法,真正的除法,地板除
    传统除法:如果是整型,传统除法会舍去小数部分,返回一个整型(也叫地板除)。如果操作数之一是浮点型,则执行真正的除法,Python默认的除法规则就是传统除法
    >>> 1 / 2
    0
    >>> 1.0 / 2.0
    0.5

    真正的除法:不管操作数是什么数字类型,返回的都是真实的商。现阶段可以通过from __future__ import division开启
    >>> from __future__ import division
    >>> 1 / 2
    0.5
    >>> 1.0 / 2.0
    0.5

    地板除:从Python2.2版本新增了//操作符,以执行地板除;地板除不管操作数为何种数字类型,总是舍去小数部分,返回数字序列中比真正的商小的最接近的数字。
    >>> 1 // 2
    0
    >>> 1.0 // 2.0
    0
    >>> -1 // 2
    -1

    操作符 2.1.x及更早的版本 2.2及更新版本(No import division) 2.2及更新版本(import of division)
    / 传统除 传统除 真正除
    // 地板除 地板除

    除法操作符的行为差异

    操作符 2.1.x及更早的版本 2.2及更新版本(No import division) 2.2及更新版本(import of division)
    / 传统除 传统除 真正除
    // 地板除 地板除

    浮点型取余公式:x - (math.floor(x/y) * y)
    复数型取余公式:x - (math.floor((x/y).real) * y)

    幂运算符和单目操作符之间的优先级关系比较特别:幂运算操作符比其左侧操作数的单目操作符优先级高,比其右侧的单目操作符的优先级低
    >>> 3 ** 2
    9
    >>> -3 ** 2 # ** 优先级高于左侧的 -
    -9
    >>> (-3) ** 2 # 加括号提高-的优先级
    9
    >>> 4.0 ** -1.0 # ** 优先级低于右侧的-
    0.25
    其实就是幂运算符的优先级高于单目操作符,只是单目操作符在右侧时必须先和数字结合才能进行幂运算,所以在右侧时单目操作符的优先级才会高于幂操作符

    Python 算术操作符总结 见P85

    Python的位操作只适用于整型,包括取反(~),按位与(&),或(|),异或(^),以及左移(<<)和右移(>>)
    Python这样处理位运算:

    • 负数会被当成正数的二进制补码处理
    • 左移和右移N位等同于无益出检查的2的N次幂运算:2**N
    • 对于长整型来说,位操作符使用一种经修改的二进制补码形式,使得符号位可以无限向左扩展。

    取反(~)运算的优先级与数字单目操作符相同,是所有位操作符中最高的。左移和右移运算的优先级次之,但低于加减法运算。与,或,异或运算的优先级最低。

    取反公式 ~x = -(x+1)
    左移公式 x << y = x * (2**y)
    右移公式 x >> y = x / (2**y)

    工厂函数 操作
    bool(obj) 返回obj对象的布尔值,也就是obj.__nonzero__()方法的返回值
    int(obj,base=10) 返回一个字符串或者数字对象的整型表示,base为可选的进制参数
    long(obj,base=10) 返回一个字符串或者数字对象的长整型表示,base为可选的进制参数
    float(obj) 返回一个字符串或者数字对象的浮点型表示
    complex(str) or complex(real, imag=0.0) 返回一个字符串的复数表示,或者根据给定的实数(以及一个可选的虚数部分)生成一个复数对象

    数值工厂函数

    工厂函数 操作
    bool(obj) 返回obj对象的布尔值,也就是obj.__nonzero__()方法的返回值
    int(obj,base=10) 返回一个字符串或者数字对象的整型表示,base为可选的进制参数
    long(obj,base=10) 返回一个字符串或者数字对象的长整型表示,base为可选的进制参数
    float(obj) 返回一个字符串或者数字对象的浮点型表示
    complex(str) or complex(real, imag=0.0) 返回一个字符串的复数表示,或者根据给定的实数(以及一个可选的虚数部分)生成一个复数对象

    Python还有5个内建函数用于数字运算:abs(),coerce(),divmod(),pow()和round()
    abs()返回给定参数的绝对值,如果参数是个复数,那么返回math.sqrt(num.real**2 + num.imag**2) 注 math.sqrt平方根

    coerce()用来做类型转换,返回一个包含类型转换完毕的两个数字元素的元组
    >>> coerce(1,2)
    (1,2)
    >>> coerce(1.3, 134L)
    (1.3, 134.0)
    >>> coerce(1j, 134L)
    (1j, (134+0j))
    转换规则和Python解释器一致

    divmod()内建函数把除法和取余运算结合起来,返回一个包含商和余数的元组。对于整型,它的返回值就是地板除和取余操作的结果。对于浮点型,返回的商部分是math.floor(num1/num2);对于复数,商部分是math.floor((num1/num2).real)

    pow()和幂操作符(**)的作用相同,不过pow()函数可以接受第三个参数用于和幂运算的结果进行取余运算(pow(x,y,z)),并且性能比pow(x,y) % z更好

    round()函数用于对浮点型进行四舍五入运算。它有一个可选的小数位数参数。如果不提供小数位参数,它返回与第一个参数最接近的整型(但仍然是浮点型)。第二个参数告诉round()函数将结果精确到小数点后指定位
    >>> round(3)
    3.0
    >>> round(3.45)
    3.0
    >>> round(3.49999999)
    3.0
    >>> round(3.49999999, 1)
    3.5

    int(), round(), math.floor()这三个函数的区别

    • int() 直接截去小数部分 (返回值为整型)
    • math.floor() 得到最接近原数但小于原数的整型 (返回值为浮点型)
    • round() 得到最接近原数的整型 (返回值为浮点型)
      详细的例子见P91
    函数 操作
    hex(num) 将数字转换成十六进制数并以字符串的形式返回
    oct(num) 将数字转换成八进制数并以字符串的形式返回
    chr(num) 将ASCII值的数值转换成ASCII字符,范围只能是0<=num<=255
    ord(char) 接受一个ASCII或Unicode字符(长度为1的字符串),返回相应的ASCII值或Unicode值
    unichr(num) 接受Unicode值,返回其对应的Unicode字符,所接受的码值范围依赖于你的Python是构建于UCS-2还是UCS-4

    仅适用于整型的内建函数

    函数 操作
    hex(num) 将数字转换成十六进制数并以字符串的形式返回
    oct(num) 将数字转换成八进制数并以字符串的形式返回
    chr(num) 将ASCII值的数值转换成ASCII字符,范围只能是0<=num<=255
    ord(char) 接受一个ASCII或Unicode字符(长度为1的字符串),返回相应的ASCII值或Unicode值
    unichr(num) 接受Unicode值,返回其对应的Unicode字符,所接受的码值范围依赖于你的Python是构建于UCS-2还是UCS-4
    函数 描述
    randint(a, b) 返回[a, b]之间的一个随机数
    randrange() 它接受和range()函数一样的参数,随机返回range([start,]stop[,step])结果中的一个
    uniform() 几乎和randint() 一样,不过它返回的是二者之间的一个浮点型(不包括上限)
    random() 类似uniform(),只不过下限恒定等于0.0, 上限恒定等于1.0
    choice() 随机返回给序列的一个元素

    当你的程序需要随机数功能时,random模块就能派上用场。该模块包含多个伪随机数发生器,它们均以当前的时间戳为随机种子。

    函数 描述
    randint(a, b) 返回[a, b]之间的一个随机数
    randrange() 它接受和range()函数一样的参数,随机返回range([start,]stop[,step])结果中的一个
    uniform() 几乎和randint() 一样,不过它返回的是二者之间的一个浮点型(不包括上限)
    random() 类似uniform(),只不过下限恒定等于0.0, 上限恒定等于1.0
    choice() 随机返回给序列的一个元素

    相关文章

      网友评论

          本文标题:[笔记] Python 核心编程 第五章

          本文链接:https://www.haomeiwen.com/subject/ijvqfftx.html