Python 数字

简述

在 Python 中,对于数字的定义很简单 - 整数、浮点数和复数,分别被定义为 int、float 和 complex 类。只要数学不是体育老师教的,绝大部分人学起来都不会有任何问题。

对于数字而言,除了进行基本的运算(例如:算术运算、比较运算)之外,Python 还提供了类型间的相互转换功能,以及其他的高级操作。

  • 简述
  • 数字类型
  • 整数溢出
  • 数字系统
  • 类型转换
  • Decimal
  • fractions有理数
  • math数学函数
  • random生成伪随机数

版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820

数字类型

在 Python 中,支持三种不同的数字类型:

  • int(整型):也被称为整数,是正或负整数,不带小数点。
  • float(浮点型):由整数部分与小数部分组成,浮点型也可以使用科学计数法表示。
  • complex(复数):以 x + yj 的形式构成,其中 x 是实部,y 是虚部。

注意: Py3.x 去除了 long 类型,现在只有一种整型 - int,表示为长整型。

>>> type(5)  # 整型
<class 'int'>
>>>
>>> type(2.5)  # 浮点型
<class 'float'>
>>>
>>> c = 2.5 + 5.0j  # 复数
>>> type(c)
<class 'complex'>

整数溢出?

天文数字:形容非常大的数字,已经无法用一个确切的数来形容。

对于很多编程语言来说,天文数字是需要被正视的,因为往往会引发整数溢出问题。但是,在 Python 中无需忧虑,因为它支持“无限精度”的整数。

来感受一下:

>>> i = 2 ** 500  # 2 的 500 次幂
>>> i
3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376

哇,多么幸运,Python 做出了如此精妙的安排。。。

虽然整数可以是任意长度,但是浮点数只能精确到 15 位小数(16 位不准确)。

>>> f = 0.12345678901234567890  # 值被截断
>>> f
0.12345678901234568

注意: f 的值被截断。

数字系统

对于绝大部分人来说,每天处理的数字都是十进制(以 10 为基数)数字系统。但是程序员(尤其是搞嵌入式的),往往需要使用二进制(以 2 为基数)、八进制(以 8 为基数)和十六进制(以 16 为基数)数字系统。

在 Python 中,可以在数字前面放置相应的前缀来表示这些数字。

数字系统 前缀
十进制(Decimal)
二进制(Binary) ‘0b’ 或者 ‘0B’
八进制(Octal) ‘0o’ 或者 ‘0O’
十六进制(Hexadecimal) ‘0x’ 或者 ‘0X’

来看一些示例:

>>> 5  # 十进制
5
>>>
>>> 0b1010  # 二进制
10
>>>
>>> 0o15  # 八进制
13
>>>
>>> 0xFB  # 十六进制
251

十进制还可以转换为二进制、八进制、十六进制:

>>> dec = 20  # 十进制
>>>
>>> bin(dec)  # 十进制转二进制
'0b10100'
>>>
>>> oct(dec)  # 十进制转八进制
'0o24'
>>>
>>> hex(dec)  # 十进制转十六进制
'0x14'

类型转换

一般情况下,数据的类型的转换通常是由编译系统自动进行的,不需要人工干预,所以被称为隐式类型转换。但如果程序要求一定要将某一类型的数据转换为另外一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显式类型转换

在进行数字运算(例如:加法、减法)时,如果其中的一个操作数是浮点数,则会将整数隐式(自动)转换为浮点数。

>>> 2 + 3.0
5.0

可以看到,2(整数)被转换为 2.0(浮点数),计算结果(5.0)也是一个浮点数。

除此之外,还可以使用 int()、float() 和 complex() 等内置函数来显式转换类型,这些函数甚至可以将字符串转换为数字。

>>> int(2.3)
2
>>> int(-2.8)
-2
>>> float(5)
5.0
>>> complex('3+5j')
(3+5j)

从 float 转换为 int 时,数字将被截断(整数更接近零)。

Decimal

通常,在使用内置类 float 时,会执行一些“匪夷所思”的计算。

我们知道 1/3 等于 0.333…(无限循环),0.1 + 0.2 等于 0.3,但 Python 似乎不这么认为。

>>> 1/3
0.3333333333333333
>>>
>>> 0.1 + 0.2
0.30000000000000004

What?难道是眼花了?和数学知识不一样?(一脸懵逼。。。)

