Python数字类型及其操作

数字类型

Python 语言提供了3种数字类型:整数、浮点数和复数。

布尔型 In addition, Booleans are a subtype of integers.

整数类型(int)与数学中整数概念一致,共有4种进制表示:十进制,二进制,八进制和十六进制。默认情况,整数采用十进制,其它进制需要增加相应的引导符号,如表所示。

进制种类 引导符号 描述
十进制 默认情况
二进制 0b 或 0B 由字符0和1组成
八进制 0o 或 0O 由字符0到7组成
十六进制 0x 或 0X 由字符0到9、a到f、A到F组成,不区分大小写

整数类型的取值范围在理论上没有限制,实际上受限制于运行Python程序的计算机内存大小。

Integers have unlimited precision.

浮点数类型(float)表示有小数点的数值。浮点数有两种表示方法:小数表示和科学计数法表示。

Python浮点数的取值范围和小数精度受不同计算机系统的限制,sys.float_info详细列出了Python解释器所运行系统的浮点数各项参数,例如:

>>> import sys
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
>>> sys.float_info.max
1.7976931348623157e+308

以下表格来自Python官网的Documentation

Attribute Explanation
epsilon difference between 1 and the least value greater than 1 that is representable as a float
dig maximum number of decimal digits that can be faithfully represented in a float
mant_dig float precision: the number of base-radix digits in the significand of a float
max maximum representable finite float
max_exp maximum integer e such that radix**(e-1) is a representable finite float
max_10_exp maximum integer e such that 10**e is in the range of representable finite floats
min minimum positive normalized float
min_exp minimum integer e such that radix**(e-1) is a normalized float
min_10_exp minimum integer e such that 10**e is a normalized float
radix radix of exponent representation
rounds integer constant representing the rounding mode used for arithmetic operations.

浮点数类型直接表示或科学计数法中的系数(E或e前面的数)最长可输出16个数字,浮点数运算结果中最长输出17个数字。然而根据sys.float_info.dig的值,计算机只能提供15个数字的准确性。浮点数在超过15位数字计算中产生的误差与计算机内部采用二进制运算有关。

复数类型(complex)表示数学中的复数。复数可以看作二元有序实数对(a, b),表示a + bj,其中,a是实数部分,b为虚数部分。在Python语言中,复数的虚数部分通过后缀 'J' 或 'j' 来表示。

复数类型中的实数部分和虚数部分的数值都是浮点类型。对于复数z,可以用z.real和z.imag分别获得它的实部和虚部。

顺便提一下布尔型(bool),关键字True和False分别表示真和假,他们的值是1和0,还可和数字相加。

可以用内置函数type()来查询变量所指的对象类型,例如:

>>> 1+True-False
2
>>> a, b, c, d = 20, 5.5, True, 4+3j
>>> print(type(a), type(b), type(c), type(d))
<class 'int'> <class 'float'> <class 'bool'> <class 'complex'>

数字类型的操作

数值运算操作符

Python提供了9个基本的数值运算操作符。这些操作符不需要引用标准或者第三方函数库,也叫内置操作符。

Operation Result Notes
x + y sum of x and y
x - y difference of x and y
x * y product of x and y
x / y quotient of x and y
x // y floored quotient of x and y (1)
x % y remainder of x / y (2)
-x x negated
+x x unchanged
x ** y x to the power y (3)

