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

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 核心编程 第五章)