事实证明,浮点数在计算机硬件中以二进制小数来表示,因为计算机只能理解二进制(0 和 1)。出于这个原因,大部分十进制小数都不能准确地存储在计算机中。

例如,十进制小数 0.1,将转换为无限长的二进制小数 0.000110011001100110011…,而计算机存储的位数是有限的。也就是说,转换为二进制后,只会接近十进制的 0.1,但永远不会相等。

因此,这是计算机硬件的局限性,而不是 Python 中的错误。

为了克服这个问题,可以使用 Python 自带的 decimal 模块。虽然浮点数的精度最高可达 15 位,但 decimal 模块可自定义精度。

>>> import decimal
>>>
>>> 0.1
0.1
>>>
>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
>>>
>>> decimal.getcontext()  # 当前上下文
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[Inexact, FloatOperation, Rounded], traps=[InvalidOperation, DivisionByZero, Overflow])
>>>
>>> decimal.getcontext().prec  # 精度默认 28 位
28
>>>
>>> d = decimal.Decimal(1) / decimal.Decimal(9)
>>> d
Decimal('0.1111111111111111111111111111')
>>>
>>> decimal.getcontext().prec = 3  # 将精度修改为 3 位
>>>
>>> d = decimal.Decimal(1) / decimal.Decimal(9)
>>> d
Decimal('0.111')

除此之外,它也保留了重要意义。我们知道 25.50 比 25.5 更精确,因为 25.50 有两个有效的小数位。

>>> from decimal import Decimal as D
>>>
>>> D('0.1') + D('0.2')
Decimal('0.3')
>>>
>>> D('1.2') * D('2.50')
Decimal('3.000')

注意: 计算结果末尾的 0

有人可能会问:既然 Decimal 这么棒,为什么每次不使用 Decimal 来代替 float 呢?主要原因是效率,float 运算要比 Decimal 运算更快。

何时使用 Decimal,而不是 float 呢?在以下情况下,通常使用 Decimal。

  • 当在做金融应用时,需要精确表示。
  • 当想要控制所需的精度级别时
  • 当想要实现有效的小数位概念时
  • 当我们想要像在学校里学到的那样进行小数运算时

fractions(有理数)

fractions 模块提供了涉及分数的操作,该模块支持有理数运算。

一个 Fraction 实例可以由一对整数、另一个有理数、或者一个字符串来构造。

>>> import fractions
>>>
>>> fractions.Fraction(1.5)
Fraction(3, 2)
>>>
>>> fractions.Fraction(10)
Fraction(10, 1)
>>>
>>> fractions.Fraction(3, 5)
Fraction(3, 5)
>>>
>>> print(fractions.Fraction(1.5))
3/2

当从 float 创建 Fraction 时,可能会得到一些不寻常的结果,这是由于之前讨论的不完美的二进制浮点数造成的。

幸运的是,fraction 也允许用字符串进行实例化,这是使用十进制数时的首选方案。

>>> from fractions import Fraction
>>>
>>> print(Fraction(1.1))  # 浮点数 1.1
2476979795053773/2251799813685248
>>>
>>> print(Fraction('1.1'))  # 字符串 '1.1'
11/10

此外,该数据类型也支持所有基本操作。

>>> from fractions import Fraction as F
>>>
>>> F(1,3) + F(1,3)
Fraction(2, 3)
>>>
>>> 1 / F(2,3)
Fraction(3, 2)
>>>
>>> F(-2,5) < 0
True

math(数学函数)

math 模块用于处理数学相关的运算,例如:三角学、对数等。

>>> import math
>>>
>>> math.pi  # 圆周率 π
3.141592653589793
>>>
>>> math.e  # 自然常数
2.718281828459045
>>>
>>> math.cos(math.pi)  # 余弦
-1.0
>>>
>>> math.log10(100)  # 以 10 为基数的 100 的对数
2.0
>>>
>>> math.pow(2, 5)  # 2**5(2 的 5 次方) 运算后的值
32.0
>>>
>>> math.sqrt(9)  # 9 的平方根
3.0
>>>
>>> math.factorial(5)  # 5!(5 的阶乘)
120

random(生成伪随机数)

random 模块用于生成伪随机数。随机数可用于数学、游戏、安全等领域,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。