注意:

  1. 不对复数运算。整数商,即不大于x与y之商的最大整数。1//2结果为0,-1//2 的结果为-1。
  2. 不对复数运算。恒等式 x % y = x - (x // y) * y
  3. Python 规定 0**0 的值为1,这也是编程语言的通用做法。

三种数字类型之间存在一种扩展关系:int -> float -> complex。不同数字类型之间的运算所生成的结果是更宽的类型。

表中所有的二元数学操作符(+-*///%**)都有与之对应的增强赋值操作符(+=-=*=/=//=%=**=)。即x op= y 等价于 x = x op yop 为二元数学操作符。

数值运算函数

内置的数值运算函数,如下表:

函数 描述 注意
abs(x) absolute value or magnitude of x (1)
divmid(x, y) the pair (x // y, x % y)
pow(x,y [,z]) Return x to the power y; if z is present, return x to the power y, modulo z (computed more efficiently than pow(x, y) % z)
round(x [,ndigits]) x rounded to n digits, rounding half to even. If n is omitted, it defaults to 0 (2)
max(x1,x2...,xn) smallest item of x1, x2, ... xn (3)
min(x1,x2,...xn) largest item of x1, x2, ... xn (3)

注意:

  1. abs(x) 可以计算复数x的模。
  2. round(1.5) 的值为2,round(2.5) 的值也是2。
  3. max()min() 实际上是 Common Sequence Operations。

数字类型转换函

The constructors int(), float(), and complex() can be used to produce numbers of a specific type.

内置的数字类型转换函数可以将某种类型(数字类型或者字符串)转换为数字类型,如下表:

函数 描述 注意
int(x) x converted to integer (1)
float(x) x converted to floating point (2)
complex(re, [im]) a complex number with real part re, imaginary part im. im defaults to zero.

注意:

  1. 小数部分被直接舍去;see functions math.floor() and math.ceil() for well-defined conversions.
  2. float also accepts the strings “nan” and “inf” with an optional prefix “+” or “-” for Not a Number (NaN) and positive or negative infinity.
>>> int(10.9898)
10
>>> int('10.9898') # 解释器抛出 ValueError,并给出基本描述
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '10.9898'
>>> int('10')
10
>>> float('10.8989')
10.8989
>>> complex('10.8989')
(10.8989+0j)
>>> float(10+0j) # 解释器抛出 TypeError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float
>>> float('+nan') # 见 注意2
nan
>>> float('-inf') # 见 注意2
-inf

其他函数

  • float.as_integer_ratio()

Return a pair of integers whose ratio is exactly equal to the original float and with a positive denominator. Raises OverflowError on infinities and a ValueError on NaNs.

  • float.is_integer()

Return True if the float instance is finite with integral value, and False otherwise:

>>> 3.1416926.as_integer_ratio()
(3537231405668161, 1125899906842624)
>>> _[0]/_[1]
3.1416926
>>> 3.000.is_integer()
True

math库 数学函数

math库是Python提供的内置数学类函数库,不支持复数运算。math库中的函数不能直接使用,需要使用import引用该库,引用的方法有两种:

  1. import math。以math.函数名()形式调用函数。(建议,不会覆盖内置函数)
  2. from math import 函数名1 [,函数名2,...]。直接以函数名()的方式调用。特殊地,from math import *,math库的所有函数都可以直接使用。

实际上,所有的函数库的应用都可以自由选择这两种方式。

除了明确的说明,这些函数的返回值为浮点数。

数论和表示函数
函数 描述 注意
math.ceil(x) The smallest integer reater than or equal to x (1)
math.copysign(x, y) Return a float with the absolute value of x but the sign of y
math.fabs(x) Return the absolute value of x.
math.factorial(x) Return x factorial (3)
math.floor(x) the largest integer less than or equal to x (1)
math.fmod(x, y) 返回x与y的模 (4)
math.frexp(x)
math.fsum(iterable) Return an accurate floating point sum of values in the iterable
math.gcd(a, b) Return the greatest common divisor of the integers a and b. (1)(3)
math.isclose(a, b) Return True if the values a and b are close to each other and False otherwise. (2)
math.isfinite(x) Return True if x is neither an infinity nor a NaN, and False otherwise. (2)
math.isinf(x) Return True if x is a positive or negative infinity, and False otherwise. (2)
math.isnan(x) Return True if x is a NaN (not a number), and False otherwise. (2)
math.ldexp(x, i)
math.modf(x) Return the fractional and integer parts of x.
math.remainder(x,y)
math.trunc(x) Return the Real value x truncated to an Integral (1)

注意

  1. Return an integral value.

  2. Retrun True or False.

  3. Only accept parameter(s) of integral value.

    • math.factorial(x) raises ValueError if x in not integral or negative.
    • math.gcd(a,b) raises TypeError if either a or b is not integral.
  4. Note that the x % y may not return the same result with math.fmod(x,y).

  • fmod(x, y) is exactly (mathematically; to infinite precision) equal to x - n*y for some integer n such that the result has the same sign as x and magnitude less than abs(y).
  • x % y returns a result with the sign of y instead, and may not be exactly computable for float arguments.
>>> math.fmod(-1234,3) # 结果的符号与x一致
-1.0
>>> -1234%3 # 结果的符号与y一致
2
>>> math.fmod(98765432112345679,2)   # fmod函数会把x转为float,float只有有限位的精度,此时结果出错。
0.0
>>> 98765432112345679%2  # 整数有无限的精度
1
>>> math.factorial(10.00000)   # x可以是具有整数值的浮点数。x.is_integer()返回True。
3628800
>>> math.modf(-123.456)  # 返回的整数部分是以浮点数的形式写的
(-0.45600000000000307, -123.0)
>>> sum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]) 
0.9999999999999999
>>> math.fsum([.1, .1, .1, .1, .1, .1, .1, .1, .1, .1]) #针对浮点数float的sum,所以叫fsum。
1.0
幂函数和对数函数
函数 描述 注意
math.exp(x) e^{x}
math.expm1(x) e^{x}-1 more accurate than math.exp(x) - 1 for x near zero
math.log(x[, base]) {\log_{base}}^{x}
math.log1p(x) \ln (1+x) more accurate than math.log(1+x) for x near zero
math.log2(x) {\log_{2}}^{x} more accurate than math.log(x, 2)
math.log10(x) {\log_{10}}^{x} more accurate than math.log(x, 10)
math.pow(x, y) x^{y} 1
math.sqrt(x) \sqrt {x}

注意:

  1. Unlike the built-in ** operator, math.pow() converts both its arguments to type float. Use ** or the built-in pow() function for computing exact integer powers.
三角函数

与角度有关的量均为弧度。

函数 描述 返回值 注意
math.acos(x) \arccos (x) [0 , \pi]
math.asin(x) \arcsin (x) [-{\pi}/2, + {\pi}/2]
math.atan(x) \arctan (x) [-{\pi}/2, + {\pi}/2]
math.atan2(y,x) \arctan ({y}/{x}) or \arctan (y /x) \pm \pi [-{\pi}, + {\pi}] 1
math.cos(x) \cos (x) [-1 ,1]
math.hypot(x, y) \sqrt {x^{2} + y^{2}} [0,+\infty]
math.sin(x) \sin (x) [-1,1]
math.tan(x) \tan (x) [-\infty, +\infty]

注意:

  1. Return atan(y / x), in radians. The result is between -pi and pi. The vector in the plane from the origin to point (x, y) makes this angle with the positive X axis. The point of atan2() is that the signs of both inputs are known to it, so it can compute the correct quadrant for the angle.
>>> math.atan(-1)
-0.7853981633974483
>>> math.atan2(-1,1)
-0.7853981633974483
>>> math.atan2(1,-1)
2.356194490192345
角度转换函数
函数 描述
math.degrees(x) Convert angle x from radians to degrees.
math.radians(x) Convert angle x from degrees to radians.
双曲函数
函数 描述
math.acosh(x) {\rm arccosh} (x) = \ln (x+\sqrt {x^{2}-1})
math.asinh(x) {\rm arcsinh} (x) = \ln (x+\sqrt {x^{2}+1})
math.atanh(x) {\rm arctanh} (x) = \frac {1} {2} \ln{\frac {1+x} {1-x}}
math.cosh(x) \cosh (x) = \frac{e^{x} + e^{-x}} {2}
math.sinh(x) \sinh (x) = \frac{e^{x} - e^{-x}} {2}
math.tanh(x) \tanh (x) = \frac{e^{x} - e^{-x}} {e^{x} + e^{-x}}
特殊函数
函数 描述
math.erf(x) \frac {2} {\sqrt {\pi}} \int _{0}^{x} e^{ -t ^{2}} dt 高斯误差函数
math.erfc(x) \frac {2} {\sqrt {\pi}} \int _{x}^{+\infty} e^{ -t ^{2}} dt 余补高斯误差函数
math.gamma(x) \int _{0} ^{+\infty} t^{x-1} e^{-t} dt Gamma函数
math.lgamma(x) \ln (\int _{0} ^{+\infty} t^{x-1} e^{-t} dt) Gamma函数的自然对数

Gamma函数的性质:

  1. \Gamma (x+1) = x \Gamma (x)
  2. x为整数时,\Gamma (n+1) = n!
  3. \Gamma (\frac {1} {2}) = \sqrt {\pi}
>>> math.factorial(10)
3628800
>>> math.gamma(11)
3628800.0
数学常数
常数 数学表示 描述 注意
math.pi \pi 圆周率
math.e e 自然常数
math.tau \tau =2 \pi 圆周率的两倍
math.inf + \infty A floating-point positive infinity 1
math.nan A floating-point “not a number” (NaN) value. 2

注意:

  1. Equivalent to the output of float('inf'). For negative infinity, use -math.inf.
  2. Equivalent to the output of float('nan').
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容