>>> import random
>>>
>>> l = ['p', 'y', 't', 'h', 'o', 'n']
>>>
>>> random.choice(l)  # 从序列 l 中随机挑选一个元素
'y'
>>>
>>> random.shuffle(l)  # 将序列 l 的所有元素随机排序
>>> l
['t', 'y', 'h', 'p', 'n', 'o']
>>>
>>> random.randrange(0, 10)  # 从指定范围内,按指定基数(缺省值为 1)递增的集合中获取一个随机数
3
>>>
>>> random.random()  # 随机生成一个实数,范围 [0,1)。
0.09207929369477685

上述是数字相关的各模块的一些常见应用,完整的功能列表不再赘述,请参考 Python 文档。

时间: 2024-10-10 14:00:47

Python 数字的相关文章

python数字排序练习

题目很简单,要求: 2 9 5 7 6 1 4 8 3 5 4 2 求每行的最大值 最近刚好在学习python,感觉py也可以做出来. #!/usr/bin/env python # -*- condig:utf-8 -*- alist = [2,9,5,7] print sorted(alist,reverse=True)[0] blist = [6,1,4,8] print sorted(blist,reverse=True)[0] clist = [3,5,4,2] print sorte

Python回顾与整理3:数字

0.说明               数字用的次数是否多主要是看需求,如果是做自动化运维平台开发,比如做一个自动监控的系统,那么你肯定需要收集一定量的数据,然后再对这些数据做一定的处理,那么这时候,你就一定需要用得上数字的.当然,我这里所说的要不要用数字,指的是,你是否需要对你的数据做一定的处理. 1.数字简介         数字是不可更改类型,也就是说变更数字的值会生成新的对象. (1)创建数值对象并用其赋值(数字对象) 1 2 >>>anInt = 1 >>>aC

python变量不能以数字打头详解_python

在编写python函数时,无意中发现一个问题:python中的变量不能以数字打头,以下函数中定义了一个变量3_num_varchar,执行时报错. 函数如下: def database_feild_varchar_trans(in_feild): ''' transfer the feild if varchar then 3times lang else no transfer ''' feild_split = in_feild.split(' ') is_varchar = feild_s

Python 快速入门

学习 Python 的由来 第一次接触 Python 时,是在刚毕业不久,那时公司需要做一个网盘客户端,需要调研一些 GUI 框架.由于当时 Python 很火(当然,现在也一样),便尝试了一下 PyQt(Python 语言和 Qt 库的融合),后面的事情就不再多说了...我变成了一个 Qter. 很长时间里,我对 Python 的认知停留在"Life is short, You need Python "上,就像"PHP 是世界上最好的语言"一样.直到去年的一次&

python基础教程之基本内置数据类型介绍_python

Python基本内置数据类型有哪些 一些基本数据类型,比如:整型(数字).字符串.元组.列表.字典和布尔类型.随着学习进度的加深,大家还会接触到更多更有趣的数据类型,python初学者入门时先了解这几种类型就可以了. 基本内置数据类型对应符号 1)整型--int--数字python有5种数字类型,最常见的就是整型int.例如:1234.-12342)布尔型--bool--用符号==表示布尔型是一种比较特殊的python数字类型,它只有True和False两种值,它主要用来比较和判断,所得结果叫做

python实现将英文单词表示的数字转换成阿拉伯数字的方法

  本文实例讲述了python实现将英文单词表示的数字转换成阿拉伯数字的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

Python实现把数字转换成中文

  这篇文章主要介绍了Python实现把数字转换成中文,一般用于数字金额转中文大写金额,即将阿拉伯数字转换为大写的中文,需要的朋友可以参考下 周末在家,写了个小程序,用于将阿拉伯数字转换化大写中文.程序没经过任何优化,出没经过详细的测试,挂到网上,方便将来有需要的时候直接拿来用. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

python处理大数字的方法

  本文实例讲述了python处理大数字的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 def getFactorial(n): """returns the factorial of n""" if n == 0: return 1 else: k = n * getFactorial(n-1) return k for k in range(1, 70): print "factorial

Python基础(10)--数字

本文的主题是 Python 中的数字.会详细介绍每一种数字类型,它们适用的各种运算符, 以及用于处理数字的内建函数.在文章的末尾, 简单介绍了几个标准库中用于处理数字的模块. 本文地址:http://www.cnblogs.com/archimedes/p/python-number.html,转载请注明源地址. 数字类型 数字提供了标量贮存和直接访问.它是不可更改类型,也就是说变更数字的值会生成新的对象.当然,这个过程无论对程序员还是对用户都是透明的,并不会影响软件的开发方式. Python